我写了一些VBA脚本来搜索列表中的一系列日期,它可以找到日期,但由于某种原因它无法将它们与目标范围匹配。我用vlookup测试了目标范围,它确实返回了匹配,但.find代码似乎没有以相同的方式工作。
例如,sourcecolumnvalue将选择其范围内的日期(例如01/02/2015)。 sourcecolumnvalue将反映这一点,但似乎无法在.find字符串中设置的目标范围内找到它。
我这个代码做错了吗?
Sub Finddates()
Dim SourceColumnValue As String, sourcerow As String, targetrow As String
Dim M As Long, O As Long, TargetValue As Long, actualsourcerow As Long, actualtargetrow As Long, actualtargetcolumn As Long, sourcedateposition As Long
TargetValue = dumpsheet.Cells(rows.Count, 1).End(xlUp).row
sourcedateposition = dumpsheet.Cells(rows.Count, 5).End(xlUp).row
'Loop Source Column
For F = 1 To sourcedateposition
SourceColumnValue = dumpsheet.Cells(F, 5).Value
'Get Target Column Match to Source
Set TargetColumnRange = dumpsheet.Range("G2:G" & TargetValue).Find(What:=SourceColumnValue, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows)
'if a match is found
If Not TargetColumnRange Is Nothing Then
TargetColumnRange.Value = SourceColumnValue
For O = 1 To dumpsheet.Range("A2:A" & rows.Count).End(xlUp).row
Sourcename = ActiveCell(O, 1).Value
sourcerow = ActiveCell(O, 2).Value
targetrow = ActiveCell(O, 3).Value
actualsourcerow = CInt(sourcerow)
actualtargetrow = CInt(targetrow)
actualtargetcolumn = CInt(TargetColumn)
CapexTargetSheet.Activate
Cells(actualtargetrow, actualtargetcolumn).Value = CapexSourceSheet.Cells(actualsourcerow, F).Value
Next O
End If
Next F
End Sub
答案 0 :(得分:2)
将FIND
与日期结合使用非常有用,请参阅here
当我更改
时,您的代码适用于我的测试Set TargetColumnRange = dumpsheet.Range("G2:G" & TargetValue).Find(what:=SourceColumnValue, _
LookIn:=xlFormulas, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows)
到
Set TargetColumnRange = dumpsheet.Range("G2:G" & TargetValue).Find(what:=DATEVALUE(SourceColumnValue), _
LookIn:=xlFormulas, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows)
答案 1 :(得分:1)
我设法使用循环编写一些代码,而不是使用.find,这恰好与日期非常不一致。我在另一篇文章中读到,使用字符串表示日期更好,因为日期的实际数值存储在字符串中。我将源和目标日期转换为字符串,然后使用循环进行匹配,效果很好。但是谢谢你的回答,它确实让我走上正轨!
见下文
Dim SourceColumnValue As String, sourcerow As String, targetrow As String, targetcolumnvalue As String, sourcecolumnnumber As String
Dim M As Long, O As Long, P As Long, TargetValue As Long, actualsourcerow As Long, actualtargetrow As Long, actualtargetcolumn As Long, sourcedateposition As Long, actualsourcecolumn As Long, targetdateposition As Long
Dim Copysource As Range, pastetarget As Range
TargetValue = dumpsheet.Cells(rows.Count, 1).End(xlUp).row
sourcedateposition = dumpsheet.Cells(rows.Count, 5).End(xlUp).row
targetdateposition = dumpsheet.Cells(rows.Count, 7).End(xlUp).row
'Loop Source Column
For F = 1 To sourcedateposition
SourceColumnValue = dumpsheet.Cells(F, 5).Value
'Get Target Column Match to Source
' Loop to compare strings
For P = 1 To targetdateposition
targetcolumnvalue = dumpsheet.Cells(P, 7).Value
If targetcolumnvalue = SourceColumnValue Then
TargetColumnRange.Value = SourceColumnValue
targetcolumnvalue = dumpsheet.Cells(P, 8).Value
sourcecolumnnumber = dumpsheet.Cells(F, 6).Value
For O = 1 To dumpsheet.Cells(rows.Count, "a").End(xlUp).row
If O > 1 Then
Sourcename = dumpsheet.Cells(O, 1).Value
sourcerow = dumpsheet.Cells(O, 2).Value
targetrow = dumpsheet.Cells(O, 3).Value
'Set Integers
actualsourcerow = CInt(sourcerow)
actualtargetrow = CInt(targetrow)
actualtargetcolumn = CInt(targetcolumnvalue)
actualsourcecolumn = CInt(sourcecolumnnumber)
'Copy and Paste
Set Copysource = SourceSheet.Cells(actualsourcerow, actualsourcecolumn)
Set pastetarget = TargetSheet.Cells(actualtargetrow, actualtargetcolumn)
Copysource.Copy
pastetarget.PasteSpecial (xlPasteValues)
End If
Next O
End If
Next P
Next F