返回列表 上一主題 發帖

關於動態陣列程式碼的問題

關於動態陣列程式碼的問題

Sub yy()
Dim rng, arr, i%, j%, k%
With Sheets("1")
rng = .Range(.[c10], .[m83].End(3))
End With
ReDim arr(1 To UBound(rng), 1 To 10)
For i = 1 To UBound(rng)
If rng(i, 11) - rng(i, 10) <> 0 Then
k = k + 1
問題 >這裡的k的起始值並沒寫...這樣沒有寫的狀況是不是代表k是從0開始
For j = 1 To 6
arr(k, j) = rng(i, j)
Next
arr(k, 8) = rng(i, 8) - rng(i, 6)
arr(k, 9) = arr(k, 8) - arr(k, 6)
arr(k, 10) = rng(i, 11) + rng(i, 10)
End If
Next
Sheets("2").UsedRange = ""
Sheets("2").[a5].Resize(k, 10) = arr
問題 >這裡的k不是已經跳出for-next迴圈..且該回圈也沒有Preserve...那不是k值就沒記憶?k不就是空的嗎?
End Sub

回復 1# oak0723-1
Q1:   K未設定時為 0
k = k + 1 -> K=0+1 ->K=1
Q2:   此時 程序沒有結束  且K的值並沒有 設定為 Empty  k還是有數值的

TOP

本帖最後由 oak0723-1 於 2010-9-8 19:58 編輯

什麼是Empty
真的不太懂
小弟另外
取1個例子如附件
分別以有Preserve和無Preserve之狀況試試
執行的結果........卻讓小弟更不明白~~~

990908-2.rar (17.33 KB)

TOP

回復 3# oak0723-1
  1. Private Sub CommandButton2_Click()
  2. Dim a, r%, i%, arr()
  3.     a = Sheets("1").[c10].CurrentRegion
  4.     r = 1
  5.     For i = 1 To UBound(a)
  6.         ReDim Preserve arr(1 To 3, 1 To r)
  7.         arr(1, r) = a(i, 1): arr(2, r) = a(i, 2): arr(3, r) = a(i, 3)
  8.         r = r + 6
  9.     Next
  10.     [j9] = r
  11.        For j = 1 To UBound(arr, 2)
  12.    For i = 1 To 3
  13.       mystr = mystr & "," & arr(i, j)
  14.       Next: Next
  15.       MsgBox mystr


  16. End Sub

  17. Private Sub CommandButton3_Click()
  18. Dim a, r%, i%, arr()
  19.     a = Sheets("1").[c10].CurrentRegion
  20.     r = 1
  21.     For i = 1 To UBound(a)
  22.         ReDim arr(1 To 3, 1 To r)
  23.         arr(1, r) = a(i, 1): arr(2, r) = a(i, 2): arr(3, r) = a(i, 3)
  24.         r = r + 6
  25.     Next
  26.    [j12] = r
  27.    For j = 1 To UBound(arr, 2)
  28.    For i = 1 To 3
  29.       mystr = mystr & "," & arr(i, j)
  30.       Next: Next
  31.       MsgBox mystr
  32. End Sub
複製代碼
分別執行此2程序就知 道Preserve的效果
學海無涯_不恥下問

TOP

回復 4# Hsieh


    請問[j9]和[j12]所顯示數值的意義是?

TOP

回復 5# oak0723-1

arr是個二維陣列
ReDim arr(1 To 3, 1 To r)跟
ReDim Preserve arr(1 To 3, 1 To r)
都是在改變arr陣列的第2維數量
只不過當每次redim後若沒有使用preserve關鍵字
則會清除所有陣列元素內容
但數量還是有增加
所以你測試2個程序後有使用preserve關鍵字的程序
msgbox內容會有你要的文字
只有redim的程序都只有逗號(表示arr的內容都是空值)
所以[j9][j12]會得到相同的值
也就是arr陣列的第二維大小
學海無涯_不恥下問

TOP

本帖最後由 oak0723-1 於 2010-9-9 15:52 編輯

圖片1.jpg
2010-9-9 15:51
回復 6# Hsieh


小弟還有個疑問
在第1個測試的含有Preserve程式碼中執行後
為何在數值與數值間還會出現許多逗號?(表示資料是空的?)
例如:,a-1,b-1,c-1,,,,,,,,,,,,,,,,a-2,b-2,c-2,,,,,,,
For i = 1 To UBound(a)
        ReDim Preserve arr(1 To 3, 1 To r)
        arr(1, r) = a(i, 1)
        arr(2, r) = a(i, 2)
        arr(3, r) = a(i, 3)
        r = r + 6
Next
在以上這段程式碼中...不是把陣列的每個資料位子都指定填滿了嗎?
為何資料與資料間還有那多個逗點(小弟算了1下..有16個)

TOP

回復 7# oak0723-1


    你r每次加6你說會跑遍每個陣列元素嗎?
你要去思考變數的變化值
逗號是因為我程式中mystr是將陣列元素用逗號連接
當元素是空值時自然只產生逗號沒有值
學海無涯_不恥下問

TOP

本帖最後由 oak0723-1 於 2010-9-9 20:04 編輯

回復 8# Hsieh


  為何有空的陣列儲存位置是因為顯示是將每個陣列儲存位置都顯示
因為r每次都加6
所造成部分儲存位置顯示是空的
是這個意思嗎?
那數值跟數值間應該有5*3=15個陣列儲存位置是空的囉?
所以才顯示16個逗號
因為每2個逗號間有1個空的數值存在?
嘿嘿
懂了
感恩~~~~

TOP

本帖最後由 oak0723-1 於 2010-9-9 20:36 編輯

回復 8# Hsieh


    那在請教大大
由這個程式碼
Dim a, r%, i%, arr()
    a = Sheets("1").[c10].CurrentRegion
    r = 1
    For i = 1 To UBound(a)
        ReDim Preserve arr(1 To 3, 1 To r)
        arr(1, r) = a(i, 1): arr(2, r) = a(i, 2): arr(3, r) = a(i, 3)
        r = r + 6
    Next
    [j9] = r
得到r445
那請教
下列這個程式碼for-next後的r(紅字標示)也是445嗎
    Dim a, r%, i%, arr()
    a = Sheets("1").[c10].CurrentRegion
    r = 1
    For i = 1 To UBound(a)
        ReDim Preserve arr(1 To 3, 1 To r)
        arr(1, r) = a(i, 1): arr(2, r) = a(i, 2): arr(3, r) = a(i, 3)
        r = r + 6
    Next
    Sheets("2").[c4].Resize(r - 6, 2) = Application.Transpose(arr)
    Sheets("2").[k4].Resize(r - 6, 1) = Application.Transpose(Application.Index(arr, 3))
以上詳附件

990909-2.rar (17.2 KB)

TOP

        靜思自在 : 口說一句好話,如口出蓮花;口說一句壞話如口吐毒蛇。
返回列表 上一主題