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作者: jackyq 時間: 2018-10-21 07:38
B change as E作者: jesscc 時間: 2018-10-21 08:57
B change as E
jackyq 發表於 2018-10-21 07:38
已改,可正常執行,但我的疑問是如果把第一段這句 "Option Base 1" 拿掉,整個資料傳回結果會向右偏一欄,我只知道這是陣列索引下限值的問題,如果在不設定下限值的情形下,要如何改寫原來的陣列排列?作者: jackyq 時間: 2018-10-21 10:26
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)作者: 准提部林 時間: 2018-10-21 11:00
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作者: Kubi 時間: 2018-10-21 20:02
若沒有宣告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 拿掉的話,整個資料傳回結果會向右偏一欄就是這個道理。作者: jesscc 時間: 2018-10-21 20:51
Option Explicit
Sub TEST()
Dim Arr, Brr, Crr, Y, i&, j&, Q&
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是 字典
With 工作表1: Arr = Range(.[L6], .[B65536].End(3)): End With
'↑令Arr變數是 二維陣列,以儲存格值帶入陣列中
For i = 1 To UBound(Arr): Y(Arr(i, 1)) = i: Next
'↑令Arr陣列的迴圈列第1欄值當key,item是i迴圈變數(以字典紀錄鍵值與列號)
With 工作表2
.[F7].Resize(1000, 10).ClearContents
'↑令結果表清除儲存格舊結果
Brr = Range(.[E7], .[E65536].End(3))
'↑令Arr變數是 二維陣列,以儲存格值帶入陣列中
End With
ReDim Crr(1 To UBound(Brr), 1 To 10)
'↑令宣告Crr變數是 二維空陣列,縱向範圍同Brr,橫向範圍索引號1~10
For i = 1 To UBound(Brr)
'↑設順迴圈
Q = Y(Brr(i, 1))
'↑令Q變數帶出Brr陣列1欄關鍵字在Y字典裡紀錄的Arr陣列列號
If Q = 0 Then Crr(i, 1) = "查無此PN": GoTo i01
'↑如果Q變數是 0,代表Arr陣列裡無此鍵,只在註記欄位做註記
For j = 1 To 10: Crr(i, j) = Arr(Q, j + 1): Next
'↑設迴圈將Arr陣列值帶入Crr陣列
i01: Next
[工作表2!F7].Resize(UBound(Crr), 10) = Crr
'↑令Crr陣列值從[工作表2!F7]開始,倒入儲存格中
Set Y = Nothing: Erase Arr, Brr, Crr
'↑令釋放變數
End Sub