【问题标题】:Why there is an error occuring with find function (through other lists)为什么查找功能出现错误(通过其他列表)
【发布时间】:2019-07-01 14:38:14
【问题描述】:

我有一个程序应该从其他工作簿复制一些值,最初我将其设置为从特定销售中获取值。

现在我正在尝试实现搜索功能,而不是手动插入列数。

我正在尝试使用以下功能

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

对象未定义是最常见的错误,而且未找到值的文件处理也不起作用(未在上面的代码中显示)

【问题讨论】:

  • 您需要检查该值是否为空。如果它是 null 如果它有一个值则给出一个错误执行脚本。
  • 好吧,正如我已经说过的,它不知何故找不到值,即使它在那里:/。这就是我现在面临的主要问题
  • 您为什么要在 Rows(2) 中搜索?第二行是你想要的值吗?
  • 我不确定,但也许 Col = wb.Worksheets("Calculation").Rows(2).Column.Find("31.12.2018") 或 Col = wb.Worksheets("Calculation" ).Rows(2).Find("31.12.2018") 第二个有结果吗?
  • a) 在您的工作表中运行手动查找,看看它是否找到您的文本。如果确实如此,则说明您的代码有问题,否则您尝试查找的文本有问题。 b) 当使用.Find() 时,最好也明确定义.LookAt 参数,阅读此处了解更多信息:docs.microsoft.com/en-us/office/vba/api/excel.range.find

标签: excel vba


【解决方案1】:

假设我们正在处理 dates(而不是处理看起来像日期的 strings):您在工作表中看到的只是日期的表示(如该单元格的数字格式所定义)。无论您如何显示日期,它的内部值(双精度)始终相同。

当您不使用美国设置时,将Find-Function 用于日期是很棘手的。最好的办法是通过将搜索条件转换为日期来搜索日期的内部编号。请注意,我将您的 Find-command 拆分为两个语句:代码更具可读性并且更易于调试。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2020-04-07
    • 1970-01-01
    • 2014-11-30
    • 2018-12-10
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多