Board logo

標題: 尋找有沒有相同數據的欄位 [打印本頁]

作者: 198188    時間: 2024-2-27 15:36     標題: 尋找有沒有相同數據的欄位

Data 表的資料來讀取 Invoice 表的資料, 先找尋Data 表所有欄有沒有跟Invoice 表儲存格G5 相同的。

如果有,在該欄操作下面:
Data表 欄A 對比  Invoice表 欄C
Data表 欄B 對比  Invoice表 欄D
Data表 欄C 對比  Invoice表 欄E
三樣都相同,讀取 Invoice 表 欄F 的數值到Data 表跟Invoice G5 表儲存格相同的該欄位

如果沒有,在最後一欄操作下面:
Data表 欄A 對比  Invoice表 欄C
Data表 欄B 對比  Invoice表 欄D
Data表 欄C 對比  Invoice表 欄E
三樣都相同,讀取 Invoice 表 欄F 的數值到Data 表最後一欄

Data表欄E 計算: Data表欄D 減 Data表欄F 開始到最後有數值的一欄

如果Invoice 表 欄C - E組合在Data 表欄A - C 沒有找到的項目,彈出視窗列出這些組合
作者: Andy2483    時間: 2024-2-27 16:32

本帖最後由 Andy2483 於 2024-2-27 16:41 編輯

回復 1# 198188

謝謝前輩發表此主題與範例
後學片段學習方案如下,請前輩參考

Option Explicit
'此段是 找尋Data 表所有欄有跟Invoice 表儲存格G5 相同的,
'三樣都相同,讀取 Invoice 表 欄F 的數值到Data 表跟Invoice G5 表儲存格相同的該欄位

Sub TEST()
Dim Brr, Z, i&, c, T$, T1$, T2$, T3$
c = Application.Match([Invoice!G5], [Data!1:1], 0)
Set Z = CreateObject("Scripting.Dictionary")
If IsError(c) Then MsgBox "找不到G5關鍵字": Exit Sub
Brr = Range([Invoice!F12], [Invoice!C65536].End(3))
For i = 1 To UBound(Brr)
   T1 = Trim(Brr(i, 1)): T2 = Val(Brr(i, 2)): T3 = Val(Brr(i, 3)): T = T1 & "/" & T2 & "/" & T3
   If T1 = "" Then GoTo i01
   Z(T) = Val(Brr(i, 4))
i01: Next
Brr = [Data!A1].CurrentRegion
For i = 2 To UBound(Brr)
   T1 = Trim(Brr(i, 1)): T2 = Val(Brr(i, 2)): T3 = Val(Brr(i, 3)): T = T1 & "/" & T2 & "/" & T3
   If T1 = "" Or Z(T) = "" Then Brr(i - 1, 1) = "": GoTo i02
   Brr(i - 1, 1) = Z(T)
i02: Next
[Data!A1].Item(2, c).Resize(UBound(Brr) - 1) = Brr
End Sub
作者: 198188    時間: 2024-2-27 16:41

回復 2# Andy2483


    如果找不到G5, 應該把所有參數導入到最後一行,不是顯示“找不到G5的參數”
作者: Andy2483    時間: 2024-2-27 16:42

回復 3# 198188

請前輩自己先試試看
作者: 198188    時間: 2024-2-27 16:45

回復 4# Andy2483


    能不能告知怎樣找最後一欄,我只懂得找最後一行。
另外最後有個計算,欄D 減去 欄F 到最後一行,這句應該如何寫?
作者: 198188    時間: 2024-2-28 10:35

回復 4# Andy2483

我修改了如下,滿足了所有要求。

Option Explicit
Sub TEST3()
Dim Brr, Z, i&, c, T$, T1$, T2$, T3$, a, b, d
Dim ColNum As Long
c = Application.Match([Invoice!G5], [Data!1:1], 0)

If IsError(c) Then
ColNum = Worksheets("Data").Cells(1, Columns.Count).End(xlToLeft).Column
Worksheets("Data").Cells(1, ColNum + 1) = Worksheets("Invoice").Cells(5, 7)
End If

c = Application.Match([Invoice!G5], [Data!1:1], 0)
Set Z = CreateObject("Scripting.Dictionary")

Brr = Range([Invoice!F10], [Invoice!C65536].End(3))
For i = 1 To UBound(Brr)
   T1 = Trim(Brr(i, 1)): T2 = Val(Brr(i, 2)): T3 = Val(Brr(i, 3)): T = T1 & "/" & T2 & "/" & T3
   If T1 = "" Then GoTo i01
   Z(T) = Val(Brr(i, 4))
i01: Next
Brr = [Data!A1].CurrentRegion
For i = 2 To UBound(Brr)
   T1 = Trim(Brr(i, 1)): T2 = Val(Brr(i, 2)): T3 = Val(Brr(i, 3)): T = T1 & "/" & T2 & "/" & T3
   If T1 = "" Or Z(T) = "" Then Brr(i - 1, 1) = "": GoTo i02
   Brr(i - 1, 1) = Z(T)
i02: Next
[Data!A1].Item(2, c).Resize(UBound(Brr) - 1) = Brr

a = Worksheets("Data").Range("A1").End(xlDown).Row
d = Worksheets("Data").Cells(1, Columns.Count).End(xlToLeft).Column
For i = 2 To a
Worksheets("Data").Cells(i, 5) = Worksheets("Data").Cells(i, 4) - Application.WorksheetFunction.Sum(Worksheets("Data").Range(Cells(i, 6), Cells(i, d + 1)))
Next i

End Sub
作者: 准提部林    時間: 2024-2-28 11:31

有則汰舊換新, 無則新增//

[attach]37520[/attach]
作者: 198188    時間: 2024-2-28 13:12

回復 7# 准提部林

如果有重複,這個有沒有自動加總數量?
作者: 准提部林    時間: 2024-2-28 17:50

回復 8# 198188


invioce 若有重覆, 會加總,
注意:data表是重新匯總, 舊的會先清除
作者: 198188    時間: 2024-2-28 17:58

回復 9# 准提部林

測試過,的確可以。
請問可否最後加一個功能,提醒INVOICE 有哪些在DATA 找不到的所有項目。
可以用顔色highlight這些項目 或者彈個視窗顯示這些的明細
作者: 198188    時間: 2024-2-28 18:18

回復 9# 准提部林


准大,我打開�堶接{式想學習及做微調,但是�堶悸`釋是亂碼,可否將程式貼在回復上,方便我學習,謝謝!
作者: Andy2483    時間: 2024-2-29 08:03

本帖最後由 Andy2483 於 2024-2-29 10:55 編輯

謝謝論壇,謝謝 准提部林前輩指導,謝謝前輩發話題一起學習
建議前輩在得到協助代碼後試著自己逐列了解其意義,必要時自己註解,不了解的部分查論壇,或它網,或問代碼細節
以下是 准提部林前輩的方案

Sub Test_A1()
Dim Arr, Brr, xD, xZ As Range, xF As Range, T$, R&, C&, i&
T = [Invoice!G5] '單號
If Not T Like "INV########" Then Exit Sub '單號不符合INV+8位日期..跳出
Set xZ = [Data!a1].Cells(1, Columns.Count).End(1)  '找data第一行最後非空
Set xF = [Data!1:1].Find(T, Lookat:=xlWhole) '找單號在data的欄位
If xF Is Nothing Then Set xZ = xZ(1, 2): Set xF = xZ '若單號不存在, 增加一欄
Set xD = CreateObject("Scripting.Dictionary")
'-------------------------------
Arr = Range([Data!c1], [Data!a1].Cells(Rows.Count, 1).End(3))
Arr(1, 1) = T '將Arr第一欄首格放入"單號"
For i = 2 To UBound(Arr)
    T = Arr(i, 1) & "\" & Arr(i, 2) & "\" & Arr(i, 3)
    xD(T) = i '字典記憶行位置
    Arr(i, 1) = 0  '將Arr第一欄放入0, 以備填入數量
Next i
'----------------------------
Brr = Range([Invoice!h1], [Invoice!a1].Cells(Rows.Count, 1).End(3))
For i = 2 To UBound(Brr)
    R = xD(Brr(i, 3) & "\" & Brr(i, 4) & "\" & Brr(i, 5))
    If R > 0 Then Arr(R, 1) = Arr(R, 1) + Brr(i, 6)
Next i
'----------------------------
xF.Resize(UBound(Arr)).Value = Arr
With Range([Data!F1], xZ).Resize(UBound(Arr)) '單號欄格式
     .ColumnWidth = 15 '統一欄寬
     .Borders.LineStyle = 1 '加框
     .HorizontalAlignment = xlCenter '縱置中
     .VerticalAlignment = xlCenter   '橫置中
End With
[Data!e2].Resize(UBound(Arr) - 1) = "=D2-SUM(F2:" & xZ(2).Address(0, 0) & ")" 'E欄"結餘"公式(隨欄數變化)..刪去欄也可正確計算
End Sub
作者: 198188    時間: 2024-2-29 10:43

回復 12# Andy2483


原本是KH 的數量copy 到Data 的欄D, 如果想將欄D 改爲欄E, 這個應該在哪句修改?
作者: 198188    時間: 2024-2-29 11:07

回復 13# 198188

找到方法了

    Sub Test_A1()
Dim Arr, Brr, xD, xZ As Range, xF As Range, T$, R&, C&, i&, A, B

A = Worksheets("Data").Range("A1").End(xlDown).Row
For B = 2 To A
Worksheets("Data").Cells(B, 4) = Worksheets("Data").Cells(B, 5)
Next B

T = [data!E1] 'invoice no
Set xZ = [Data!a1].Cells(1, Columns.Count).End(1)  'Find Data last column
Set xF = [Data!1:1].Find(T, Lookat:=xlWhole) 'Find invoice no from Data all column?
If xF Is Nothing Then Set xZ = xZ(1, 2): Set xF = xZ 'if don't find, add one column


Set xD = CreateObject("Scripting.Dictionary")
'-------------------------------
Arr = Range([Data!c1], [Data!a1].Cells(Rows.Count, 1).End(3))
Arr(1, 1) = T 'put Arr first column on invoice
For i = 2 To UBound(Arr)
    T = Arr(i, 1) & "\" & Arr(i, 2) & "\" & Arr(i, 3)
    xD(T) = i 'record column place
    Arr(i, 1) = 0  'set Arr first column 0,for back up to input?
Next i
'----------------------------
Brr = Range([KH!E1], [KH!a1].Cells(Rows.Count, 1).End(3))
For i = 2 To UBound(Brr)
    R = xD(Brr(i, 2) & "\" & Brr(i, 3) & "\" & Brr(i, 4))
    If R > 0 Then Arr(R, 1) = Arr(R, 1) + Brr(i, 5)
Next i
'----------------------------
xF.Resize(UBound(Arr)).Value = Arr

[Data!F2].Resize(UBound(Arr) - 1) = "=E2-SUM(G2:" & xZ(2).Address(0, 0) & ")" 'Column E BAL.
'RESET AND DELETE OLD RECORD
End Sub
作者: Andy2483    時間: 2024-2-29 11:13

回復 13# 198188


    這話題範例沒有這需求,建議另上傳新範例,裡面放兩個結果表(執行前表,執行結果表),
這樣的範例讓協助者比較兩個結果表的差異,很容易知道需求是什麼
作者: 198188    時間: 2024-2-29 12:56

回復 15# Andy2483


   因爲我修改了一些格式,所以需要再微調程式。
附件上我基於一些實際改變而做了一些改動,程式也微調了。




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