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.08.29) 開始透過AI做整理

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