顯示具有 VBA 標籤的文章。 顯示所有文章
顯示具有 VBA 標籤的文章。 顯示所有文章

2025年8月3日 星期日

VBA 與RPA機器人 數據自動化比較

 簡單比較VBA與RPA:

項目

VBA

適用範圍

主要用於Office內部(如Excel、Word)

技術本質

程式語言(需編寫/錄製巨集)

自動化對象

軟體內資料操作及邏輯處理為主

擴展性

主要侷限在該應用程式框架


項目

RPA

適用範圍

跨系統、跨應用軟體(不限於Office)

技術本質

工具平台(拖拉點選,低程式碼或無程式碼)

自動化對象

擬人化多系統流程操作,模仿人工點擊/輸入

擴展性

可串接多種系統、API、網頁,彈性高


VBA 優點與缺點
優點:
易於學習,特別是Excel或Office用戶[1][2]。
直接內建於Microsoft Office,不需額外開發環境和成本[3][2]。
自動化複雜Excel任務、可客製流程及編寫自定函數[1]。
社群龐大,學習資源豐富,疑難雜症容易找到解答[4]。
執行效率高,對內部資料處理特別快速準確[5][1]。
缺點:
僅限辦公室應用程式範圍使用(如Excel, Word)[6]。
對大型或複雜專案維護不易,程式碼擴展性有限[3][6]。
安全風險較高,易受惡意巨集影響,需特別管理[3]。
用戶界面較簡單,不支援現代程式語言新功能[3]。
RPA 優點與缺點
優點:
可自動化跨系統、跨平台的高重複性、規則明確任務[7][8][9]。
介面友善,多為拖拉點選設計,對無程式底子的人也可快速上手[10][11][8]。
支援24 小時無間斷作業,有效提升生產力與準確率[7][8][9]。
有審計記錄追蹤、合規性高,減少人為錯誤與法規風險[7][8]。
系統更新彈性高,能隨需求快速擴展與調整,應變能力佳[8][12]。
缺點:
對複雜創意或判斷性高的流程較難自動化,適用於高度標準化任務[7][12]。
初期投資成本較高(軟體購買、培訓、部署)[12][13]。
維護/更新工作量較重,尤其在業務流程頻繁變動時[7][13]。
需依賴既有系統與軟體穩定性,系統若異常會影響自動化流程[12][13]。
數據安全需加強,資料外流風險不可忽視[7][13]。

VBA的自動化範圍
o主要限於Office應用程式(如Excel、Word、Access)內部[15][16][17]。例如自動填表、資料處理、製作報表等,都是針對Office軟體內的功能操作。VBA無法直接跨不同軟體或網頁系統進行自動化。
o適用於針對單一文件或單一程式內部的重複性操作。
RPA的自動化範圍
o可自動模擬人工在不同應用程式之間的操作,包括瀏覽器、ERP系統、郵件、資料庫、檔案管理等[18][19][20]。
o 支援跨平台、跨系統的整合、批次處理、複雜工作流程。例如:從網頁抓數據,匯入ERP,再將結果貼到Excel,最後發送郵件,整個流程皆可完全自動化。
o強調模仿人類操作,可以涵蓋絕大多數需要人員在電腦前點選、輸入、複製貼上的例行事務。


小結:
•VBA的自動化範圍只限Office內部應用,對跨系統應用力有未逮,具備有CODING能力者則此限制較小,但具備些許技術能力要跳戰。
•RPA則可以跨各種軟體或平台自動化整體企業流程,大幅擴展自動化邊界,實現流程端到端的自動處理



針對複雜數據分析:
VBA的優勢
•高度客製化與程式邏輯:VBA可直接撰寫複雜的演算法與邏輯,能靈活處理多變條件、巨量資料迴圈、資料清理、統計運算、批次處理等。
•整合Excel函數與內建工具:可結合Excel資料分析(如樞紐分析表、巨集、VLOOKUP等函數)與VBA自定程式,大幅提升自動化與分析效率。
•運算速度高、即時互動:對大量資料的分析速度快,適合需要頻繁試算、即時回饋的分析流程。
•程式控制力強:對分析步驟、細節與結果展現能完全控制,方便做進階數據處理及二次開發。
•成本低、門檻低:無須額外購買分析工具,且在Office環境下即可部署。

 

RPA的定位與侷限
•主要聚焦流程自動化:RPA符合彩現GUI操作等重複勤務,但對於複雜數據運算與深度資料分析,常需仰賴外部程式(如Excel、SQL、Python等),本身並不適合進行大量、進階數據處理。
•設計導向「搬運」與「整合」:適用於跨軟體流程串接,例如自動抓取數據、傳遞檔案,但分析邏輯若過於複雜,維護成本高且易出錯。
•需搭配專業工具:遇到專業數據分析,往往是RPA自動整理資料,再交由VBA、Python、BI工具等進行專業分析。

 

•複雜數據分析首選VBA:
若分析重心在Office內部或需高度自訂演算法,VBA較易滿足各種進階計算需求。 
•RPA適合跨系統流程自動化:
如須自動化跨平台、跨系統的標準流程,或單純搬運數據(非大量算法分析),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  








2025年7月6日 星期日

vba:儲存格數值,根據條件來變色

原始問題連結

小編改了一下問題,做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 事件中,讓每次資料變動時自動執行。


2025年6月21日 星期六

vba:取代閱讀,做一個圖形箭頭來用用(Shapes物件)


自己最近眼睛不好,想要快速判斷資料的高跟落,不想單獨靠眼睛搜尋,所以搞了這個名堂。

讓程式幫我判斷後,畫個箭頭給我讓我無腦閱讀資料,哈。

所以簡單分享這篇。


vba code:


----------------

 Set shp = ws.Shapes.AddConnector(msoConnectorStraight, x2, y2, x1, y1)的設定,如果x1 y1與x2 y2 對調就可以轉換箭頭方向了。






2025年6月19日 星期四

vba autofilter v.s mysql 查詢與計算語法 比較

 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



2025年5月8日 星期四

VBA:樞紐分析表 一個簡單建立的例子

一個小編作的簡單例子做分享:

先開啟一個新的 Excel 活頁簿。
然後確認工作表。將第一個工作表命名為 原始數據1,第二個命名為 原始數據2。
在 VBA 編輯器中(按下 Alt + F11 開啟),插入一個新模組(「插入」>「模組」),然後將下方的程式碼貼到模組中

再透過ACTIVEX 增加一個按鈕。並增加如下指令。
Private Sub CommandButton1_Click()
    CreatePivotTable_Example1
End Sub

VBA:


資料:



執行:


2025年5月5日 星期一

VBA:論文:微軟Excel VBA專案程式碼保護與保密之研究 xls、xlsm測試


 論文:微軟Excel VBA專案程式碼保護與保密之研究

內文提到透過madedit的修改,可以隱藏module,筆者測試了之後,發現.xlsm無法做修改;靈機一動把檔案先存成.xls後,透過madedit的修改完成後,再另存成.xlsm,測試後功效相同,哈。

雖然還不知道這"保護",能達到那些程度的"保護"來避免有心人士,但還滿好玩的。

小編應該會再追加主動保護機制方式,保護有商業色彩的module。



我的測試,真的沒有顯示模組了,哈;不是故意沒截到;重點是副檔名是.xlsm

2025年5月3日 星期六

VBA:Worksheet_SelectionChange 工作表 觸發應用 (二)

自動設定格式,點選儲存格,自動設定成指定格式。

指定成正數為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

VBA:判斷EXCEL 版本 (Application.Version)

小編很多台電腦,有時候會存在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"


2025年5月1日 星期四

VBA:Worksheet_SelectionChange 工作表 觸發應用

小編常利用這個功能,在點選儲存格後,自動啟動特定的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


VBA:Cells.SpecialCells 篩選後資料應用+FOR EACH

小編常利用這個功能,在篩選用,透過 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 

2025年4月30日 星期三

VBA:控制表單的位置(APPLICATION應用)

 沒寫控制,表單顯示時都出現在螢幕正中央,實在很煩,小編就改了一下,當作磨練。

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





VBA SVG HTML 生成 幼幼班

 幼幼班是把產生的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


玩玩看,開啟更多元應用





2025年4月29日 星期二

vba:清除ComboBox跟checkbox 設定與內容

 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

2025年4月22日 星期二

VBA 雙面列印指定範圍

今天測試掌握了雙面列印技巧,但無奈VBA無法直接雙面列印。 Sub 雙面列印指定範圍() Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = ThisWorkbook.Sheets("工作表1") '替換為實際工作表名稱 Set ws2 = ThisWorkbook.Sheets("工作表2") '設定A4紙張大小 With ws1.PageSetup .PaperSize = xlPaperA4 .PrintArea = "A1:D20" '替換為實際列印範圍 End With With ws2.PageSetup .PaperSize = xlPaperA4 .PrintArea = "A1:F30" '替換為實際列印範圍 End With '列印設定 With ActiveWorkbook .PrintOut _ From:=1, _ To:=1, _ Copies:=1, _ Preview:=False, _ ActivePrinter:="", _ PrintToFile:=False, _ Collate:=True, _ PrToFileName:="", _ IgnorePrintAreas:=False '手動翻面後列印第二面 If MsgBox("請手動翻面後按確定", vbOKCancel) = vbOK Then .PrintOut _ From:=2, _ To:=2, _ Copies:=1, _ Preview:=False, _ ActivePrinter:="", _ PrintToFile:=False, _ Collate:=True, _ PrToFileName:="", _ IgnorePrintAreas:=False End If End With End Sub 這個方案還要手動。 最後結論,轉換成PDF,批次雙面列印效率更好。

2025年2月24日 星期一

VBA:圖表 X軸 增加背景的變通作法(CHATOBJECT,SHAPE)

 

這個功能,預設的物件沒有這個設定。

透過物件組合的技巧完成。

VBA:


主要概念就是生成一個SHAPE物件,去疊在CHATOBJECT上面一層,透過位置來控制。

效果:








2025年2月21日 星期五

計算cp、cpk、mean、std的vba工具

 寫了一個計算cp、cpk、mean、std的vba工具

提供資料所在位置的range物件、規格上下界線後,即可自動計算。

透過一般函數使用方式即可滿足。

CalculateCpkAndCp_OUT = Calculate_Cpk_And_Cp(MYRANGE, FIND_OUTUP, FIND_OUTDOWN)

                                                    

vba:



go for run



2025年2月12日 星期三

2024年8月18日 星期日

VBA:如何檢查各行資料數量是否一致(非連續資料)

例子長這樣:

 





編寫一個vba如下:

 Private Sub CommandButton1_Click()

Set my_range = ActiveSheet.Range("a1:C1")

For Each a In my_range 

IF A.VALUE<>"" THEN   

    temp1 = Split(a.Address, "$")   

    s1 = Application.CountA(ActiveSheet.Range(temp1(1) & ":" & temp1(1)))    

    MsgBox temp1(1) & "行" & s1 - 1 & "筆" & "資料"

END IF 

Next

End Sub

運作:


2024年8月11日 星期日

VBA:如何檢查各行資料數量是否一致(連續資料)

一個例子,有a、b、c三行,如圖,透過vba方式知道各行有多少資料。


編寫一個vba如下:

 Private Sub CommandButton1_Click()

Set my_range = ActiveSheet.Range("a1,b1,c1")

For Each a In my_range    

    temp1 = Split(a.Address, "$")   

    s1 = Application.CountA(ActiveSheet.Range(temp1(1) & ":" & temp1(1)))    

    MsgBox temp1(1) & "行" & s1 - 1 & "筆" & "資料"

Next

End Sub

運作:

應用:
例如也可以用來檢查各行資料是否數量一致拉、或是檢查各行資料差異性。


指數變化(2025.08.29) 開始透過AI做整理

 指數變化(2025.08.29) 開始透過AI做整理 上周焦點: 8/19(二)   美國房屋開工率 5%月增  美國建築許可月增率 月增2.8% 8/20(三)   美國房貸綜合指數 月減0.5%  美國30年期房貸利率 6.69%  美國15年期房貸利率 5.8~5.71%...