在Excel VBA中,Range.find无法正常工作。

3
我在Excel VBA中使用range.find方法遇到了问题。
我有两个工作表。 A工作表的格式如下(月份间隔不规则):
Dec-1997
Dec-1999
Dec-2000
Dec-2001
Dec-2002
Dec-2003
Dec-2004
Dec-2005
Dec-2006
Mar-2007
Dec-2007
Dec-2008
Dec-2009
Dec-2010
Dec-2011(a)
Dec-2013
Dec-2014

表格B有一个A列,其中日期以正常的季度间隔排列,如下所示。
Jun-2011
Sep-2011
Dec-2011
Mar-2012
Jun-2012
Sep-2012
Dec-2012
Mar-2013
Jun-2013
Sep-2013
Dec-2013
Mar-2014
Jun-2014
Sep-2014
Dec-2014

我希望我的 VBA 代码可以遍历 Sheet A 中的每个项目并找到在 Sheet B 中相应的行号。
以下是我的代码片段:
Sub sSearch(arr As Variant, j As Integer, rngSearch As Range, ws As Worksheet)
    Dim wsWrite As Worksheet
    Set wsWrite = ThisWorkbook.Sheets(1) ' Sheet B
    Dim rngResult As Range
    Dim intRows As Integer
    Dim rngRow As Range
    Dim strDate As String

    For i = 0 To UBound(arr)
        Set rngResult = rngSearch.Find(arr(i), LookIn:=xlValues)
        intRows = rngResult.End(xlDown).Row - rngResult.Row ' determine number of rows in Sheet A
        For k = 1 To intRows '
            strDate = Left(rngResult.Offset(k).Text, 9)
            set rngRow = wsWrite.Range("A:A").Find(What:=strDate, LookIn:=xlValues)
            wsWrite.Cells(intRow, i + j).Value = arr(i)
            wsWrite.Cells(intRow, i + j).Value = _
                ws.Cells( _
                rngResult.End(xlDown).Row, _
                rngResult.End(xlToRight).Column).Value
        Next
    Next

End Sub

我在下面这行代码遇到了一个错误。
set rngRow = wsWrite.Range("A:A").Find(What:=strDate, LookIn:=xlValues)

我尝试了我能想到的所有方法,包括查阅微软文档和在这里进行搜索,但都没有找到解决办法。 即使我可以看到存储在strDate中的值是该工作表A2单元格中的一个值,rngRow也没有返回任何东西。 如有帮助,不胜感激。谢谢!

你好,Chinwobble, 当找到一个值时,宏会执行什么操作? - XsiSecOfficial
不知道单元格的实际值很难修复。因为它可能是以自定义格式格式化的真实日期。 - Sixthsense
2个回答

3
这样做会更快吗:
```html

这样做会更快吗:

```
Function getRow(str As String, rng As Range) As Long
str = Left (str, 10)
getRow = Application.Match(str, rng, 0)
End Function

这将返回行,可以用于设置范围...

或者获取单元格作为引用:

Function getCell(str As String, rng As Range) As Range
str = Left (str, 10)
Set getCell = rng(1).Offset(Application.Match(str, rng, 0) - 1)
End Function

假设您使用1列来查看(适用于两种情况)

1
你需要将array(i)的值转换为日期格式 -> CDate(arr(i))。新的查找行应该是这样的:

Set rngRow = wsWrite.Range("A:B").Find(What:=CDate(arr(i)), LookIn:=xlFormulas)

如果没有CDate(arr(i)),你无法找到数据,你可以在Excel中手动测试,只有通过像"Dec-00"这样的搜索才能找到一些东西。

检查是否为日期或字符串:

If IsDate(Arr(i)) Then
value_to_lookup = CDate(Arr(i))
Else
value_to_lookup = Arr(i)
End If
Set rngRow = Range("A:b").Find(What:=value_to_lookup, LookIn:=xlFormulas)

但是单元格内的数据真的是日期吗?像 Dec-2011(a) 这样的内容告诉我这些值不是数字(只是字符串)。但仍然是一个好的假设... 我们可能需要从 @Chinwobble 那里获取更多信息。 - Dirk Reichel
我将他的数值复制并粘贴到了Excel文件中,它们是日期(自1900年以来的天数),而不是字符串值。 - Cornel
但你不知道他是否复制/粘贴了它。选择范围并将其设置为“文本”。然后再次粘贴它 ;) 仍然有疑问: “Dec-2011(a)”是多少? - Dirk Reichel
@Dirk Riehcel,数据以日期格式呈现。但是包含文本“Dec-2011(a)”的单元格是字符串(该单元格的文本和值属性为“Dec-2011(a)”)。 如何处理这种情况?我需要在VBA代码中将日期变量转换为字符串吗? - Chinwobble
如果测试值是日期,则进行转换,否则使用初始值(字符串)。请查看我的初始答案以获取新代码。 - Cornel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接