返回列表 上一主題 發帖

[發問] 陣列大小如何以變數替代

[發問] 陣列大小如何以變數替代

[版主管理留言]
  • GBKEE(2019/3/8 10:56): 看你的程式碼沒問題,可附檔讓大家看看

我想在儲存格輸入一個數值,來決定 Br 陣列的大小,然後把陣列的元素存入字典裡,但是出現了"陣列索引超出範圍"的提示,請問各位大大是哪裡出錯了?
Dim Br() As String,k%
k = [U1].Value
Set d = CreateObject("Scripting.Dictionary")
For Each A In Range([A9], [A6000].End(xlUp))
   ReDim Preserve Br(k)
    For j = 1 To k
      Br(j) = A.Offset(, j + 159).Value
    Next j
    d(A & "") = Br(k)
Next
Jess

回復 2# 准提部林
准大,我試了,還是同樣出現偵錯。
Jess

TOP

版主GBKEE
因為這程式是要按設定好的路徑開啟另一個活頁簿去抓資料,所以範例檔很難做,我在想是不是轉資料的部分有誤,我再貼出轉資料的部分如下
    For Each A In .Range(.[F12], .[F10000].End(xlUp))
      If d.exists(A & "") Then
      A.Offset(, 15).Resize(, k) = d(A & "")
      Else: A.Offset(, 1).Value = "查無此 PN"
      End If
    Next
Jess

TOP

回復 4# jackyq
j大,同樣偵錯
Jess

TOP

貼出原始程式碼,活頁簿及工作表名稱有略做修改
  1. Option Base 1
  2. 開啟另一個非工作中活頁簿WK(以下省略).
  3. .
  4. .
  5. .

  6. With Sheets("Inventory Report")
  7. IRM1 = .[C4]
  8. IRM2 = .[C5]
  9. Set d = CreateObject("Scripting.Dictionary")
  10. Set d1 = CreateObject("Scripting.Dictionary")

  11. For Each A In .Range(.[A9], .[A6000].End(xlUp))

  12. Dim Ar(13), Br(24)
  13.     For i = 1 To 13
  14.     Ar(i) = A.Offset(, i).Value
  15.     Next i
  16.     d(A & "") = Ar
  17.    
  18.     For j = 1 To 24
  19.     Br(j) = A.Offset(, j + 159).Value
  20.     Next j
  21.     d1(A & "") = Br

  22. Next
  23. End With

  24. Workbooks("L.xlsm").Activate
  25. With Sheets("A INV Report")
  26. .[E10,G10,G11,G12:AR3000].ClearContents
  27. .[G10] = IRM1
  28. .[G11] = IRM2
  29. If .[H9] Like "* A *" Then: .[E10] = "A"
  30. If .[H9] Like "* B *" Then: .[E10] = "B"

  31.     For Each A In .Range(.[F12], .[F10000].End(xlUp))
  32.       If d.exists(A & "") Then
  33.       A.Offset(, 1).Resize(, 13) = d(A & "")
  34.       End If
  35.       If d1.exists(A & "") Then
  36.       A.Offset(, 15).Resize(, 24) = d1(A & "")
  37.       Else: A.Offset(, 1).Value = "查無此 PN"
  38.       End If
  39.     Next
  40. End With

  41. Erase Ar,Br
  42. Set d = Nothing
  43. Set d1 = Nothing
  44. End Sub
複製代碼
Jess

TOP

回復 8# jackyq
原始程式執行沒有問題,我只是想把原本的Br陣列(大小固定為24個元素)改成可依儲存格輸入的數值隨意變動大小
Jess

TOP

我修改程式時一開始就把U1的值指定給k了-->  k = [U1].Value,而U1的值確定是大於等於1的。(實際工作時U1的輸入值必定是大於等於24)
Jess

TOP

' 有可能你的 k值 出現
jackyq 發表於 2019-3-8 21:54

雖然沒有出現偵錯,但是查詢結果變成這樣
Jess

TOP

If k >= 1 Then
'        For Each a In .Range(.[A9], .[A6000].End(xlUp))
'            ReDim Br(k)
'
'            For j = 1 To k
'            Br(j) = a.Offset(, j + 159).Value
'            Next j
'            d1(a & "") = Br
'        Next
'    End If

不好意思,j大。測試已OK,是我少修改了一個地方。不過我還是不太明白為什麼加了這段
If k >= 1 Then
.
.

End If
就沒問題了
Jess

TOP

        靜思自在 : 【是否發揮了良能?】人間壽命因為短暫,才更顯得珍貴。難得來一趟人間,應問是否為人間發揮了自己的良能,而不要一味求長壽。
返回列表 上一主題