2016-09-22 110 views
3

我得到了每小時的數據,當我嘗試執行下面的代碼時,我得到一個運行時錯誤91.我的數據在CYC表格中的格式是例如#07/07/2009 23: 00:00#(第194行),但是當我輸入這個dt時,它會自動將它轉換爲#7/7/2009 11:00:00 PM#。 (請注意,shtCYC和shtCo已被聲明並設置)。VBA聲明日期/時間數據

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 

任何人有任何想法..? 許多非常感謝!

+0

那個時候什麼是'rng.row'?爲什麼不搜索'range(「A194:A1490」)',因爲你知道你會從找到的行中減去191? – Jeeped

+0

您需要測試以確保'rng'不是'Nothing'。你假設'.Find'實際上找到了一些東西。 – Comintern

+1

對於這個問題,爲什麼這個循環?你通過重複這個動作來嘗試什麼? – Jeeped

回答

4

那麼這不是我看到的唯一問題。請參閱下面的代碼。

  1. 要找到日期,你必須使用DateValue由於各種格式的原因。
  2. 你需要檢查是否找到值
  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中測試。我的工作表看起來像這樣。

enter image description here

+0

使用'使用shtCYC',兩個'shtCYC.Range(...)'可以縮寫爲'.Range(...)' – Jeeped

+0

True @ jeeped。我正在專注於另一段代碼:D做出了改變。再次感謝! –

+0

感謝大家的時間。我需要澄清的是,這只是代碼的一部分,這一點試圖實現的是在A列(7/7/2009 23:00:00)中找到日期和時間(這將是循環的,將在數據的其餘時間內(另外2個月)這樣做),複製包括第二天(24小時)和過去8天(8小時24小時)的範圍,然後轉到B欄並複製相同的範圍,然後複製等等,然後使用循環提前一天再做所有事情。 – Argyris

0

您可以通過使用獲得更大的成功定位的日期時間的工作表的MATCH function。搜索包含時間的值時,我經常遇到與Range.Find method有關的問題。

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更高效的方法。