Range.find与excel VBA不兼容

问题描述:

我在excel VBA中遇到了range.find方法问题。Range.find与excel VBA不兼容

我有两张床单。 表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代码的每个项目,在片A迭代,并查找表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) 

我试过了我能想到的一切,包括寻找thro呃微软文档,在这里搜索,但没有运气。 即使我可以看到存储在strDate中的值是该表的单元格A2中的值,rngRow仍然不返回任何内容。 任何帮助,将不胜感激。谢谢!

+0

嗨Chinwobble, 当一个值被发现时宏会做什么? –

+0

如果不知道单元的实际值,很难修复。因为它可能是格式化为自定义格式的真实日期。 – Sixthsense

你需要转换array(i)价值迄今 - >CDate(arr(i))。新发现行看起来是这样的:

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

没有CDate(arr(i))你无法找到数据,你可以在Excel中手动测试,只有像"Dec-00"搜索Excel找到东西

检查日期或字符串:

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) 
+0

但单元格内的数据真的是日期吗?有像'Dec-2011(a)'这样的东西告诉我这些值不是数字(只是字符串)。但仍然是一个很好的假设......我们可能需要更多关于@Chinwobble的信息 –

+0

那么我复制并粘贴他的值在一个excel文件中,它们是日期(1900年以来的天数直到今天)而不是字符串值 – Cornel

+0

但你不知道他是否复制/粘贴它。选择范围并将其设置为“文本”。然后再次粘贴;)仍然:“2011年12月(a)”多少钱? –

难道这样的事情会更快:

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 

Asuming使用1列一下(这两种情况)