Board logo

標題: [發問] 陣列大小如何以變數替代 [打印本頁]

作者: jesscc    時間: 2019-3-7 22:03     標題: 陣列大小如何以變數替代

我想在儲存格輸入一個數值,來決定 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
作者: 准提部林    時間: 2019-3-8 10:43

ReDim Preserve Br(k)
改成>> ReDim Br(1 To k)
作者: jesscc    時間: 2019-3-8 19:19

回復 2# 准提部林
准大,我試了,還是同樣出現偵錯。
[attach]30193[/attach]
作者: jackyq    時間: 2019-3-8 19:34

try .....

d(A & "") = Br
作者: jesscc    時間: 2019-3-8 19:34

版主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
作者: jesscc    時間: 2019-3-8 19:38

回復 4# jackyq
j大,同樣偵錯
作者: jesscc    時間: 2019-3-8 20:11

貼出原始程式碼,活頁簿及工作表名稱有略做修改
  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
複製代碼

作者: jackyq    時間: 2019-3-8 20:50

不是只有 Array
以下也會產生 "陣列索引超出範圍"

Workbooks("不存在的wb").Activate
Sheets("不存在的ws").Select
作者: jesscc    時間: 2019-3-8 21:40

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

本帖最後由 jackyq 於 2019-3-8 22:03 編輯

' 有可能你的 k值 出現 <=0
' 你可以試試下面

Option Base 1  

Sub QX9650_____()

Dim a()


k = 10
ReDim a(k)

k = 1
ReDim a(k)

k = 0
ReDim a(k)  '你把陣列下限設為 1 , 結果變成 Redim  a(1 to 0)

End Sub




'    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
作者: jesscc    時間: 2019-3-8 22:10

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

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

雖然沒有出現偵錯,但是查詢結果變成這樣
[attach]30194[/attach]
作者: jesscc    時間: 2019-3-8 22:54

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
就沒問題了
作者: jackyq    時間: 2019-3-8 23:17

本帖最後由 jackyq 於 2019-3-8 23:19 編輯

(1)
k=0 時
會變成 Redim Br(1 To 0)  '--> VBA 沒有辦法配置這種陣列
IF K>=1 Then ..... End if 可以防止 執行到 Redim Br(1 To 0)  

(2)
儘量不要去使用 Option Base 1 這種東西

最好直接寫成 Redim Br(1 To K)
作者: GBKEE    時間: 2019-3-9 09:08

回復 5# jesscc

我在想是不是轉資料的部分有誤

自行偵錯看看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Br() As String, k%, D As Object, A As Range, J As Integer
  4.     On Error GoTo RR   '程式有錯誤時到指定行號(RR)
  5.     k = [U1].Value
  6.     Set D = CreateObject("Scripting.Dictionary")
  7.     For Each A In Range([A9], [A6000].End(xlUp))
  8.         ReDim Preserve Br(k)
  9.         For J = 1 To k
  10.             Br(J) = A.Offset(, J + 159).Value
  11.         Next J
  12.         D(A & "") = Br(k)
  13.     Next
  14.     Exit Sub
  15. RR:
  16.    Application.VBE.Windows("區域變數").Visible = True
  17.    
  18.    Stop
  19.    '程式暫停 查看所有變數看看錯誤在哪裡
  20. End Sub
複製代碼





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