返回列表 上一主題 發帖

[發問] 依據InputBox填入的日期顯示資料

本帖最後由 n7822123 於 2020-7-26 22:58 編輯

回復 1# papaya


DATA的A欄 是"字串格式" (2020/7/7  (二)),InputBox輸入的日期也是"字串格式" (2020707)

兩個格式都是"字串" 又長的不太一樣,要怎麼比?

用拆解字串方式?  會很麻煩阿!

建議日期就回歸到日期格式,可以用自訂格式 "yyyy/mm/dd (aaa)"

日期格式可以做運算,字串格式不能
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2020-7-27 00:58 編輯

回復 3# papaya


先幫你把A欄的格式改成日期格式,我自認註解寫不少....且防呆寫不少

所以程式寫的比較長一點,希望看的懂吧~ 程式如下


Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim Arr, 此表 As Worksheet, 日期 As Date, tim!, rg As Range, Rn&, xlsNm$, sh
Arr = Array("七政", "八卦", "五行", "六沖", "生肖", "合數", "均值", "尾數")
Set 此表 = ActiveSheet
'1_先設立1個可輸入日期(yyyymmdd)的InputBox
日期 = InputBox("請輸入日期,格式Ex:2020/07/07", "輸入日期")
If IsEmpty(日期) Then Exit Sub
'檔案名稱="大樂透_遺漏空總統計表_輸入InputBox的日期”
xlsNm = "大樂透_遺漏空總統計表_" & Format(日期, "mmdd")
'檢查是否已有檔案(避免重覆執行)
檢查$ = Dir(ThisWorkbook.Path & "\" & xlsNm & ".xls*")
If 檢查 <> "" Then
  re% = MsgBox("此檔案已存在,請確認是否覆蓋?", vbYesNo)
  If re = vbNo Then Exit Sub Else Kill ThisWorkbook.Path & "\" & 檢查
End If
tim = Timer  '開始計時
'比對日期
For Each rg In Range([A1], [A1].End(4))
  If rg = 日期 Then Rn = rg.Row: Exit For
Next
'如果該B︰H="”時,則Arr的A1也="”
If Rn = 0 Then MsgBox "找不到日期": Exit Sub
For Each sh In Arr
  With Sheets(sh): 此表.Activate
    '2_該日期填入"七政","八卦","五行","六沖","合數","生肖","均值","尾數"的各工作表
    .[A1] = Format(日期, "yyyy/mm/dd")
    '並將DATA的A欄=X日期的下1列之B︰H數值填入
    .[A3].Resize(7) = Application.Transpose(Cells(Rn + 1, 2).Resize(, 7))
  End With
Next
'3_將完成第2項的"Arr"輸出為1個獨立檔案
With Workbooks.Add
  For i = 0 To UBound(Arr)
    ThisWorkbook.Sheets(Arr(i)).Copy After:=.Sheets(.Sheets.Count)
  Next
  .Sheets(Array(1, 2, 3)).Delete
  .SaveAs ThisWorkbook.Path & "\" & xlsNm    '沒給副檔名,舊板新版Excel都適用
  .Close True
End With
[Q2] = Round(Timer - tim, 2)
End Sub


檔案如下

49大樂透(主檔).rar (22.26 KB)

你另一帖需求感覺更多,光看起來就感覺有點麻煩.....

看有沒有人願意幫你,今天先這樣
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 6# papaya


Array(1, 2, 3)是指什麼範圍的工作表被刪除了?

新增活頁簿會預設有3個工作表,所以把前3個工作表刪除

你把那一行註解掉,再執行就知道是什麼了  

如果不一次寫,要分三行寫,會變成如下(連續刪除第一頁工作表,3次)


sheets(1).delete
sheets(1).delete
sheets(1).delete
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2020-7-29 03:01 編輯

回復 9# papaya

厄.........你這樣敘述,我真的看不懂...............

先檔案開始說吧,為什麼你的範例1 "2020/5/15" 要找上

"將遺漏大數據-大樂透-七政排序-空數總覽-土-第二第三第四第五最末-(2020-07-21)" 這個檔案?

為什麼你的範例2 "2020/7/21" 要換成

"將遺漏大數據-大樂透-生肖排序-空數總覽-狗-第二第三最末-(2020-07-21)的AZ2 (2020/7/21)" 這個檔案?


完全看不懂有什麼關聯

還有敘述的句子,能使用

"XXX"檔案 的"OOO" 欄位 複製到 "PPP"檔案 的 "KKK"欄位

這種方式嗎?

你的敘述看的真的很亂,完全不知道是指 "檔案" 還是 "工作表" 還是 "欄位" !


程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2020-7-30 01:43 編輯

回復 18# papaya


好,很清楚,我看懂了

不過我可能會反過來寫,因為這樣比較簡單

依資料夾內的檔案"檔名"搜尋一遍,

如果有對應的欄位再打開檔案,搜尋日期,

並把相應值填上,這個寫法只需跑一次迴圈(檔案迴圈)

你的步驟寫起來會比較麻煩,要三個迴圈

工作表1個迴圈(七政、八卦...)  B欄1個迴圈(土、日...)  C欄1個迴圈(第一第二...)

而且像這種少的範例檔(4個),很多欄位都找不到相對應檔案,

所以反過來用檔案找欄位,會比較有效率

我先整理一下思路,最快也要明天才能寫給你。
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 20# papaya

把Excel檔放到 同路徑下的"xls檔" 資料夾後,再執行就可以了

可自行改路徑位置(修改程式裡面的 "xlsPath")

至於一開始的csv檔,你可以另寫程式轉成xls檔

測試檔只有4個,所以不會花太長時間 (檔案越少,時間越短)

至於你原本的上百個檔案,可能會花上數分鐘

程式如下


Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim Arr, 此表 As Worksheet, 日期 As Date, tim!, rg As Range, Rn&, xlsNm$, sh
Dim Key$, Item$, xlsPath$, xls檔$, K1$, K2$, K3$, Ri&
Set D = CreateObject("Scripting.Dictionary")
Arr = Array("七政", "八卦", "五行", "六沖", "生肖", "合數", "均值", "尾數")
Set 此表 = ActiveSheet
'---------------------------------------------
'1_先設立1個可輸入日期(yyyymmdd)的InputBox
日期 = InputBox("請輸入日期,格式Ex:2020/07/07", "輸入日期")
If IsEmpty(日期) Then Exit Sub
'檔案名稱="大樂透_遺漏空總統計表_輸入InputBox的日期”
xlsNm = "大樂透_遺漏空總統計表_" & Format(日期, "mmdd")
'檢查是否已有檔案(避免重覆執行)
檢查$ = Dir(ThisWorkbook.Path & "\" & xlsNm & ".xls*")
If 檢查 <> "" Then
  re% = MsgBox("此檔案已存在,請確認是否覆蓋?", vbYesNo)
  If re = vbNo Then Exit Sub Else Kill ThisWorkbook.Path & "\" & 檢查
End If
tim = Timer  '開始計時
'比對日期
Set rg = Range([A1], [A1].End(4)).Find(日期, , , xlWhole)
If Not rg Is Nothing Then Rn = rg.Row
'如果該B︰H="”時,則Arr的A1也="”
If Rn = 0 Then MsgBox "找不到日期": Exit Sub
For Each sh In Arr
  With Sheets(sh): 此表.Activate
    '2_該日期填入"七政","八卦","五行","六沖","合數","生肖","均值","尾數"的各工作表
    .[A1] = Format(日期, "yyyy/mm/dd")
    '並將DATA的A欄=X日期的下1列之B︰H數值填入
    .[A3].Resize(7) = Application.Transpose(Cells(Rn + 1, 2).Resize(, 7))
  End With
Next
'---------------------------------------------
'將欄位資料裝進字典(供後面查詢)+清空程式檔工作表資料
For Each sh In Arr: With Sheets(sh)
  Rn = [B5000].End(3).Row
  For R = 2 To Rn
    If .Cells(R, 2) <> "" Then
      '把3種關鍵字組合起來當字典的Key (C欄字串中有空白陷阱)
      Key = .Name & "-" & .Cells(R, 2) & "-" & Replace(.Cells(R, 3), " ", "")
      D(Key) = R   'Item放'列號'
      .[E2].Resize(Rn - 1, 14).ClearContents  '清空資料
    End If
  Next R
End With: Next sh
'-----------------------------------------------
xlsPath = ThisWorkbook.Path & "\xls檔\"   '統一把xls放在xls檔資料夾 -可自行修改資料夾名稱~
xls檔 = Dir(xlsPath & "*.xls*")
Do While xls檔 <> ""
  K1 = Replace(Split(xls檔, "-")(2), "排序", "")
  K2 = Split(xls檔, "-")(4)
  K3 = Split(xls檔, "-")(5)
  Key = K1 & "-" & K2 & "-" & K3
  If D.Exists(Key) Then  '查字典尋找是否有欄位
    With Workbooks.Open(xlsPath & xls檔).Sheets(1)
      'Step_3:以Step_1的A1日期(或=InputBox輸入的日期)搜尋AZ欄中的相同日期
      Set rg = .Range(.[AZ1], .[AZ1].End(4)).Find(日期, , , xlWhole)
      'Step_4:將Step_3 搜尋到的日期之上1列的BA︰BS內容,複製貼上Step_1相對應的E欄儲存格(=E7)
      If Not rg Is Nothing Then Ri = rg.Row - 1 Else .Parent.Close False: GoTo 下一檔
      此表.Parent.Sheets(K1).Cells(D(Key), "E").Resize(, 14) = .Cells(Ri, "BA").Resize(, 14).Value
      .Parent.Close False  '關閉xls檔
    End With
  End If
下一檔:  xls檔 = Dir
Loop
'-------------------------------------------------------
'3_將完成的工作表輸出為1個獨立檔案
With Workbooks.Add
  For Each sh In Arr
    此表.Parent.Sheets(sh).Copy After:=.Sheets(.Sheets.Count) '複製Arr各工作表內容
  Next
  .Sheets(Array(1, 2, 3)).Delete
  .SaveAs ThisWorkbook.Path & "\" & xlsNm    '沒給副檔名,舊板新版Excel都適用
  .Close True
End With
[Q2] = Round(Timer - tim, 2) & "秒"
End Sub


檔案如下,有問題再說嘍

大樂透.rar (679.52 KB)
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2020-7-30 23:22 編輯

回復 22# papaya


另外~想在R2填入=InputBox輸入日期(EX : 2020/7/21);在S2填入當次完成執行的檔案個數(EX : 4個)
請問 : 程式碼要怎麼增寫?  

你指的是有效的執行檔案個數吧!?  

如果比對檔案名稱有欄位,並已經打開檔案

但是在AZ欄位找不到你輸入的日期

這種情況應該不算"有效執行"吧


疑惑~
為什麼狀況1的6個xls檔的AZ欄日期格式完全相同,為什麼原來的4個檔案能有有效執行,新加入的2個檔案卻不行?

厄....我6個都成功執行了,要把xls放入"xls檔"資料夾內才會被掃描到喔~

更新計算執行檔案個數,並顯示在S2欄位,

你再測看看,如下附件


大樂透_0730_TEST.rar (696.08 KB)
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 25# papaya



另外~想在R2填入=InputBox輸入的日期(EX : 2020/7/17或2020/7/21)
程式碼應該如何編寫?

添加一行就可以了,如下~

'---------------------------------------------
'1_先設立1個可輸入日期(yyyymmdd)的InputBox
日期 = InputBox("請輸入日期,格式Ex:2020/07/07", "輸入日期")
[R2] = 日期   
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

        靜思自在 : 願要大、志要堅、氣要柔、心要細。
返回列表 上一主題