VBA声明date/时间数据

我得到了每小时的数据,当我尝试执行下面的代码时,我得到一个运行时错误91.我的数据在CYC工作表格式是例如#07/07/2009 23:00:00#(194行) ,但是当我input这个dt它会自动将其转换为#7/7/2009 11:00:00 PM#。 (请注意,shtCYC和shtCo已被宣布和设置)。

Dim dt As Date dt = #7/7/2009 11:00:00 PM# Do shtCYC.Activate 'finds the day Set rng = shtCYC.Range("A3:A1514").Find(dt, , xlValues) 'copies the dates shtCYC.Range("A" & rng.Row - 191 & ":A" & rng.Row + 24).Copy (this is where the debug highlights) shtCO.Range("B10").PasteSpecial Paste:=xlPasteValues 

任何人有任何想法..? 非常感谢!

那么这不是我所看到的唯一的问题。 请参阅下面的代码。

  1. 要finddate,您必须使用DateValue由于各种格式的原因。
  2. 您需要检查是否find一个值
  3. 您需要检查rng.Row落在特定范围内

我在评论中解释了它。 如果你还有问题,请告诉我。

 Sub Sample() Dim dt As Date Dim shtCYC As Worksheet Dim Rng As Range dt = #7/7/2009 11:00:00 PM# Set shtCYC = ActiveSheet '<~~ Change this to the relevant sheet With shtCYC Set Rng = .Range("A3:A1514").Find(what:=DateValue(dt), LookIn:=xlFormulas) '~~> Check If match found If Not Rng Is Nothing Then '~~> This Check is required because what if the rng.row is <=191 or >=1048552? '~~> I understand that you have mentioned the range as "A3:A1514" '~~> But tom if you use .Cells then? '~~> Rng.Row - 191 / Rng.Row + 24 will give you error in that case If Rng.Row > 191 Or Rng.Row < (.Rows.Count - 24) Then .Range("A" & Rng.Row - 191 & ":A" & Rng.Row + 24).Copy 'shtCO.Range("B10").PasteSpecial Paste:=xlPasteValues End If Else MsgBox "Match Not Found" End If End With End Sub 

在Excel 2013中testing。我的工作表看起来像这样。

在这里输入图像描述

通过使用工作表的MATCH函数,您可能会更成功地查找date时间。 当search包含时间的值时,我经常遇到Range.Find方法的问题。

 Dim dt As Date, rw As Variant Dim shtCYC As Worksheet, shtCO As Worksheet dt = #7/7/2009 11:00:00 PM# Debug.Print dt Set shtCYC = Worksheets("Sheet4") '<~~ set the source worksheet Set shtCO = Worksheets("Sheet5") '<~~ set the target worksheet With shtCYC 'finds the row containing the datetime value rw = Application.Match(CDbl(dt), .Columns(1), 0) If Not IsError(rw) Then 'dt was found, transfer the block of values If rw > 194 Then shtCO.Range("B10").Resize(216, 1) = _ .Cells(rw, 1).Resize(216, 1).Value Else Debug.Print rw & " not large enough to encompass all values." End If Else Debug.Print dt & " not found." End If End With 

请注意,这是使用直接值传输,而不是复制和粘贴。 因为它不涉及剪贴板,所以它是一种更有效的方法来传送xlPasteValues。