即使值存在,Find 也不会返回任何内容

问题描述 投票:0回答:3

所以这里我有关于find方法的第n个问题。我已经阅读了很多有关它的问题及其带来的问题,但仍然找不到解决我的问题的方法。

我只想返回特定值(日期)的行数和列数。但是,代码运行时始终出现相同的 91 错误(未设置对象变量),因为 find 方法未找到任何内容。

我尝试将变量定义为范围并通过设置变量(即设置 daterow = 等)来更改代码。但问题依然存在。

Sub actual_cash_flow()
Dim cfdate As Long
Dim today As Long
Dim daterow As Long
Dim datecolumn As Long

today = Date
cfdate = WorksheetFunction.EoMonth(today, -1)

daterow = Sheet2.Cells.Find(What:=cfdate, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, searchformat:=False).Row
datecolumn = Sheet2.Cells.Find(What:=cfdate).Column


End Sub

我想要行数和列数,以便识别单元格,然后执行一些操作。

编辑:

通过按照@mikku的建议编辑代码并调试代码中定义的值和变量的范围,我得到了相同的值,但是,我仍然没有得到任何输出。所以我真的不知道错误在哪里。看图片。

excel vba
3个回答
2
投票

正如我在回答上一个问题时指出的那样,使用日期和

Range.Find
函数可能很棘手。原因之一似乎是 VBA 日期数据类型与 Excel 工作表上存储的日期不同。后者是
Double
格式,看起来像日期。

因此,特别是如果您希望

.Find
方法独立于日期设置,您最好不要使用
Range.Find
方法,而是循环访问数据。

在下面的代码中,我展示了一个示例,说明其工作原理,根据您提供的工作簿进行假设,并使用 VBA 数组,因为这比循环工作表上的范围运行得快得多:

Sub actualcf()

Dim cfdate As Long  'Yes --Long for this application
Dim daterow As Long
Dim datecolumn As Long
Dim fnd As Range

Dim srchRng As Range
Dim vSrch As Variant
Dim I As Long

With Worksheets("Peschiera CF")

'Find the row with the dates
Set srchRng = .Cells.Find(what:="Yr. Ending", after:=.Cells(1, 1), LookIn:=xlValues)

'Read that row into a VBA array, but only the columns with data
'Note that we are using `.Value2` which has no formatting
If Not srchRng Is Nothing Then
    vSrch = .Range(.Cells(srchRng.Row, 1), .Cells(srchRng.Row, .Columns.Count).End(xlToLeft)).Value2
End If

cfdate = WorksheetFunction.EoMonth(Date, -1)
For I = 1 To UBound(vSrch, 2)
    If vSrch(1, I) = cfdate Then
        daterow = srchRng.Row
        datecolumn = I
    End If
Next I

End With
End Sub

0
投票

这段代码应该可以工作:

Sub actual_cash_flow()

Dim cfdate As Date
Dim daterow As Long
Dim datecolumn As Long
Dim fnd As Range

cfdate = WorksheetFunction.EoMonth(Date, -1)

Set fnd = Worksheets("SheetName").Cells.Find(What:=cfdate, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, searchformat:=False)

If Not fnd Is Nothing Then

    daterow = fnd.Row
    datecolumn = fnd.Column

End If

End Sub

在代码中输入您的工作表名称。

问题在于变量的设置,您应该在搜索日期时将它们声明为日期。


0
投票

我最近遇到了这个问题,在任何地方都找不到解决方案,既然我找到了解决方案,我只想分享此信息以帮助遇到同样问题的人。尽管该值存在,但 vba .find 不返回任何内容,只是因为单元格的宽度太小,以至于它们显示为 ### 而不是值。当我更改单元格的宽度以完全显示该值时,.Find 工作很棒。 (我的值是日期,也许这就是为什么 .Find 可能不起作用,以前从未在其他类型中遇到过此类错误)。

© www.soinside.com 2019 - 2024. All rights reserved.