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仍然不返回任何内容。 任何帮助,将不胜感激。谢谢!
你需要转换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)
但单元格内的数据真的是日期吗?有像'Dec-2011(a)'这样的东西告诉我这些值不是数字(只是字符串)。但仍然是一个很好的假设......我们可能需要更多关于@Chinwobble的信息 –
那么我复制并粘贴他的值在一个excel文件中,它们是日期(1900年以来的天数直到今天)而不是字符串值 – Cornel
但你不知道他是否复制/粘贴它。选择范围并将其设置为“文本”。然后再次粘贴;)仍然:“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列一下(这两种情况)
嗨Chinwobble, 当一个值被发现时宏会做什么? –
如果不知道单元的实际值,很难修复。因为它可能是格式化为自定义格式的真实日期。 – Sixthsense