Board logo

標題: 如何用vba取得bom表中的資料 [打印本頁]

作者: ANGELA    時間: 2011-1-26 11:49     標題: 如何用vba取得bom表中的資料

請問如何依据產品編號至bom表中取得相關資料.
目前用函式處理但很麻煩,需一筆一筆轉貼成數据,
請知道的大大教導一下.
作者: Hsieh    時間: 2011-1-26 21:50

回復 1# ANGELA


    試試看
  1. Sub TNT()
  2. Dim Ar()
  3. With Sheets(Left([C11], 2))
  4. Set a = .Rows(2).Find([C11])
  5. For Each c In a.EntireColumn.SpecialCells(xlCellTypeConstants, 1)
  6. Set b = [E2:E10].Find(.Cells(c.Row, 1))
  7. ReDim Preserve Ar(s)
  8. Ar(s) = Array([A11], [B11], [C11], [D11], .Cells(c.Row, 1), c * [D11], b.Offset(, 2) - c * [D11], Date)
  9. s = s + 1
  10. Next
  11. End With
  12. [A11].Resize(s, 8) = Application.Transpose(Application.Transpose(Ar))
  13. End Sub
複製代碼

作者: ANGELA    時間: 2011-1-27 11:34

回復 2# Hsieh


     謝謝版主的解答我會試著修改,
   剛進入vba領域,先消化看看,有不懂再來麻煩版主解答.
作者: ANGELA    時間: 2011-1-27 14:58

回復 2# Hsieh


    又來麻煩版主了,試著修改了一下但不理想,請版主再幫下忙.
    請看附件.
作者: Hsieh    時間: 2011-1-27 16:21

回復 4# ANGELA
  1. Sub TNT()
  2. Dim Ay(), C As Range, A As Range
  3. Set d = CreateObject("Scripting.Dictionary") '庫存
  4. Set ds = CreateObject("Scripting.Dictionary") '索引
  5. For Each A In Range([E2], [E65536].End(xlUp)) '庫存
  6.    d(UCase(A)) = A.Offset(, 2)
  7. Next
  8. With Sheets("索引")
  9. For Each A In .Range(.[A2], .[A65536].End(xlUp)) '索引
  10.    ds(A.Value) = A.Offset(, 1)
  11. Next
  12. Ar = [A65536].End(xlUp).Resize(, 4)
  13. With Sheets(ds(Ar(1, 3)))
  14. Set A = .Rows(2).Find(Ar(1, 3)).EntireColumn.SpecialCells(xlCellTypeConstants, 1)
  15. For Each C In A
  16. ReDim Preserve Ay(s)
  17. x = .Cells(C.Row, 1).Value
  18.    Ay(s) = Array(Ar(1, 1), Ar(1, 2), Ar(1, 3), Ar(1, 4), x, C * Ar(1, 4), d(x) - C * Ar(1, 4), Date)
  19.    s = s + 1
  20. Next
  21. End With
  22. End With
  23. [A65536].End(xlUp).Resize(s, 8) = Application.Transpose(Application.Transpose(Ay))
  24. End Sub
複製代碼

作者: ANGELA    時間: 2011-2-8 14:41

回復 5# Hsieh
硏究了很久還是有不解的地方,以下是我消化及不懂的地方請指導,謝謝
    Sub tt()
Dim Ay(), C As Range, A As Range     '宣告 AY()是陣列 C 是範圍  A 是範圍
Set d = CreateObject("Scripting.Dictionary") '庫存
Set ds = CreateObject("Scripting.Dictionary") '索引
For Each A In Range([E2], [E65536].End(xlUp)) 'A 的範圍在SHEET1 的E2到最後一筆資料  庫存
d(UCase(A)) = A.Offset(, 2)  '給D(A)--G欄庫存數量 ?是否重複的零件編號會保留最後一個?
Next
With Sheets("索引")
For Each A In .Range(.[A2], .[A65536].End(xlUp)) '索引
ds(A.Value) = A.Offset(, 1)   'DS(A) 取得BOM表的名稱
Next
Ar = [A65536].End(xlUp).Resize(, 4) 'AR 指定為最後一筆的A:D
With Sheets(ds(Ar(1, 3)))  '最後一筆C欄所對應的工作表(BOM)
Set A = .Rows(2).Find(Ar(1, 3)).EntireColumn.SpecialCells(xlCellTypeConstants, 1)
'指定 A = 第二列找到SHEET1最後一筆C欄對應到的欄中有數值資料的欄位
For Each C In A
ReDim Preserve Ay(s)  '重新宣告陣列AY(S)大小
x = .Cells(C.Row, 1).Value '指定 X = A陣列中有值的A欄的零件編號
Ay(s) = Array(Ar(1, 1), Ar(1, 2), Ar(1, 3), Ar(1, 4), x, C * Ar(1, 4), d(x) - C * Ar(1, 4), Date)
'為什麼d(x)會找到最後一筆庫存資料?DICTIONARY是相同零件編號會覆蓋掉原來的值嗎?
s = s + 1
Next
End With
End With
[A65536].End(xlUp).Resize(s, 8) = Application.Transpose(Application.Transpose(Ay)) '轉置
End Sub
作者: Hsieh    時間: 2011-2-8 15:31

回復 6# ANGELA

dictionary物件,若直接給ITEM方法,他將儲存成最後被寫入的值
所以,遇到重複的KEY時,使用此法也能避免因加入相同KEY值時,Add方法產生錯誤




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