Почему происходит ошибка с функцией поиска (через другие списки) - PullRequest
0 голосов
/ 01 июля 2019

У меня есть программа, которая должна копировать некоторые значения из других рабочих книг, и изначально я настроил ее на получение значений от конкретной продажи.

Пока я пытаюсь реализовать функцию поиска, чтобы не вводить номер столбца вручную.

Я пытаюсь использовать следующие функции

Col = wb.Worksheets("Calculation").Rows(2).Find("31.12.2018").Column

Но хотя в файле есть определенное значение 31.12.2018, оно все равно не работает должным образом.

Кроме того, это как-то работало, пока я что-то не изменил и пока не могу найти ошибку. Также существует проблема: если скрипт не находит данные, он переходит к ошибке неопределимого объекта (кажется, что вы не можете назначить .column, когда информация не найдена).

strFilter = "Excel Files (*.xls;*.xlsb;*.xlsx),*.xls;*xlsb;*.xlsx"
strTitle = "Select input file (XXXX)"
arrfiles = Application.GetOpenFilename(strFilter, 2, strTitle, , True)
If VarType(arrfiles) = vbBoolean Then Exit Sub

Dim out As String
out = Cells(2, 7)
brow = Cells(2, 8)
bcol = Cells(2, 9)
Dim Target As Range
Dim Source As Range
Dim Col As Integer

For b = 1 To UBound(arrfiles)
Set wb = Workbooks.Open(Filename:=arrfiles(b), UpdateLinks:=False)

lLastRow = wb.Worksheets("Calculation").Cells(Rows.Count, 3).End(xlUp).Row 

ThisWorkbook.Worksheets(out).Cells(brow, 1) = wb.Worksheets("Template").Cells(3, 3) 
ThisWorkbook.Worksheets(out).Cells(brow, 2) = wb.Worksheets("Template").Cells(2, 3) 

lLastRow = wb.Worksheets("Calculation").Cells(Rows.Count, 3).End(xlUp).Row
lLastRowCol = ThisWorkbook.Worksheets("Build").Cells(Rows.Count,1).End(xlUp).Row

For k = 2 To lLastRowCol

  ThisWorkbook.Worksheets(out).Cells(brow, 1) = wb.Worksheets("Template").Cells(3, 3) 
  ThisWorkbook.Worksheets(out).Cells(brow, 2) = wb.Worksheets("Template").Cells(2, 3) 
  Col = wb.Worksheets("Calculation").Rows(2).Find("31.12.2018").Column

  ThisWorkbook.Worksheets(out).Cells(brow, 3) = wb.Worksheets("Calculation").Cells(2, Col)

  Set Target =ThisWorkbook.Worksheets(out).Range(ThisWorkbook.Worksheets(out).Cells(brow, 4), 

  ThisWorkbook.Worksheets(out).Cells(brow, 4 + lLastRow - 4))
  Set Source = wb.Worksheets("Calculation").Range(wb.Worksheets("Calculation").Cells(4, Col), wb.Worksheets("Calculation").Cells(lLastRow, Col))
  Source.Copy
  Target.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
  brow = brow + 1

Next k

Объект undefined является наиболее распространенной ошибкой, а также не работает файловая строка для не найденных значений (не представлена ​​в коде выше)

1 Ответ

1 голос
/ 01 июля 2019

Предполагая, что мы имеем дело с датами (а не с строками , которые выглядят как даты): то, что вы видите на своем листе, является просто представлением даты (как определено с числовым форматом этой ячейки). Независимо от того, как вы отображаете дату, ее внутреннее значение (двойное) всегда одинаково.

Сложно использовать функцию Find для дат, когда вы не используете настройки США. Лучше всего искать внутренний номер даты, преобразовав критерии поиска в дату. Обратите внимание, что я разделил вашу Find -команду на два оператора: код более читабелен и его гораздо легче отлаживать.

Dim searchFor As Date
searchFor = DateValue("16.05.2019")   ' Method 1
searchFor = DateSerial(2019, 5, 16)   ' Method 2

dim resultRange as range, col as long
set resultRange = wb.Worksheets("Calculation").Rows(2).Find(searchFor)
if not resultRange is nothing then
    col = resultRange.Column
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...