Board logo

標題: 用vba語法比對日期 [打印本頁]

作者: imzues    時間: 2011-4-18 14:58     標題: 用vba語法比對日期

本帖最後由 imzues 於 2011-4-18 15:37 編輯

若是我的原始數據裡有 年 月 日 時間,但我只要match日期和時間,然後按match的日期匯入資料
像這種要match兩筆以上的條件,
那我要怎麼用vba寫那行的語法ㄚ???
作者: oobird    時間: 2011-4-19 08:56

這樣說無法讓人明白你的須求
可提供文件說明
作者: imzues    時間: 2011-4-20 07:33

不好意思....講的太模糊了
我已經幫檔附上來了,在麻煩講解一下~感謝
作者: chin15    時間: 2011-4-20 09:51

  1. Sub test()
  2.     Dim c%, r%, arr(1 To 6, 1 To 3), d As Range, a#, b#
  3.     [i4:k9] = ""
  4.     For c = 1 To 3
  5.         For r = 1 To 6
  6.             For Each d In [e4:e11]
  7.                 a = Cells(3, c + 8) + Left(Cells(r + 3, 8), 2) / 24
  8.                 b = a + 0.166667
  9.                 If d >= a And d < b Then
  10.                     arr(r, c) = arr(r, c) + d(1, 2)
  11.                 End If
  12.             Next
  13.         Next
  14.     Next
  15.     [i4].Resize(6, 3) = arr
  16. End Sub
複製代碼

作者: imzues    時間: 2011-4-20 10:55

感謝大大熱心的解答,小弟還有個問題
若是我[E4:E11]這8筆的資料是每天都會做變動,若有和先前匯過的日期相同時,
有辦法和匯過的那些數字做加總嗎?
作者: hugh0620    時間: 2011-4-20 14:25

回復 5# imzues

    這是小弟~ 自己寫的簡單處理方式
   因為不太熟練怎麼把日期值抓出來後還保留是日期的格式~ 所以多利用一些步驟來處理~
    小弟也不太會用array(陣列)的方式來寫~ 就用所寫的方式來處理~
    黑貓~ 黃貓~ 抓得到老鼠的就是好貓~  僅供您參考~ 應該很容易了解我在寫些什麼~
    1.處理"日期格式" (方便find在找相對應的日期位置)
    2.處理時間的位置  (因為是固定的位置,所以用if判斷該筆資料是落在哪一列的位置)
    3.尋找正確的位置,帶入值  (依k對應到的位置後,向下(列)移動d-3,帶入值,外加一個if先行判段是不是有值,若有值就累加)

Sub xx()

Do Until Sheet1.Cells(4 + N, 5) = ""
'======處理日期======
Sheet1.Range("A1") = Year(Sheet1.Cells(4 + N, 5)) & "/" & Month(Sheet1.Cells(4 + N, 5)) & "/" & Day(Sheet1.Cells(4 + N, 5))
A = Sheet1.Range("A1")             'A: 處理資料的日期
Sheet1.Range("A1").ClearContents
'======處理日期======

'======處理時間的位置======
b = Hour(Sheet1.Cells(4 + N, 5))
c = Minute(Sheet1.Cells(4 + N, 5))
If b < 3 And c <= 59 Or (b = 4 And c = 0) Then
   d = 4
   ElseIf b < 7 And c <= 59 Or (b = 8 And c = 0) Then
   d = 5
   ElseIf b < 11 And c <= 59 Or (b = 12 And c = 0) Then
   d = 6
   ElseIf b < 15 And c <= 59 Or (b = 16 And c = 0) Then
   d = 7
   ElseIf b < 19 And c <= 59 Or (b = 20 And c = 0) Then
   d = 8
   ElseIf b < 23 And c <= 59 Or (b = 24 And c = 0) Then
   d = 9
End If
'======處理時間的位置======

Set k = Sheet1.Range("I3:K3").Find(A, LookIn:=xlFormulas)
    If k.Offset(d - 3, 0) = "" Then
       k.Offset(d - 3, 0) = Sheet1.Cells(4 + N, 5).Offset(0, 1)
    Else
       k.Offset(d - 3, 0) = k.Offset(d - 3, 0) + Sheet1.Cells(4 + N, 5).Offset(0, 1)
    End If

N = N + 1    'N為處理下一筆資料之參數
Loop


End Sub
作者: imzues    時間: 2011-4-20 15:59

不好意思
我想請問一下Cells(4 + N, 5) = ""
=""  <===這寫法的意思是什麼?
作者: hugh0620    時間: 2011-4-20 18:16

回復 7# imzues


    因為你的E4:411是一個連續的資料~
    所以我使用do loop的方式來執行~
    當Cells(4 + N, 5) = ""就停止執行
    ="" <---在vba或excel公式中表示的都是空格
作者: imzues    時間: 2011-4-21 10:43

不好意思你寫的那段程式好像沒辦法執行

Set k = Sheet1.Range("I3:K3").Find(A, LookIn:=xlFormulas)
    If k.Offset(d - 3, 0) = "" Then
       k.Offset(d - 3, 0) = Sheet1.Cells(4 + N, 5).Offset(0, 1)
    Else
       k.Offset(d - 3, 0) = k.Offset(d - 3, 0) + Sheet1.Cells(4 + N, 5).Offset(0, 1)
    End If

N = N + 1    'N為處理下一筆資料之參數
Loop


End Sub
作者: hugh0620    時間: 2011-4-21 11:08

本帖最後由 hugh0620 於 2011-4-21 11:13 編輯

回復 9# imzues


    因為~ 我不知道你的資料範圍是不是跟我的一樣~
    附上我完成的檔案給您,亦即你一開始的附件進行製作~
    [attach]5670[/attach]
    若有問題可以把你做的上傳上來看一下~
    想到了~ 你的I3是日期格式 J3與K3是字串格式~ 請將全部改為日期格式
   格式最好統一~ 不然用find的方式~ 會因為格式的問題抓不到資料~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)