這篇來聊一下運輸問題裡很常見的「西北角法」。
西北角法的玩法很單純,就是從運輸表左上角(也就是所謂的西北角)開始分配數量,一路往右、往下走,把供給跟需求配到剛好。
西北角法它的好處是:
算法超直覺、步驟固定。
很快就能拼出一個「可行解」,程式也好寫。
念書念到這個,想了一下發願AI,這種規則這麼機械,很適合交給 AI 生個雛形,再用 VBA 包一包來玩看看。
教科書習題:
喜歡攝影的我,喜歡到處拍拍照,吃點當地的特色食物。 跟朋友聊天之餘,推薦我寫成網誌跟大家分享。 沒外出的日子,喜歡在家當隱性宅,寫程式看看書,追劇。 希望我的手札文,不會讓你翻桌 XD
這篇來聊一下運輸問題裡很常見的「西北角法」。
西北角法的玩法很單純,就是從運輸表左上角(也就是所謂的西北角)開始分配數量,一路往右、往下走,把供給跟需求配到剛好。
西北角法它的好處是:
算法超直覺、步驟固定。
很快就能拼出一個「可行解」,程式也好寫。
念書念到這個,想了一下發願AI,這種規則這麼機械,很適合交給 AI 生個雛形,再用 VBA 包一包來玩看看。
教科書習題:
簡單比較VBA與RPA:
|
項目 |
VBA |
|
適用範圍 |
主要用於Office內部(如Excel、Word) |
|
技術本質 |
程式語言(需編寫/錄製巨集) |
|
自動化對象 |
軟體內資料操作及邏輯處理為主 |
|
擴展性 |
主要侷限在該應用程式框架 |
|
項目 |
RPA |
|
適用範圍 |
跨系統、跨應用軟體(不限於Office) |
|
技術本質 |
工具平台(拖拉點選,低程式碼或無程式碼) |
|
自動化對象 |
擬人化多系統流程操作,模仿人工點擊/輸入 |
|
擴展性 |
可串接多種系統、API、網頁,彈性高 |
• 易於學習,特別是Excel或Office用戶[1][2]。• 直接內建於Microsoft Office,不需額外開發環境和成本[3][2]。• 自動化複雜Excel任務、可客製流程及編寫自定函數[1]。• 社群龐大,學習資源豐富,疑難雜症容易找到解答[4]。• 執行效率高,對內部資料處理特別快速準確[5][1]。
• 僅限辦公室應用程式範圍使用(如Excel, Word)[6]。• 對大型或複雜專案維護不易,程式碼擴展性有限[3][6]。• 安全風險較高,易受惡意巨集影響,需特別管理[3]。• 用戶界面較簡單,不支援現代程式語言新功能[3]。
• 可自動化跨系統、跨平台的高重複性、規則明確任務[7][8][9]。• 介面友善,多為拖拉點選設計,對無程式底子的人也可快速上手[10][11][8]。• 支援24 小時無間斷作業,有效提升生產力與準確率[7][8][9]。• 有審計記錄追蹤、合規性高,減少人為錯誤與法規風險[7][8]。• 系統更新彈性高,能隨需求快速擴展與調整,應變能力佳[8][12]。
• 對複雜創意或判斷性高的流程較難自動化,適用於高度標準化任務[7][12]。• 初期投資成本較高(軟體購買、培訓、部署)[12][13]。• 維護/更新工作量較重,尤其在業務流程頻繁變動時[7][13]。• 需依賴既有系統與軟體穩定性,系統若異常會影響自動化流程[12][13]。• 數據安全需加強,資料外流風險不可忽視[7][13]。
o主要限於Office應用程式(如Excel、Word、Access)內部[15][16][17]。例如自動填表、資料處理、製作報表等,都是針對Office軟體內的功能操作。VBA無法直接跨不同軟體或網頁系統進行自動化。
o適用於針對單一文件或單一程式內部的重複性操作。
o可自動模擬人工在不同應用程式之間的操作,包括瀏覽器、ERP系統、郵件、資料庫、檔案管理等[18][19][20]。
o 支援跨平台、跨系統的整合、批次處理、複雜工作流程。例如:從網頁抓數據,匯入ERP,再將結果貼到Excel,最後發送郵件,整個流程皆可完全自動化。
o強調模仿人類操作,可以涵蓋絕大多數需要人員在電腦前點選、輸入、複製貼上的例行事務。
•高度客製化與程式邏輯:VBA可直接撰寫複雜的演算法與邏輯,能靈活處理多變條件、巨量資料迴圈、資料清理、統計運算、批次處理等。•整合Excel函數與內建工具:可結合Excel資料分析(如樞紐分析表、巨集、VLOOKUP等函數)與VBA自定程式,大幅提升自動化與分析效率。•運算速度高、即時互動:對大量資料的分析速度快,適合需要頻繁試算、即時回饋的分析流程。•程式控制力強:對分析步驟、細節與結果展現能完全控制,方便做進階數據處理及二次開發。•成本低、門檻低:無須額外購買分析工具,且在Office環境下即可部署。
RPA的定位與侷限
•主要聚焦流程自動化:RPA符合彩現GUI操作等重複勤務,但對於複雜數據運算與深度資料分析,常需仰賴外部程式(如Excel、SQL、Python等),本身並不適合進行大量、進階數據處理。•設計導向「搬運」與「整合」:適用於跨軟體流程串接,例如自動抓取數據、傳遞檔案,但分析邏輯若過於複雜,維護成本高且易出錯。•需搭配專業工具:遇到專業數據分析,往往是RPA自動整理資料,再交由VBA、Python、BI工具等進行專業分析。
•複雜數據分析首選VBA:
若分析重心在Office內部或需高度自訂演算法,VBA較易滿足各種進階計算需求。
如須自動化跨平台、跨系統的標準流程,或單純搬運數據(非大量算法分析),RPA發揮優勢。
結論:
針對複雜數據分析,VBA因可深度客製邏輯、靈活快捷、成本低,更加適合內部資料分析用途,RPA則多用於整體流程自動化,複雜運算仍應交由VBA等程式輔助處理。兩者也可互補使用,提升企業自動化與分析能力。
延伸:
如果今天數據都在資料庫上,那VBA與RPA 誰對數據自動化以及流程自動化,比較有優勢?
數據自動化(資料查詢、處理與計算)
• VBA的優勢:
o 透過ADO/OLEDB,可以直接連接各類關聯式資料庫(如SQL Server、MySQL、Access等)批量查詢、寫入、批次運算,並將結果自動產出在Excel等Office報表中[42][43]。
o 適合進行複雜運算、資料匯出與格式化、即時互動分析,自動生成圖表、樞紐、報表等。
o 編程自由度高,可設置複雜邏輯與資料檢查機制。
• RPA的優勢(數據處理):
o RPA可自動模擬人工操作資料庫管理工具(如開啟SQL Management Studio),但面對大量數據處理/分析,必須呼叫外部程式或讓RPA“橋接”Excel、Python等軟體做深層數據處理[44][45]。
o 若只是自動搬運、同步、啟動批次SQL語句,RPA可以整合多系統,但對進階資料分析相對侷限。
總結:
純粹數據自動化、複雜資料查詢與報表產出時,VBA具備高度客製、速度快、整合報表與資料視覺化的優勢。
流程自動化(跨系統資料流、流程整合)
• RPA的優勢:
o 可自動化整體流程,例如:「設定自動啟用資料庫查詢→下載SQL結果→開啟ERP收資料→自動寄信報告」,覆蓋多個不同的軟體、網站或伺服器,大幅節省人工手續[44][45][46]。
o 貼近實際工作流程,能串接Excel、郵件、ERP、雲端服務等,讓「操作流」自動化,特別適合流程鏈較長、多系統協同的情境。
o 不需理解複雜程式碼,設計流程圖即可。
• VBA的侷限(流程自動化):
o 侷限在Office環境,自動化對象以Excel等內部數據處理為主,跨系統能力不足。
o 雖可連資料庫,但難以自動化網頁、ERP、第三方平台流程。
總結:若以「流程自動化」(端到端操作、多平台串接)為目標,RPA明顯優於VBA。
綜合建議
• 重視數據處理效率、資料分析與報表—請選擇VBA。
• 強調整體流程自動化、跨系統資料自動搬運—請選擇RPA。
• 兩者也能「互補」:資料庫查詢用VBA,流程觸發、跨系統串接則交給RPA,讓企業數位流程發揮最大效益[44][45][46][42]。
REFERENCE:
1. https://www.taoyuancollege.com.tw/web/news1_4_mobil.php?id=37
2. https://acaccountinghk.com/startup/vba/
3. https://blog.csdn.net/nbspzs/article/details/139365727
4. https://www.coreenginepro.com/python-vs-vba/
5. https://www.allion.com.tw/article-automation-lab/
6. https://www.ai-indeed.com/encyclopedia/9205.html
7. https://solwen.ai/posts/what-is-rpa
8. https://www.kdan.com/zh-tw/blog/about/what-is-rpa/
9. https://perform-global.com/blog/what-is-rpa
10. https://www.automationanywhere.com/tw/rpa/excel-automation
11. https://www.books.com.tw/products/0010924204
12. https://nabi.104.com.tw/posts/nabi_post_090c84b9-214c-465d-84ae-169683bc8b1e
13. https://vocus.cc/article/63fe0555fd89780001009dc3
14. https://vocus.cc/article/636e5357fd89780001045fb0
15. https://www.ai-indeed.com/encyclopedia/9205.html
16. https://www.taoyuancollege.com.tw/web/news1_4_mobil.php?id=37
17. https://acaccountinghk.com/startup/vba/
18. https://solwen.ai/posts/what-is-rpa
19. https://www.kdan.com/zh-tw/blog/about/what-is-rpa/
20. https://perform-global.com/blog/what-is-rpa
21. https://botpress.com/tw/blog/document-workflow-automation
22. https://blog.tibame.com/?p=23749
23. https://raymondhouch.com/lifehacker/digital-workflow/automation-tools-review/
24. https://www.ragic.com/intl/zh-TW/blog/466/no-code-integration-tools-comparison-n8n-make-zapier-ifttt
25. https://perform-global.com/blog/ai-powered-ocr-uipath-rpa
26. https://thunderbit.com/zh-Hant/blog/best-ai-for-data-entry
27. https://www.kscthinktank.com.tw/blog/流程自動化/
28. https://shengren.com.tw/辦公室自動化/
29. https://mile.cloud/zh/resources/blog/understand-data-pipeline-automation-etl-data-analytics_610
30. https://nicrow.com/automation/make-automation-intro/
31. https://www.metaage.com.tw/news/technology/323
32. https://www.microsoft.com/zh-tw/power-platform/products/power-automate
33. https://botpress.com/tw/blog/no-code-automation
34. https://blog.notimenocode.com/p/nocode-tools-guidance
35. https://www.yourator.co/articles/968
36. https://raymondhouch.com/lifehacker/digital-workflow/automation-tools-review/
37. https://www.ragic.com/intl/zh-TW/blog/466/no-code-integration-tools-comparison-n8n-make-zapier-ifttt
38. https://www.cybozu.tw/2025/02/20/無需程式經驗-透過-kintone-以no-code-low-code-無程式碼-低程式碼-快速打造應用程式/
39. https://www.salesforce.com/tw/platform/low-code-development-platform/
40. https://www.sap.com/taiwan/products/technology-platform/build/what-is-low-code-no-code.asset-id-2c0d1fd2-477e-0010-bca6-c68f7e60039b.html
41. https://www.sap.com/taiwan/products/technology-platform/build/what-is-low-code-no-code.html
42. https://acaccountinghk.com/startup/vba/
43. https://www.taoyuancollege.com.tw/web/news1_4_mobil.php?id=37
44. https://solwen.ai/posts/what-is-rpa
45. https://www.kdan.com/zh-tw/blog/about/what-is-rpa/
46. https://perform-global.com/blog/what-is-rpa
原始問題連結
小編改了一下問題,做B欄的顏色要根據D欄和C欄的數值條件來變色:
D2 超過 32%,B5 變黃色
D7 超過 50 且 C7 超過 25%,B7 變黃色
以下是對應的 VBA 程式碼,會針對 D1:D34 進行判斷與上色。你可以將這段程式碼貼到工作表的 VBA 編輯器(建議放在該工作表的程式碼頁),然後執行即可:
Sub HighlightCColumn()
Dim i As Integer
Dim ws As Worksheet
Set ws = ActiveSheet
' 先清除舊的顏色
ws.Range("B1:B34").Interior.ColorIndex = xlNone
For i = 1 To 34
' E欄超過32%(0.32),C欄變黃色
If ws.Cells(i, "D").Value > 0.32 Then
ws.Cells(i, "B").Interior.Color = vbYellow
' D欄超過50且C欄超過25%,C欄變黃色
ElseIf ws.Cells(i, "D").Value > 50 And ws.Cells(i, "C").Value > 0.25 Then
ws.Cells(i, "B").Interior.Color = vbYellow
End If
Next i
End Sub
說明:
這段程式碼會依序檢查 d1 到 D34 的每一列。
只要符合任一條件,就會將該列的 B 欄設為黃色。
執行時會先清除原有顏色,避免重複上色。
如需自動監控變化,可將這段程式碼放到 Worksheet_Change 事件中,讓每次資料變動時自動執行。
自己最近眼睛不好,想要快速判斷資料的高跟落,不想單獨靠眼睛搜尋,所以搞了這個名堂。
讓程式幫我判斷後,畫個箭頭給我讓我無腦閱讀資料,哈。
所以簡單分享這篇。
----------------
Set shp = ws.Shapes.AddConnector(msoConnectorStraight, x2, y2, x1, y1)的設定,如果x1 y1與x2 y2 對調就可以轉換箭頭方向了。
autofilter :是針對既有資料,設定一定程度的條件,此條件可以是單一也可以是多條件後,開始做篩選,但前提是excel本身已準備好資料讓你篩選。
mysql 語法:可以執行最基本的條件查詢、計算後,顯示結果。
比較不同平台,一個是excel,一個是mysql。
其實小編相信很多網路大神一定會說,這還需要比較?
小編想要整理出,不同資料筆數之間差異,當然學習歷程時間也是一個差異,畢竟學excel跟學sql還是有點本質上的不同,但有ai後,似乎有打雞血的up點。
所以小編,以自己常在整理的資料,來做簡單比較:
目前小編每個月會根據台灣上市櫃公司,做產業別資料整理,隨著時間拉長,資料整理期間自然越來越長,就選這個常在整理的資料來比較吧!!
條件:
查詢110/01~110/12的合計15個產業別各月產業別營收
結果:
EXCEL,133.5秒
SQL,76.46秒;
小編進一步改成直接查詢105/01~114/05拉大13倍查詢範圍,變成71.203,決定在測一次70.698。
比較後,小編呵呵笑了,原來比較後,也確認了是EXCEL寫資料表時間最耗時,
對SQL來說擴大13倍查詢根本不是問題。
小編就不測試EXCEL擴大13倍後,需要花費多少時間了。
也有另外一個可能,就是小編寫的AUTOFILTER 效率太差,應該拿去效率最好的方法去PK阿。
QQ。
方法有很多,熟悉有幾個,能學好多個,答案靠己尋。
附上小編自己的VBA:(很差,參考)
SUB C1' SQL
shell "powercfg.exe setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c " '高效能
On Error GoTo LINE1
ActiveSheet.Range("A:G").Clear
S1 = ActiveSheet.Range("aa2000").End(xlUp).Row
data = INCOME_SQL_SUM_catrgory("105/01", "114/05")
For i = LBound(data, 1) To UBound(data, 1)
For j = LBound(data, 2) To UBound(data, 2)
If IsNull(data(i, j)) Then data(i, j) = "" ' 替換Null為空字串
If IsNumeric(data(i, j)) Then data(i, j) = CStr(data(i, j)) ' 統一轉文字型態
Next j
Next i
ActiveSheet.Range("A1").Resize(UBound(data, 2), UBound(data, 1) + 1) = WorksheetFunction.Transpose(data)
For i = 1 To UBound(data, 2) + 1 Step 1
If ActiveSheet.Range("C" & i + 1) <> "" And ActiveSheet.Range("C" & i + 1) <> "" And _
ActiveSheet.Range("C" & i + 1) <> 0 And ActiveSheet.Range("C" & i + 1) <> 0 Then
ActiveSheet.Range("F" & i + 1).Value = (val(ActiveSheet.Range("C" & i + 1).Value) - _
val(ActiveSheet.Range("D" & i + 1).Value)) / val(ActiveSheet.Range("D" & i + 1).Value) End If
Next
TOPIC = Array("產業別", "月份", "當月營收", "去年當月營收", "新高家數", "年增減(%)")
ActiveSheet.Range("A1:F1").Insert
ActiveSheet.Range("A1:F1") = TOPIC
s3 = ActiveSheet.Range("B1000000").End(xlUp).Row
ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(s3, 7 + 2)).Sort key1:=ActiveSheet.Range("a" & ":" & "a"), order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlStroke, DataOption1:=xlSortNormal
Beep
Beep
Beep
MsgBox Timer - T
Exit Sub
LINE1:
MsgBox "ERROR"
Resume
END SUB
SUB C2 'AUTOFILTER
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' Note: this is a sheet-level setting.
' ActiveSheet.DisplayPageBreaks = False
SOURCE = Excel.ActiveWorkbook.Name
Shell "powercfg.exe setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c " '高效能
On Error GoTo LINE1
Sheets("產業別").Range("A:E").Clear
S1 = Sheets("產業別").Range("aa2000").End(xlUp).Row
list_data = Sheets("產業別").Range("aa1:aa" & S1)
list_data = 移除重複(list_data)
S1 = Sheets("產業別").Range("z2000").End(xlUp).Row
list_data2 = Sheets("產業別").Range("z1:z" & S1)
list_data2 = 移除重複(list_data2)
Sheets("產業別").Range("a:e").Clear
ADD = 2
TOPIC = Array("產業別", "月份", "當月營收", "去年當月營收", "年增減(%)")
Sheets("產業別").Range("A1:E1") = TOPIC
SOURCE = Excel.ActiveWorkbook.Name
For j = LBound(list_data2) To UBound(list_data2) Step 1 '(J) <> ""
Sheets("月營收").Activate
'XX1 = Application.CountA(Sheets("月營收").Range("A:a")) '.End(xlUp).Row
XX1 = Sheets("月營收").Range("B1000000").End(xlUp).Row
Sheets("月營收").Range("$a$1:$J$" & XX1).AutoFilter Field:=3, Criteria1:= _
"=" & list_data2(j) '
For O = LBound(list_data) To UBound(list_data) Step 1
Sheets("月營收").Range("$a$1:$J$" & XX1).AutoFilter Field:=4, Criteria1:= _
"=" & list_data(O) '
Set 當月營收 = Sheets("月營收").Range("E1:E" & XX1).SpecialCells(xlCellTypeVisible)
Set 當月營收12高 = Sheets("月營收").Range("L1:L" & XX1).SpecialCells(xlCellTypeVisible)
Set 去年當月營收 = Sheets("月營收").Range("G1:G" & XX1).SpecialCells(xlCellTypeVisible)
Sheets("產業別").Cells(ADD, 1).Value = list_data2(j)
Sheets("產業別").Cells(ADD, 2).Value = list_data(O)
Sheets("產業別").Cells(ADD, 3).Value = Application.Sum(當月營收)
Sheets("產業別").Cells(ADD, 4).Value = Application.Sum(去年當月營收)
Sheets("產業別").Cells(ADD, 6).Value = Application.Sum(當月營收12高)
On Error Resume Next
Sheets("產業別").Cells(ADD, 5).Value = (Sheets("產業別").Cells(ADD, 3).Value - Sheets("產業別").Cells(ADD, 4).Value) / Sheets("產業別").Cells(ADD, 4).Value
On Error GoTo LINE1
ADD = ADD + 1
Next
Sheets("月營收").AutoFilterMode = False
Next
Windows(SOURCE).Activate
income_row_年增率 = Sheets("產業別").Range("a" & "65536").End(xlUp).Row
Set myRange_R = Sheets("產業別").Range("A1:E" & income_row_年增率)
myRange_R.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
Set myRange_R = Nothing
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationAutomtic
Application.EnableEvents = True
END SUB
內文提到透過madedit的修改,可以隱藏module,筆者測試了之後,發現.xlsm無法做修改;靈機一動把檔案先存成.xls後,透過madedit的修改完成後,再另存成.xlsm,測試後功效相同,哈。
雖然還不知道這"保護",能達到那些程度的"保護"來避免有心人士,但還滿好玩的。
小編應該會再追加主動保護機制方式,保護有商業色彩的module。
自動設定格式,點選儲存格,自動設定成指定格式。
指定成正數為0.00格式,負數設定成(設定紅色)
Private Sub Worksheet_SelectionChange(ByVal TARGET As Range)
If ISNUMERIC(TARGET )=TRUE Then
ACTIVESHEET.RANGE(TARGET.ADDRESS).NumberFormatLocal = "0.00;[紅色](0.00)"
End If
End
OR
Private Sub Worksheet_SelectionChange(ByVal TARGET As Range)
If ISNUMERIC(TARGET )=TRUE Then
TARGET.NumberFormatLocal = "0.00;[紅色](0.00)"
End If
End Sub
小編很多台電腦,有時候會存在EXCEL版本不同,不同函數運算要特別掌握的情況,但透過掌握EXCEL版本會省掉很多BUG。MSDN
EX:
OFFICE 2010 :
DEBUG.PRINT Application.Version
顯示:14.0
以此類推,可以透過這個數字來掌握版本。
以下是不同 Excel 版本對應的 Application.Version 回傳值列表:
Excel 5: "5.0"
Excel 95: "7.0"
Excel 97: "8.0"
Excel 2000: "9.0"
Excel 2002 (XP): "10.0"
Excel 2003: "11.0"
Excel 2007: "12.0"
Excel 2010: "14.0"
Excel 2013: "15.0"
Excel 2016: "16.0"
Excel 2019: "16.0"
Excel 365 (Microsoft 365): "16.0"
小編常利用這個功能,在點選儲存格後,自動啟動特定的SUB或是FUNCTION,逐一做進一步的應用。
例如下面這樣,若儲存格具備註解,則啟動IF條件式內的敘句。
解說,TARGET 本身即為RANGE物件,所以基本上RANGE 的屬性與方法都具備,可以玩得應用很多,小編僅是舉一個簡單的例子。
Private Sub Worksheet_SelectionChange(ByVal TARGET As Range)
If Not TARGET.Comment Is Nothing Then
If InStr(TARGET.Comment.Text, "I:\") > 0 Then '含有指定路徑
Call OpenURL(TARGET.Comment.Text) '透過SUB 開啟路徑檔案
End If
End If
End Sub
Sub OpenURL(url)
'Dim url As String
shell "cmd /c start " & url, vbNormalFocus '透過SHELL方式開啟檔案。
End Sub
小編常利用這個功能,在篩選用,透過 SpecialCells(xlCellTypeVisible)方式,蒐集篩選後的資料集方式,逐一做進一步的應用。
例如下面這樣,透過SET方式,則可以透過A指定為篩選後的B行資料,然後再指定TEST為該儲存格資料的物件,那就可以做很多判斷式應用了。
例如下列則為判斷TEST是否數字,當然也可以類似作法二方式也行,看習慣搂。
Set a = Sheets(Name_a).Range("b5:b" & ar1).SpecialCells(xlCellTypeVisible)
For Each A1 In a
Set TEST= Sheets(Name_a).Range("b" & A1.Row)
IF ISNUMERIC(TEST)=TRUE THEN
MSGBOX TEST & "是數字"
END IF
Next
沒寫控制,表單顯示時都出現在螢幕正中央,實在很煩,小編就改了一下,當作磨練。
VBA:
使用,做一個表單,放進去後,調整LEFT跟TOP,勘你想要放那 XD。
Private Sub UserForm_Activate()
Call PositionUserFormRelativeToExcel
End Sub
Sub PositionUserFormRelativeToExcel()
Dim excelLeft As Single
Dim excelTop As Single
Dim excelWidth As Single
Dim excelHeight As Single
' 獲取 Excel 視窗的位置和大小
excelLeft = Application.Left
excelTop = Application.Top
excelWidth = Application.Width
excelHeight = Application.Height
' 設定 UserForm1 的位置,使其位於 Excel 視窗的右側
With Me
.StartUpPosition = 0 ' 設定為手動位置
.Left = excelLeft + excelWidth - .Width - 10 ' 設定左邊位置,使其位於 Excel 視窗的右側
.Top = excelTop + (excelHeight - .Height) / 2 ' 設定頂部位置,使其在垂直方向居中
If Me.Visible = True Then
Else
.Show 0
End If
End With
End Sub
幼幼班是把產生的SVG圖檔在讀回EXCEL當中,小編感覺不夠好用,畢竟都被EXCEL綁住了。
小編作了一個丟資料陣列即可生成SVG HTML的function,作演練:
vba:
幼幼班等級,當簡易分享。
function 貼入模組,然後做一個按鈕,假如資料在b行,抓99筆資料畫圖。
how to use:
Private Sub CommandButton1_Click()
sheet_array = Array("工作表2 (5)")
start_row = 2
end_row = 99
bar_array = Array("b")
htmlContent = "<html><head>" & _
"<meta http-equiv='X-UA-Compatible' content='IE=edge'>" & _
"<style>" & _
"body { margin:0; padding:20px; font-family:sans-serif; background:#f0f0f0; }" & _
".chart-grid { display:grid; grid-template-columns:repeat(2,1fr); gap:20px; max-width:1240px; margin:0 auto; }" & _
".svg-container { border:1px solid #ccc; padding:10px; background:white; box-shadow:0 2px 5px rgba(0,0,0,0.1); }" & _
"svg { width:100%; height:auto; }" & _
"</style>" & _
"</head><body>"
labels_b = WorksheetFunction.Transpose(Sheets(sheet_array(x)).Range("x" & start_row & ":x" & end_row))
'labels_b = WorksheetFunction.Transpose(labels_b)
bar_index = WorksheetFunction.Transpose(Sheets(sheet_array(x)).Range(bar_array(x) & start_row & ":" & bar_array(x) & end_row))
htmlContent = htmlContent & "<div class='svg-container'>"
'針對資料編碼
htmlContent = htmlContent & DrawSingle_LINE_Chart(labels_b, bar_index, "test")
htmlContent = htmlContent & "</div>"
'表尾
htmlContent = htmlContent & "</div></body></html>"
'輸出成html檔案
filePath = ActiveWorkbook.Path
filePath = filePath & "\" & "test" & ".html"
Set fso = CreateObject("ADODB.Stream")
fso.Type = 2
fso.Charset = "utf-8"
fso.Open
fso.WriteText htmlContent
fso.SaveToFile filePath, 2
fso.Close
End Sub
玩玩看,開啟更多元應用
For Each ctrl In Me.Controls
' "Me" 指的是當前的 UserForm 物件,也可以替換成工作表名稱 EX SHEETS("SHEET1")
' 檢查Controls的類型是否為 CheckBox,透過TypeName檢查類別。
If TypeName(ctrl) = "CheckBox" Then
' 將 CheckBox 的值設為 False (取消勾選)
ctrl.Value = False
End If
'ComboBox
If TypeName(ctrl) = "ComboBox" Then
' 將 CheckBox 的值設為 False (取消勾選)
ctrl.Value = ""
End If
Next ctrl
寫了一個計算cp、cpk、mean、std的vba工具
提供資料所在位置的range物件、規格上下界線後,即可自動計算。
透過一般函數使用方式即可滿足。
CalculateCpkAndCp_OUT = Calculate_Cpk_And_Cp(MYRANGE, FIND_OUTUP, FIND_OUTDOWN)
vba:
go for run
20261005 紀錄,今年度透過自主開發的演算法,做個小紀錄,之前我的雷達紀錄關閉了,用低調的方式作紀錄,看懂就看懂,單純紀錄;目前美國雷達開始上線測試。 我與ai互動: 問:0050 我今年 9.5%年報酬 006208 9.98%年報酬,你覺得? ai: 我覺得成績不錯,...