简体   繁体   English

Excel VBA-无法.find日期字符串在范围内

[英]Excel VBA - cannot .find date string in range

I wrote some VBA script to search a range of dates in a list, it can find the dates, but for some reason it cannot match them to the target range. 我写了一些VBA脚本来搜索列表中的日期范围,它可以找到日期,但是由于某种原因,它无法将它们与目标范围匹配。 I tested the target range with a vlookup which does return a match, but the .find code doesn't seem to work in the same way. 我用vlookup测试了目标范围,它确实返回了匹配项,但是.find代码似乎无法以相同的方式工作。

For example, The sourcecolumnvalue will pick up a date in its range (say 01/02/2015). 例如,sourcecolumnvalue将选择其范围内的日期(例如2015年1月2日)。 The sourcecolumnvalue will reflect this but cannot seem to find this in the target range as set within the .find string. sourcecolumnvalue将反映此情况,但似乎无法在.find字符串中设置的目标范围内找到它。

Am I doing something wrong with this code? 我在此代码上做错了吗?

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

Using FIND with dates is finnicky, see here 使用带有日期的FIND有点困难,请参阅此处

Your code worked on my tested when I changed 当我更改时,您的代码在我的测试中可以正常工作

Set TargetColumnRange = dumpsheet.Range("G2:G" & TargetValue).Find(what:=SourceColumnValue, _
                                                           LookIn:=xlFormulas, _
                                                           LookAt:=xlWhole, _
                                                           SearchOrder:=xlByRows)

to

Set TargetColumnRange = dumpsheet.Range("G2:G" & TargetValue).Find(what:=DATEVALUE(SourceColumnValue), _
                                                           LookIn:=xlFormulas, _
                                                           LookAt:=xlWhole, _
                                                           SearchOrder:=xlByRows)

I managed to write some code using a loop rather than using the .find which happened to be very inconsistent with dates. 我设法使用循环而不是使用.find编写了一些代码,而恰好与日期不一致。 I read in another article that using strings for dates is better because the actual numerical value of the date gets stored in the string. 我在另一篇文章中读到,使用字符串作为日期更好,因为日期的实际数值存储在字符串中。 I converted the source and target dates to strings and then did a match using a loop which works well. 我将源日期和目标日期转换为字符串,然后使用效果很好的循环进行了匹配。 But thank you for your answer, it did put me on the right track! 但是,谢谢您的回答,它确实使我走上了正轨!

See below 见下文

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM