Board logo

標題: [發問] 依指定區間日期、帳號 填入資料 [打印本頁]

作者: PJChen    時間: 2021-1-16 16:00     標題: 依指定區間日期、帳號 填入資料

大大們好,

1..        在"說明"工作表中有4個帳號"大、美、佳、振",符合帳號、日期(同帳號及日期,不一定只有一筆)
2..        以"說明"工作表中的交運日期,最大值&最小值為區間,將M欄的取板編號、O欄的預約板數填入"預約"工作表中的G/C欄
3..        取板編號填入時,依原號碼,在最前面加上#0000(例:編號為118120,則為#0000118120)
4..        "預約"工作表中,不屬於交運日期區間值的所有資料及帳號,都不要有任何變動(有資料的,保留原資料,無資料則空白)
5..        例如:1/13~1/29不在此區間,已有的原資料不可變動,1/15 & 1/18也有非屬4大帳號,也不可填入資料

請問要達到這些要求,用函數or程式可以達成?
[attach]32980[/attach]
作者: 軒云熊    時間: 2021-1-16 22:51

回復 1# PJChen
有空幫我試試看是不是這樣比對 感謝 ^^"
  1. Public Sub 跨工作表比對練習()

  2.     Arr = [說明!I2].CurrentRegion
  3.     Brr = [預約!A1].CurrentRegion
  4.    
  5.     For X = 2 To UBound(Arr)
  6.         A = Arr(X, 1) & "-" & Arr(X, 4)
  7.         For Y = 2 To UBound(Brr)
  8.             B = Brr(Y, 2) & "-" & Brr(Y, 1)
  9.             If A = B And Arr(X, 4) <> "" Then
  10.                 Brr(Y, 3) = Arr(X, 7)
  11.                 Brr(Y, 7) = "#0000" & Arr(X, 5)
  12.             End If
  13.         Next Y
  14.     Next X
  15.    
  16.     [預約!A1].Resize(UBound(Brr, 1), UBound(Brr, 2)) = Brr

  17. End Sub
複製代碼

作者: 准提部林    時間: 2021-1-17 10:19

Sub 預約更新()
Dim Arr, xD, i&, T$
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([說明!R1], [說明!i65536].End(xlUp))
For i = 3 To UBound(Arr)
    If Arr(i, 1) = "" Or IsDate(Arr(i, 4)) Then
       T = Arr(i, 1) & "|" & Arr(i, 4)
       xD(T) = xD(T) + Val(Arr(i, 7)) '同日同號不只一筆,累加
       xD(T & "/m") = "#0000" & Arr(i, 5) '取板編號
    End If
Next i
Arr = Range([預約!G1], [預約!A65536].End(xlUp))
For i = 2 To UBound(Arr)
    T = Arr(i, 2) & "|" & Arr(i, 1)
    If xD.Exists(T) Then
       Arr(i, 3) = xD(T)
       Arr(i, 7) = xD(T & "/m")
    End If
Next i
[預約!A1].Resize(UBound(Arr), 7) = Arr
End Sub


'==========================
作者: PJChen    時間: 2021-1-17 16:05

回復 3# 准提部林
回復 2# 軒云熊

感謝兩位大大,
二個程式測試結果都相同:
同一日期、同帳號有多筆取板資料時,帶出的結果有誤
取板編號只會帶出最後一筆,數量會變成累加

以下圖片為跑程式結果 v.s. 正確資料
[attach]32981[/attach]
作者: 准提部林    時間: 2021-1-17 17:40

回復 4# PJChen


Sub 預約更新()
Dim Arr, xD, i&, T$
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([說明!R1], [說明!i65536].End(xlUp))
For i = 3 To UBound(Arr)
    If Arr(i, 1) <> "" And IsDate(Arr(i, 4)) Then
       T = Arr(i, 1) & "|" & Arr(i, 4) & "#0000" & Arr(i, 5)
       xD(T) = xD(T) + Val(Arr(i, 7))
    End If
Next i
Arr = Range([預約!G1], [預約!A65536].End(xlUp))
For i = 2 To UBound(Arr)
    T = Arr(i, 2) & "|" & Arr(i, 1) & Arr(i, 7)
    If xD.Exists(T) Then Arr(i, 3) = xD(T)
Next i
[預約!A1].Resize(UBound(Arr), 7) = Arr
End Sub
作者: PJChen    時間: 2021-1-17 18:03

回復 5# 准提部林
大大,

我試了幾次,都無動作,不知發生什麼事...
作者: PJChen    時間: 2021-1-17 18:17

本帖最後由 PJChen 於 2021-1-17 18:24 編輯

回復 5# 准提部林

試了幾次還是不行,請大大幫忙看下程式!
感謝
[attach]32983[/attach]
作者: 軒云熊    時間: 2021-1-17 20:06

回復 7# PJChen

有空再試試看這樣行不行  感謝
  1. Public Sub 跨工作表比對練習()

  2.     Arr = [說明!I2].CurrentRegion
  3.     Brr = [預約!A1].CurrentRegion

  4.     For X = 2 To UBound(Arr)
  5.         A = Arr(X, 1) & "-" & Arr(X, 4)
  6.         For Y = X To UBound(Brr)
  7.             B = Brr(Y, 2) & "-" & Brr(Y, 1)
  8.             If A = B And Brr(Y, 3) = "" Then K = 0
  9.             If A = B And Arr(X, 4) <> "" And K <> 1 Then
  10.                 K = 1
  11.                 Brr(Y, 3) = Arr(X, 7)
  12.                 Brr(Y, 7) = "#0000" & Arr(X, 5)
  13.             Exit For
  14.             End If
  15.         Next Y
  16.     Next X

  17.     [預約!A1].Resize(UBound(Brr, 1), UBound(Brr, 2)) = Brr

  18. End Sub
複製代碼

作者: PJChen    時間: 2021-1-17 20:22

回復 8# 軒云熊

感謝!
這個程式OK了
作者: PJChen    時間: 2021-1-20 21:53

回復 8# 軒云熊
您好,
程式在實作時,發現了問題:執行程式後,會將D:F欄的公式值化,且不屬於這個區間的也都值化了,
請問要如何修改程式,讓D:F欄不受程式影響,保持原樣(有公式則保留)?
[attach]32991[/attach]
作者: 軒云熊    時間: 2021-1-21 00:29

回復 10# PJChen

把陣列改成 CELLS 應該可以 有空再試試看行不行 感謝
  1. Sub 預約更新_2()
  2. Application.ScreenUpdating = False
  3.     Arr = [說明!I2].CurrentRegion
  4.     Brr = [預約!A1].CurrentRegion

  5.     For X = 2 To UBound(Arr)
  6.         A = Arr(X, 1) & "-" & Arr(X, 4)
  7.         For Y = X To UBound(Brr)
  8.             B = Brr(Y, 2) & "-" & Brr(Y, 1)
  9.             If A = B And Brr(Y, 3) = "" Then K = 0
  10.             If A = B And Arr(X, 4) <> "" And K <> 1 Then
  11.                 K = 1
  12.                 Cells(Y, 3) = Arr(X, 7)
  13.                 Cells(Y, 7) = "#0000" & Arr(X, 5)
  14.             Exit For
  15.             End If
  16.         Next Y
  17.     Next X

  18. Application.ScreenUpdating = True
  19. End Sub
複製代碼

作者: PJChen    時間: 2021-1-21 21:38

回復 11# 軒云熊

真感謝!執行沒問題了
請問原來的程式,不需要了嗎? [預約!A1].Resize(UBound(Brr, 1), UBound(Brr, 2)) = Brr
2 To UBound(Arr)...UBound(Arr)前面的數字代表什麼?我常看到程式前有不同數字,但不理解用法!
可以的話能否幫忙解說您寫的程式?
作者: 軒云熊    時間: 2021-1-22 00:11

回復 12# PJChen

Sub 預約更新_2()
Application.ScreenUpdating = False '關閉更新畫面

    '把工作表的所有內容放到陣列
    Arr = [說明!I2].CurrentRegion
    Brr = [預約!A1].CurrentRegion

    For X = 2 To UBound(Arr) '在陣列裡的第2列開始到最後一列
        A = Arr(X, 1) & "-" & Arr(X, 4) '說明文字 帳號串聯日期
        For Y = X To UBound(Brr) '在陣列裡的第2列開始到最後一列
            B = Brr(Y, 2) & "-" & Brr(Y, 1) '預約文字 帳號串聯日期
            If A = B And Brr(Y, 3) = "" Then K = 0 '如果說明文字與預約文字相同 且預約X列位的第3欄位沒有內容 K就等於0 表示沒有被比對過
            If A = B And Arr(X, 4) <> "" And K <> 1 Then '如果說明文字的與預約文字相同 且說明X列位的第4欄位有內容 且K不等於1 表示沒有被比對過
                K = 1 '表示已經被比對過
                Cells(Y, 3) = Arr(X, 7) '把說明的預約板數放到預約工作表的單項取板欄位
                Cells(Y, 7) = "#0000" & Arr(X, 5) '把說明的 "#0000"串聯取板編號 放到預約工作表的取板編號欄位
            Exit For '跳到下一個迴圈
            End If
        Next Y
    Next X
    'D:F欄的公式值化 是因為  Brr = [預約!A1].CurrentRegion 的關係 所有內容放到陣列 或改成特定位置
'[預約!A1].Resize(UBound(Brr, 1), UBound(Brr, 2)) = Brr 因為沒有在陣列裡比對所以不需要
Brr指的是預約工作表比對後的內容
其實用字典方法會更好 但小弟還在學習中不太理解...有空還是會來看看大大們怎麼寫.順便學習^^"
Application.ScreenUpdating = True '開啟更新畫面
End Sub
作者: PJChen    時間: 2021-1-22 23:00

回復 13# 軒云熊

請問我查了CurrentRegion是當前區域的意思,
那Arr = [說明!I2].CurrentRegion
是指從I2到哪個儲存格為止?
作者: 軒云熊    時間: 2021-1-23 01:13

回復 14# PJChen

那是一個動態範圍 會隨著儲存格內容變動 但前提是 只要有內容的儲存格 都是你要的 否則會選到一些不相關的內容
其實很多問題 都可以在這裡找到答案

達人總結的VBA精典的""八""類百條語句版

新手 VBA 入門常見問題

我都是在這裡學的 如果找不到答案 看看一些文章裡也許會有  再不行前輩們也會有答案 這裡真的可以學到很多
因為每個前輩的思考邏輯都有所不同 有時候看到前輩們寫 會發現 哇~原來還可以這樣......  呵呵..
作者: PJChen    時間: 2021-1-23 21:40

回復 15# 軒云熊


謝謝您, 有問題會再請教
作者: PJChen    時間: 2021-3-4 22:14

回復 15# 軒云熊

熊大好,

今天做分批預約時,發生了問題,請幫忙查看程式,感謝!

說明工作表的籃色區塊先進行第一次預約,填入資料沒問題
黃色區塊是第二批預約資料,貼到L11:S19後,程式就無法載入資料至"預約工作表",
經過測試,只要把"預約工作表"的指定區間資料清除,填入資料就可正常執行,
請問有沒有辦法,當資料分批出現時,不用做清除動作,就可以載入資料??
[attach]33093[/attach]
作者: 軒云熊    時間: 2021-3-5 03:43

回復 17# PJChen

我看不出來... >�苤捸@ 可不可以請 PJChen大大 做記號或著畫框框 說清楚一點 抱歉 我理解能力不太好 麻煩妳了 感謝
作者: 軒云熊    時間: 2021-3-5 04:14

回復 17# PJChen

好像是 L欄格式 不是日期格式 有改了一下 有空妳再試試看是不是L欄的問題 感謝

[attach]33096[/attach]
作者: 軒云熊    時間: 2021-3-5 04:49

本帖最後由 軒云熊 於 2021-3-5 04:53 編輯

回復 17# PJChen

抱歉 剛才發現 要點好幾次資料才會全部列出 判斷沒改好 再傳一次 >�苤捸@有空再幫我看看還有沒有其它問題 感謝

[attach]33097[/attach]
作者: 軒云熊    時間: 2021-3-5 05:24

本帖最後由 軒云熊 於 2021-3-5 05:26 編輯

回復 17# PJChen

上面的檔案 沒改好會出錯 所以重新再上傳 想把上面的檔案刪除 可是不知道怎麼刪除 好像時間過了就無法刪除...抱歉了准大 往後我會注意確定了再上傳 


[attach]33098[/attach]
作者: PJChen    時間: 2021-3-7 21:20

回復 21# 軒云熊

熊大,
我將預約!黃色區域的資料清除了, 執行程式後,就可以看到某些日期無法載入資料
麻煩您了...
[attach]33104[/attach]
作者: 軒云熊    時間: 2021-3-7 22:11

本帖最後由 軒云熊 於 2021-3-7 22:18 編輯

回復 22# PJChen

你是說這裡嗎?    妳指的是哪些部分可以框起來或著做記號嗎?   我看不出來 ...>"<

說明資料裡面沒有
03/02 週二        美
03/03 週三        佳
03/03 週三        美
03/04 週四        美


大        9                2021/2/18週四
大        10                2021/2/19週五
大        11                2021/2/19週五
大        12                2021/2/19週五
大        13                2021/3/2週二
大        14                2021/3/3週三
大        15                2021/3/4週四


[attach]33105[/attach]

[attach]33106[/attach]
作者: PJChen    時間: 2021-3-8 16:06

回復 23# 軒云熊
熊大好,
我下載了你測試的檔案,看到有正確的載入資料,
但我將資料清除後,再重新執行程式,還是同我之前測試一樣,
帳號"大"載入資料只到2/17就停住了,執行多次,都同樣結果,
查不到原因!
作者: 軒云熊    時間: 2021-3-8 21:21

本帖最後由 軒云熊 於 2021-3-8 21:26 編輯

回復 24# PJChen

我這裡測試 2個方法都沒有問題
我想可能是 變數沒有定義 或著 是文字的長度有問題
有改寫了 抓取 說明資料裡的 L欄 方式  有空再幫我試試看 感謝

[attach]33108[/attach]
作者: PJChen    時間: 2021-3-8 21:41

回復 25# 軒云熊
熊大,

二個寫法執行結果都相同,帳號"大"載入資料只到2/17就停住!
作者: 軒云熊    時間: 2021-3-8 21:46

本帖最後由 軒云熊 於 2021-3-8 21:53 編輯

回復 26# PJChen
我這裡跑 2個都正常
[attach]33109[/attach]

妳先把 說明資料裡的 以下中文刪除 只留日期 用第2個方式跑看看 不要用 Function

2021/2/18週四
2021/2/19週五
2021/2/19週五
2021/2/19週五
2021/3/2週二
2021/3/3週三
2021/3/4週四
作者: 軒云熊    時間: 2021-3-8 22:04

回復 26# PJChen

還是妳的 Excel 設定有改到甚麼東西? 看看有沒有大大能幫忙測試一下 是不是我的寫法有問題 我跑出來 是正常的 不知道是哪裡有問題 >"<
作者: PJChen    時間: 2021-3-8 23:04

本帖最後由 PJChen 於 2021-3-8 23:06 編輯

回復 27# 軒云熊

熊大,
我測試的時候,都只有日期&帳號,而且我也沒有另外做什麼設定,但跑出的結果一直都不正常,
原本作業沒發生什麼問題,是因為最近一直要分批預約,才發現問題的!
作者: 軒云熊    時間: 2021-3-8 23:16

本帖最後由 軒云熊 於 2021-3-8 23:24 編輯

回復 29# PJChen

說明資料裡的 L欄 有些不是日期格式  不知道是不是這個問題
但 我已經 改寫了 iif   跟  Function 2個方式 都可以抓到 日期

我試著把說明資料黃色部分先刪除 執行一次  然後貼回去 在執行一次 資料也都會出現  
還是 妳的分批 指的不是我說的那樣? 或著預約資料格式有變化?  如果不是 可以告訴我妳是怎麼做分批的 細節步驟 感謝
作者: PJChen    時間: 2021-3-9 00:20

本帖最後由 PJChen 於 2021-3-9 00:31 編輯

回復 30# 軒云熊

熊大,
原來是下載下來的資料,不知名的原因,日期變成文字,讓我傷透腦筋,也著實麻煩您了!
不用再改,用原來的程式就好,只要我小心日期問題就可以了!
謝謝您發現這個問題, 不過為何日期變成文字,我執行程式有問題,您卻可執行無誤呢?
是怎麼做的?
作者: 軒云熊    時間: 2021-3-9 22:03

本帖最後由 軒云熊 於 2021-3-9 22:08 編輯

回復 31# PJChen

我只是執行 預約#1 按鈕而已 沒有做任何動作  應該是我的寫法有問題

有空 在幫我試試看  我把格式 加入 CDate  看看有沒有用  2個方法都有加  
如果是用 Function 字串長度就不用擔心有變化 但速度會變慢   
IIf 是固定扣最後2個字  字串長度有變化就會出錯  但會比較快一點點
因為我這邊測不出來差別 正常應該會轉日期才對  

[attach]33112[/attach]
作者: PJChen    時間: 2021-3-10 21:09

回復 32# 軒云熊
謝謝熊大,
以目前預約的資料,沒有感覺明顯的快慢差距,兩者都可以準確的載入資!




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