- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
23#
發表於 2022-11-28 14:08
| 只看該作者
本帖最後由 Andy2483 於 2022-11-28 14:16 編輯
回復 18# 准提部林
謝謝 jsc0518 前輩發表此主題與範例
謝謝 准提部林前輩指導
以下學習前輩的程式碼心得,請前輩再指導!
'不了解題意不是問題!將前輩的程式碼一行行學習!就會知道題意!
'因為後學不是要解答!是學習!
Option Explicit
Sub test_1()
Dim Arr, xD, Brr(), T$, T1$, i&, n%, m%
'↑宣告變數
[02!g:i].ClearContents '不累計, 這要先清空
'↑名為"02"的工作表(以下稱:表二) G:I欄清除內容
Set xD = CreateObject("Scripting.Dictionary")
'↑令xD 是字典
Arr = Range([01!a1], [01!c65536].End(3))
'↑令Arr 是陣列!倒入 名為"01"工作表(以下稱:表一),
'表一[A1]到C欄最後有內容的最小方正區域儲存格區域的值
ReDim Brr(1 To UBound(Arr), 1 To 3)
'↑宣告Brr陣列的範圍! 縱向從1到 Arr陣列縱向最大列號,橫向從1到3
For i = 2 To UBound(Arr)
'↑設順迴圈從2到 Arr陣列縱向最大列號
T = Arr(i, 2) & "|" & Arr(i, 3)
'↑令T字串變數 是迴圈列第二欄Arr陣列位置的值連接 "|" 符號,
'再連接 迴圈列第三欄Arr陣列位置的值,(以下稱:料號|批號)
T1 = Arr(i, 1) & "|" & T
'↑令T1字串變數 是迴圈列第一欄Arr陣列位置的值連接 "|" 符號,
'再連接 T變數 (以下稱: 日期|料號|批號)
m = xD(T)
'↑令m數字變數 是字典裡 料號|批號 為key對應的item
'一開始m是初始值0
'在i=2時!其實這一行程式碼已做了兩件事
'1."A123456|R001"這字串已經藉由此行程式碼作為key,Item是字典初始值 Variant
'2.m=0
'換個方式敘述:查字典裡KEY是 "A123456|R001"的ITEM是什麼?找得到就把item給m
'如果沒這個key! 就把這字串當key放進字典裡
'如果能耐心的跟著繞迴圈理解!就會發現 m只是去查字典看 料號|批號 是在Brr陣列第幾列
xD(T1) = xD(T1) + 1
'↑令 日期|料號|批號 字串變數為key的item累加1
'以前都覺得很奇怪前面程式碼又沒有這個變數!! 為什麼會在這裡 +1 ???
'原來是以前都沒有變數初始值的觀念!所以都看不懂!
'不是宣不宣告的問題! 不檢查宣告變數Option Explicit ,不宣告程式碼還是會跑!
'只是被認定是通用變數!使用這個變數來做數學運算,他就是數字.....
'沒有正統學習,駑鈍的資質就從學習跟錯誤中求進步!
'字典好像也可以宣告他只裝數字或字串!再學習其他帖子就有機會學到了!
'謝謝論壇!謝謝各位前輩!
'所以 xD(T1) = xD(T1) + 1 只是在確定 日期|料號|批號 是不是全新組合!後方排除重複! @2
If m = 0 Then
'↑如果m數字變數是0 ??(迴圈跑到 料號|批號 是第一次在字典裡查這key m才會是0)
n = n + 1
'↑令n數字變數開始累加1 這是要放Brr陣列結果的列位,如下方 @1標註位置
'一開始n初始值是0
'這是要新增一筆 全新組合的 料號|批號 放Brr陣列結果的列位
m = n
'↑令 m數字變數值=n數字變數值
'n是要繼續累加!
'所以也要有個變數,裝現在迴圈 料號|批號 放Brr陣列結果的列位 的列號
xD(T) = n
'↑令以 料號|批號 變數為key的item= n變數值
Brr(n, 1) = Arr(i, 2) '@1
'↑將迴圈列第二欄Arr陣列位置的值倒入 Brr陣列(n數字變數值列,第一欄)位置
Brr(n, 2) = Arr(i, 3) '@1
'↑將迴圈列第三欄Arr陣列位置的值倒入 Brr陣列(n數字變數值列,第二欄)位置
End If
If xD(T1) = 1 Then '@2
'↑如果 日期|料號|批號 字串變數為key的item 等於 1
'雖然前面 都有把 料號|批號 放Brr陣列結果的列位 的列號m帶出來!
'但是 日期|料號|批號 如果重複了!這條件是不會成立的!
Brr(m, 3) = Brr(m, 3) + 1
'↑讓 Brr陣列(m數字變數值列,第三欄)位置的值累加1
End If
Next
[02!g1:i1] = [{"料號","批號","天數"}]
'↑令表二儲存格[G1:I1]依序倒入標題 "料號","批號","天數"
'又學到了!以前都只會 [02!G1:I1] = Array("料號", "批號", "天數")
With [02!g2].Resize(n, 3)
'↑以下是關於表二[G2]儲存格向下擴展n列,向右擴展3欄的範圍儲存格(以下稱:結果格)
.Value = Brr
'↑把Brr陣列的值倒入結果格
.Sort KEY1:=.Item(1), Order1:=1, _
Key2:=.Item(2), Order2:=1, Header:=2
'↑結果格做排序
'以前都以為是指定哪一儲存格做KEY1:,指定哪一儲存格做KEY2:
'原來是抓排序儲存格的欄位而已
End With
End Sub
Sub 二層次_漸增排序()
Dim xA
Set xA = [G2:I7]
xA.Sort _
KEY1:=xA.Item(1), Order1:=xlAscending, _
Key2:=xA.Item(2), Order2:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlStroke, _
DataOption1:=xlSortNormal, _
DataOption2:=xlSortNormal
End Sub |
|