- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
8#
發表於 2023-12-13 11:35
| 只看該作者
本帖最後由 Andy2483 於 2023-12-13 12:51 編輯
謝謝論壇,謝謝各位前輩
後學藉此帖清楚陣列索引號規則,學習方案下,請各位前輩指教
執行前:
[F1].Resize(UBound(Crr) , 3) = Crr:
[F1].Resize(UBound(Crr) + 1, 3) = Crr:
Option Explicit
Sub TEST()
Dim Brr, Crr, Q, i&
'↑宣告變數
Brr = Range([A2], [A65536].End(3))
'↑令Brr變數是帶入儲存格值的二維陣列
ReDim Crr(UBound(Brr), 1 To 3)
'↑宣告Crr變數是 二維空陣列,縱向索引號從 0 到 Brr陣列最大索引列號,
'UBound(Brr) 同 0 To UBound(Brr) ,0 To 可以省略
'橫向索引欄號從 1 到 3
Q = [{"t","W","L"}]
'↑令Q變數是一維陣列,Q(1)="t",Q(2)="W",Q(3)="L"
'=[{~}]這樣方式的一維陣列沒有0索引號
'Q = Array("t", "W", "L"):這樣方式的一維陣列有0索引號
Crr(0, 1) = Q(1): Crr(0, 2) = Q(2): Crr(0, 3) = Q(3)
'↑此Crr陣列0索引號列是用來放標題列,這樣的方式較不會影響迴圈的設計,
'迴圈數 源頭陣列資料對齊同一個 迴圈數 結果陣列資料
For i = 1 To UBound(Brr)
'↑設順迴圈將資料寫入結果陣列裡
If Not Brr(i, 1) Like "*t#*W#*L#*" Then GoTo i01
Crr(i, 1) = Val(Split(Brr(i, 1), Q(1))(1))
Crr(i, 2) = Val(Split(Brr(i, 1), Q(2))(1))
Crr(i, 3) = Val(Split(Brr(i, 1), Q(3))(1))
i01: Next
[F1].Resize(UBound(Crr) + 1, 3) = Crr
'↑令結果陣列寫入儲存格裡,
'UBound(Crr) + 1 ,這+1的原因是Resize()擴展縱向橫向儲存格範圍,照習慣是同陣列最大索引號範圍,
'但是Crr陣列有0索引號,且UBound(Crr)是Crr陣列最大索引列號,所以必須+1 :
'貼入儲存格的方式是以陣列的最左上角資料開始向下/向右所需範圍貼入儲存格,
'最左上角陣列開始索引號是(1,1),就從 (1,1)陣列的最左上角資料開始下/右寫入
'最左上角陣列開始索引號是(0,1),就從 (0,1)陣列的最左上角資料開始下/右寫入
'所以Crr陣列有0索引列號,就必須以陣列最大列號+1的儲存格範圍寫入儲存格中,才會完整
End Sub
PS:陣列裡有沒有(0,0) (1,0) (0,1)這些索引號,全憑其宣告
1.ReDim Crr(100,100) 同 ReDim Crr(0 To 100,0 To 100) ,索引號是從0開始,
如果所想要的開始索引號縱向橫向都要從1開始,就必須ReDim Crr(1 To 100,1 To 100)
2.Brr = Range([A1], [A65536].End(3))
令Brr變數是帶入儲存格值的二維陣列,這樣的二維陣列,其陣列索引號從(1,1)開始,而且沒有(0,0) (1,0) (0,1)這些索引號 |
|