返回列表 上一主題 發帖

[發問] 字典使用問題

[發問] 字典使用問題

工作是這樣的
用工作表2的"PN"欄位去跟工作表1的"PN"欄位比對,如果有比對到相同的,就把那個PN從C欄到L欄的數值傳回到工作表2相同PN的對應位置,程式一直沒辦法正確執行,不過實在找不到哪裡有問題,能幫忙看一下問題出在哪嗎?
test.rar (13.41 KB)
Jess

回復 1# jesscc
程式碼修改如下:
  1. Option Base 1
  2. Sub test()

  3. With Sheets("工作表1")
  4. Set D = CreateObject("Scripting.Dictionary")

  5. For Each B In .Range(.[B6], .[B100].End(xlUp))
  6. Dim Ar(10)
  7.     For p = 1 To 10
  8.     Ar(p) = B.Offset(, p).Value
  9.     Next p
  10.     D(B & "") = Ar
  11. Next
  12. End With


  13. With Sheets("工作表2")
  14. .[F7:O1000].ClearContents
  15.     For Each E In .Range(.[E7], .[E100].End(xlUp))
  16.       If D.EXISTS(E & "") Then
  17.       E.Offset(, 1).Resize(, 10) = D(E & "")
  18.       Else: E.Offset(, 1) = "查無此 PN"
  19.       End If
  20.     Next
  21. End With


  22. End Sub
複製代碼

TOP

請問K大,我之前其他的工作,字典程式開頭都沒加這段 "Option Base 1", 將陣列索引值下限設為1,但都可以正常執行,為什麼在這裡沒有加就會執行錯誤?
Jess

TOP

回復 3# jesscc


    With Sheets("工作表2")
.[F7:O1000].ClearContents
    For Each E In .Range(.[E7], .[E100].End(xlUp))
      If D.EXISTS(B & "") Then
      E.Offset(, 1).Resize(, 10) = D(B & "")
      Else: E.Offset(, 1) = "查無此 PN"
      End If
    Next
End With

TOP

B change as E

TOP

B change as E
jackyq 發表於 2018-10-21 07:38


已改,可正常執行,但我的疑問是如果把第一段這句 "Option Base 1" 拿掉,整個資料傳回結果會向右偏一欄,我只知道這是陣列索引下限值的問題,如果在不設定下限值的情形下,要如何改寫原來的陣列排列?
Jess

TOP

回復 6# jesscc


    With Sheets("工作表1")
Set D = CreateObject("Scripting.Dictionary")

For Each B In .Range(.[B6], .[B100].End(xlUp))
Dim Ar(10)
    For p = 1 To 10
    Ar(p) = B.Offset(, p).Value
    Next p
    D(B & "") = Ar
Next
End With








Dim Ar(10)  change as Dim Ar(1 To 10)

TOP

Sub Test2()
Dim Arr, Brr, xD, i&, j%, U&
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([工作表1!L6], [工作表1!B65536].End(xlUp))
For i = 1 To UBound(Arr):  xD(Arr(i, 1)) = i: Next

[工作表2!F7:O2000].ClearContents
Brr = Range([工作表2!O7], [工作表2!E65536].End(xlUp))
For i = 1 To UBound(Brr)
    U = xD(Brr(i, 1)): Brr(i, 2) = "查無此PN": If U = 0 Then GoTo 101
    For j = 2 To 11: Brr(i, j) = Arr(U, j): Next
101: Next i
[工作表2!E7:O7].Resize(UBound(Brr)) = Brr
End Sub

TOP

回復 3# jesscc

若沒有宣告Option Base 1的話,則底下的Dim Ar(10)會包含Ar(0)、Ar(1)、Ar(2)、Ar(3)...、Ar(10)共有11個陣列元素。
若宣告Option Base 1的話,則Ar(10)陣列只包含Ar(1)、Ar(2)、Ar(3)...、Ar(10),10個陣列元素。
若Option Base 1 拿掉的話,整個資料傳回結果會向右偏一欄就是這個道理。

TOP

回復 9# Kubi
謝謝K大,了解了。
Jess

TOP

        靜思自在 : 不怕事多,只怕多事。
返回列表 上一主題