- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-5-5
|
5#
發表於 2023-1-3 15:06
| 只看該作者
本帖最後由 Andy2483 於 2023-1-3 15:15 編輯
回復 1# sillykin
謝謝前輩發表此主題與範例
後學藉此主題學習字典與陣列得到多種知識與經驗,以下是後學練習VBA方式的方案,請前輩參考
請前輩們指導,謝謝
執行前:
結果與警訊1:
結果與警訊2:
Option Explicit
Sub 依日期來分別統計公司人數_20230103_1()
Dim R&, i&, j&, N&, Q&, T1$, T2$, T4$, Qv$, Y, Brr, Crr, C, Sh1, Sh2
'↑宣告變數:(R,i,j,N,Q)是長整數變數,(T1,T2,T4,Qv)是字串變數,其它是通用型變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y是 字典
Set Sh1 = Sheets("資料庫")
'↑令Sh1是 "資料庫"工作表
Set Sh2 = Sheets("總表單")
'↑令Sh2是 "總表單"工作表
Brr = Sh1.Range("A3:N" & Split(Sh1.UsedRange.Address, "$")(4))
'↑令Brr是二維陣列!倒入[A3]到N欄最後列儲存格
R = Sh2.Cells(Rows.Count, "A").End(3).Row
'↑令R這整數變數是 "總表單"工作表A欄最後有內容儲存格列號
C = Sh2.Cells(1, Columns.Count).End(1).Column
'↑令C這整數變數是 "總表單"工作表第1列最右側有內容儲存格欄號
Range(Sh2.Cells(R, 1), Sh2.Cells(1, C)).Offset(1, 1).ClearContents
'↑令"總表單"工作表[A1]到R列C欄儲存格範圍偏移往下1列,偏移往右1欄儲存格值清除
Crr = Range(Sh2.Cells(R, 1), Sh2.Cells(1, C))
'↑令Crr是二維陣列!倒入"總表單"工作表[A1]到R列C欄儲存格值
For i = 2 To UBound(Crr, 2)
'↑設順迴圈!i從2到Crr陣列橫向最大索引欄號數
Y(Crr(1, i) & "|C") = i
'↑令1列i迴圈欄Crr陣列值連接"|C"當key,item是i迴圈數,放入Y字典裡
Next
For i = 2 To UBound(Crr)
'↑設順迴圈!i從2到Crr陣列縱向最大索引列號數
Y(Crr(i, 1) & "|R") = i
'↑令i迴圈列1欄Crr陣列值連接"|R"當key,item是i迴圈數,放入Y字典裡
Next
For Each C In [{2,10}]
'↑設順迴圈!令C是一維陣列裡的一員
For R = 1 To UBound(Brr)
'↑設順迴圈!令R從1到Brr陣列縱向最大索引列號數
T1 = Trim(Brr(R, C))
'↑令T1是 R迴圈列C迴圈欄Brr陣列值去除字串頭尾的空白字元
T2 = Trim(Brr(R, C + 2))
'↑令T2是 R迴圈列C+2迴圈欄Brr陣列值去除字串頭尾的空白字元
T4 = Trim(Brr(R, C + 4))
'↑令T4是 R迴圈列C+4迴圈欄Brr陣列值去除字串頭尾的空白字元
If T1 = "" Or T4 = "" Then GoTo PS
'↑如果T1字串變數是空字元或 如果T4字串變數是空字元,就跳到PS:位置繼續執行
If Y(T1 & "|C") <> "" And Y(T4 & "|R") <> "" Then
'↑如果用T1變數連接"|C"查Y字典不是空字元 而且 用T4變數連接"|R"查Y字典不是空字元??
If T2 <> "" Then
'↑如果T2變數不是空字元?
i = Y(Trim(Brr(R, C + 4)) & "|R"): j = Y(Trim(Brr(R, C)) & "|C")
'↑令i是 申請日去除頭尾空白字元後連接"|R"查Y字典得到的item值
'↑令j是 單位/分社去除頭尾空白字元後連接"|C"查Y字典得到的item值
Crr(i, j) = Crr(i, j) + 1
'↑令i列j欄Crr陣列值 +1
Else
N = N + 1
'↑否則令N整數變數+1
End If
ElseIf Y(T1 & "|C") = "" And Y(T4 & "|R") <> "" Then
'↑否則如果T1字串變數連接"|C"查Y字典地item值是空字元,
'而且T4字串變數連接"|R"查Y字典不是空字元
Q = Q + 1
'↑令Q整數變數+1
Qv = Qv & "," & T1
'↑令Qv這字串變數是 自身值連接",",再連接T1字串變數
End If
PS:
Next
Next
Sh2.[A1].Resize(UBound(Crr), UBound(Crr, 2)) = Crr
'↑令"總表單"工作表向下擴展Crr陣列縱向最大索引列號數,
'向右Crr陣列橫向最大索引欄號數,這範圍儲存格值以Crr陣列值帶入
Application.Goto Sh2.[A1]
'↑令儲存格游標跳到 "總表單"工作表[A1]
If N > 0 Then MsgBox "共有 " & N & "筆資料沒有姓名,未列入統計"
If Q > 0 Then MsgBox "共有 " & Q & "單位/分社在 總表單找不到" & Qv
Set Y = Nothing
Set Brr = Nothing
Set Crr = Nothing
'↑釋放變數
End Sub |
|