2016-02-29 71 views
3

我在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

回答

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"搜索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)」多少錢? –

3

難道這樣的事情會更快:

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列一下(這兩種情況)