- 帖子
- 1567
- 主題
- 40
- 精華
- 0
- 積分
- 1591
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 100
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2026-2-2
|
4#
發表於 2023-11-30 07:59
| 只看該作者
回復 2# 准提部林
謝謝論壇,謝謝前輩指導
後學藉此帖學習前輩的方案,學習心得註解如下,請前輩再指導
資料表:
執行結果:
納入名稱:
Sub 轉換()
Dim Arr, Brr, i&, R&, N&, j%, T1$, T2$
'↑宣告變數:(Arr,Brr)通用型變數,(i,R,N)長整數,j短整數,(T1,T2)字串變數
Arr = Sheets("原始檔案").UsedRange
'↑令Arr變數是裝入 "原始檔案"工作表有使用儲存格值的二維陣列
ReDim Brr(1 To 50000, 1 To 4)
'↑宣告Brr是二維空陣列,縱向索引號(1~500000),橫向索引號(1~4)
For i = 1 To UBound(Arr)
'↑設順迴圈!i從1 到Arr陣列縱向最大索引列號
If Arr(i, 1) = "料件編號" Then R = i: GoTo i01
'↑如果i迴圈列1欄Arr陣列值是 "料件編號"字串?
'True就令R變數同i變數值 (這是要記錄每個段落的工作站名稱所在的列號)
'最後跳到標示 i01位置繼續執行
If Not Arr(i, 4) Like "JM##-#########" Then GoTo i01
'↑如果i迴圈列4欄Arr陣列值不是 "JM##-#########"規則的字串?
'True就跳到標示 i01位置繼續執行
For j = 5 To UBound(Arr, 2)
'↑設順迴圈!j從5 到Arr陣列橫向最大索引欄號
If Val(Arr(i, j)) = 0 Then GoTo j01
'↑如果i迴圈列j迴圈欄Arr陣列值轉成的數值是 0,就跳到標示 j01位置繼續執行
N = N + 1
'↑令N變數累加1 (寫入資料的索引列號)
Brr(N, 1) = Arr(i, 1): Brr(N, 2) = Arr(i, 4)
Brr(N, 3) = Arr(R, j): Brr(N, 4) = Arr(i, j)
'↑令Arr陣列資料 寫入Brr陣列中
j01: Next j
i01: Next i
Call 清除: If N = 0 Then Exit Sub
'↑執行副程式 Sub 清除()
'如果N變數是0 (代表N變數是所宣告的長整數初始值 0),就結束程式執行
[轉換結果!A2].Resize(N, 4) = Brr
'↑將Brr陣列值寫入儲存格中
[轉換結果!A1].Resize(N + 1, 4).Name = "My_Data"
'↑令指定範圍儲存格以 "My_Data" 字串為名,納入名稱中
End Sub
Sub 清除()
With Sheets("轉換結果")
If .AutoFilterMode Then .AutoFilterMode = False
'↑如果有自動篩選功能? True就令篩選功能關閉
https://learn.microsoft.com/zh-t ... heet.autofiltermode
.UsedRange.Offset(1, 0).EntireRow.Delete
'↑令除了標題列以外的已使用儲存格刪除
End With
End Sub |
|