顯示具有 VBA 資料分析教學 標籤的文章。 顯示所有文章
顯示具有 VBA 資料分析教學 標籤的文章。 顯示所有文章

2026年1月12日 星期一

VBA 資料分析教學:DAY 12

 VBA一鍵統計摘要

儲備:Excel工作表有銷售金額欄(B欄,從B2開始),需自動計算筆數、總和、平均,並輸出至資料下方總區。這常用於每日銷售或良率資料快速彙總。


VBA:

文字

Sub GenerateSummary()

    Dim ws As Worksheet, DataCol As Range, LastRow As Long, SummaryStartRow As Long

    Dim CountVal As Long, SumVal As Double, AvgVal As Double

    Set ws = ActiveSheet

    LastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

    Set DataCol = ws.Range("B2:B" & LastRow)

    CountVal = Application.WorksheetFunction.Count(DataCol)

    SumVal = Application.WorksheetFunction.Sum(DataCol)

    If CountVal > 0 Then AvgVal = SumVal / CountVal Else AvgVal = 0

    SummaryStartRow = LastRow + 2

    ws.Cells(SummaryStartRow, "A").Value = "統計摘要"

    ws.Cells(SummaryStartRow + 1, "A").Value = "筆數": ws.Cells(SummaryStartRow + 1, "B").Value = CountVal

    ws.Cells(SummaryStartRow + 2, "A").Value = "總和": ws.Cells(SummaryStartRow + 2, "B").Value = SumVal

    ws.Cells(SummaryStartRow + 3, "A").Value = "平均": ws.Cells(SummaryStartRow + 3, "B").Value = AvgVal

    MsgBox "統計摘要已產出"

End Sub




解說:利用End(xlUp)動態偵測最後一行,固定範圍錯誤;WorksheetFunction呼叫Excel內建函數計算統計值,安全且。執行後自動產生摘要,避免延伸可修正多欄或加條件篩選(如金額>0)。



驗算:6筆數據,總共和 25000+300+800+25000+12000+300=62400,平均 10400。此範例驗證動態監控與 WorksheetFunction 正確,適合增量資料統計。


2026年1月9日 星期五

VBA 資料分析教學:DAY 11

 VBA 良率分析自動化

假設工作表「資料」有欄位:A=產品線、B=生產數量、C=合格數量。方案會動態計算最後一行,逐行計算良率=(C/B)*100%,若低於90%則在D欄標示「邊框」並以紅色填滿。


Sub 良率分析()

    Dim ws As Worksheet

    Set ws = Worksheets("Data")

    Dim lastRow As Long

    lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row

    ws.Range("D1").Value = "良率%"

    ws.Range("E1").Value = "狀態"

    

    Dim i As Long

    For i = 2 To lastRow

        Dim rate As Double

        If ws.Cells(i, 2).Value > 0 Then

            rate = (ws.Cells(i, 3).Value / ws.Cells(i, 2).Value) * 100

            ws.Cells(i, 4).Value = Round(rate, 2) & "%"

            If rate < 90 Then

                ws.Cells(i, 5).Value = "低良率警示"

                ws.Cells(i, 5).Interior.Color = RGB(255, 0, 0)

            Else

                ws.Cells(i, 5).Value = "正常"

            End If

        End If

    Next i

    MsgBox "良率分析完成!"

End Sub




此方案使用For迴圈查找資料、條件判斷篩選低良率,適用半導體產線品質管理,每日執行可快速監控趨勢。

2025年12月30日 星期二

VBA 資料分析教學:DAY 10

 VBA範例:銷售資料清理與總計

此範例自動清理Excel銷售資料空白行、計算B欄銷售總額,並顯示於D欄,適用於每月報表自動化。

Sub CleanAndSumSales()

    Dim ws As Worksheet

    Dim i As Long, lastRow As Long

    Set ws = ThisWorkbook.Sheets("RawData")

    

    ' 清理空白行(從下往上避免索引錯亂)

    For i = ws.UsedRange.Rows.Count To 1 Step -1

        If Application.WorksheetFunction.CountA(ws.Rows(i)) = 0 Then

            ws.Rows(i).Delete

        End If

    Next i

    

    ' 動態抓取最後一行並計算總和

    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

    ws.Range("D1").Value = "總銷售額"

    ws.Range("D2").Value = Application.WorksheetFunction.Sum(ws.Range("B2:B" & lastRow))

End Sub

執行前:


執行後:



執行前按Alt+F11開啟VBA編輯器,新建模組貼上程式碼,按F5執行。常見錯誤為工作表名稱拼錯,使用錯誤處理On Error Resume Next可避免中斷。​

VBA應用解說

此程式結合迴圈刪除空白與動態範圍計算,提升資料清理效率20倍以上,適合製造業生產數據預處理。

​變數宣告Dim與物件設定Set確保穩定性;End(xlUp)自動偵測最後資料行,避免硬編碼。搭配樞紐分析表自動化,可一鍵生成多維報表。

2025年12月21日 星期日

VBA 資料分析教學:DAY 9

 VBA範例:比較兩個Excel表格

此VBA程式用於比對Sheet1與Sheet2的「項名1」與「項名2」列,標記相同資料為「A」,僅Sheet1有的為「B」,並輸出結果至Sheet3。程式透過雙重迴圈與ADODB連線實現高效比對,適用於供應商資料審核。

SHEET1 資料

                                                                SHEET2 資料

完整程式碼:

text

Sub 比對1()

    Sheet1.Range("D2:D1000").ClearContents

    Dim Sheet1數據行數, Sheet2數據行數

    Sheet1數據行數 = 15

    Sheet2數據行數 = 11

    For I = 2 To Sheet1數據行數

        For j = 2 To Sheet2數據行數

            If Worksheets("Sheet1").Cells(I, 3) = Worksheets("Sheet2").Cells(j, 3) Then

                Worksheets("Sheet1").Cells(I, 4) = "A"

                Exit For

            End If

        Next

    Next

End Sub


Sub Sheet1中有Sheet2中也有()

    Sheet3.Range("A2:D1000").ClearContents

    Set conn = CreateObject("adodb.connection")

    conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName

    Sq1 = "select * from [Sheet1$] where 條件 in(select 條件 from [Sheet2$])"

    Sheet3.[B2].CopyFromRecordset conn.Execute(Sq1)

    conn.Close

    Set conn = Nothing

End Sub

執行步驟與解說: 先執行「比對1」標記相同資料,再用SQL子查詢輸出交集至Sheet3。這種方法避免重複程式碼,適合ISO 9001審核時比對供應商清單。

VBA 資料分析教學:DAY 8

 假設Excel有一張銷售明細表:

欄位:A=日期、B=產品、C=數量、D=單價。

目標:用簡單的VBA,各「產品」的「銷售總額(數量×單價)」彙總到新的工作表。



範例程式碼(放置標準模組)

文字

Sub SummarySalesByProduct()

    Dim wsSrc As Worksheet

    Dim wsDst As Worksheet

    Dim lastRow As Long

    Dim dict As Object

    Dim i As Long

    Dim product As String

    Dim amount As Double

    

    ' 原始資料工作表

    Set wsSrc = ThisWorkbook.Worksheets("SalesData")

    

    ' 找最後一列

    lastRow = wsSrc.Cells(wsSrc.Rows.Count, "A").End(xlUp).Row

    

    ' 建立 Dictionary 來彙總金額

    Set dict = CreateObject("Scripting.Dictionary")

    

    For i = 2 To lastRow      ' 假設第 1 列是標題

        product = wsSrc.Cells(i, "B").Value

        amount = wsSrc.Cells(i, "C").Value * wsSrc.Cells(i, "D").Value

        

        If dict.Exists(product) Then

            dict(product) = dict(product) + amount

        Else

            dict.Add product, amount

        End If

    Next i

    

    ' 建立輸出工作表

    On Error Resume Next

    Application.DisplayAlerts = False

    Worksheets("SummaryByProduct").Delete

    Application.DisplayAlerts = True

    On Error GoTo 0

    

    Set wsDst = ThisWorkbook.Worksheets.Add

    wsDst.Name = "SummaryByProduct"

    

    ' 輸出標題

    wsDst.Range("A1").Value = "產品"

    wsDst.Range("B1").Value = "銷售總額"

    

    ' 輸出資料

    Dim key As Variant

    Dim rowOut As Long

    rowOut = 2

    

    For Each key In dict.Keys

        wsDst.Cells(rowOut, "A").Value = key

        wsDst.Cells(rowOut, "B").Value = dict(key)

        rowOut = rowOut + 1

    Next key

    

    ' 可以再加上格式,例如貨幣格式

    wsDst.Columns("A:B").AutoFit

End Sub

重點解說

使用CreateObject("Scripting.Dictionary")“匯總”,類似 SQL 的 GROUP BY。

迴圈逐列讀取原始數據,計算金額後累計對應產品。

最後輸出到新工作表,避免覆蓋原始數據,方便檢查與再次分析。

2025年12月19日 星期五

VBA 資料分析教學:DAY 7

 假設你在Excel的Sales工作表中有以下欄位:

A欄:日期(日期)

B欄:業務員(營業員)

C欄:金額 (Amount)

目標:以VBA自動計算業務當月總銷售金額,並輸出至Summary工作表。



Sub SalesSummaryBySalesperson()

    Dim wsSrc As Worksheet

    Dim wsDst As Worksheet

    Dim lastRow As Long

    Dim dict As Object

    Dim i As Long

    Dim name As String

    Dim amt As Double

    Dim key As Variant

    Dim outRow As Long

    

    ' 來源與目的工作表

    Set wsSrc = ThisWorkbook.Worksheets("Sales")

    Set wsDst = ThisWorkbook.Worksheets("Summary")

    

    ' 找到來源資料最後一列(假設以 B 欄業務名稱為基準)

    lastRow = wsSrc.Cells(wsSrc.Rows.Count, "B").End(xlUp).Row

    

    ' 使用 Scripting.Dictionary 做彙總

    Set dict = CreateObject("Scripting.Dictionary")

    

    ' 從第 2 列開始,假設第 1 列為標題

    For i = 2 To lastRow

        name = wsSrc.Cells(i, "B").Value

        amt = wsSrc.Cells(i, "C").Value

        

        If dict.Exists(name) Then

            dict(name) = dict(name) + amt

        Else

            dict.Add name, amt

        End If

    Next i

    

    ' 清空 Summary 工作表舊資料

    wsDst.Cells.Clear

    

    ' 輸出標題

    wsDst.Range("A1").Value = "業務員"

    wsDst.Range("B1").Value = "總銷售額"

    

    ' 將彙總結果寫回工作表

    outRow = 2

    For Each key In dict.Keys

        wsDst.Cells(outRow, "A").Value = key

        wsDst.Cells(outRow, "B").Value = dict(key)

        outRow = outRow + 1

    Next key

    

    ' 簡單格式化:加上千分位以及粗體標題

    wsDst.Range("A1:B1").Font.Bold = True

    wsDst.Columns("A:B").AutoFit

    wsDst.Range("B2:B" & outRow - 1).NumberFormat = "#,##0"

    

End Sub


重點解說

使用Scripting.Dictionary“鍵值名稱”,鍵是業務員,值是銷售額,適合做總結分析。號

透過迴圈讀取每列數據,根據業務員名稱累加金額,最後批量輸出到匯總工作表,可避免在迴圈中間隙出現儲存格造成低落。號


這個寫法之後可以延伸:

增加月份條件,只彙總指定月份。

改為依「產品別」或「客戶別」做匯總。

安排AutoFilter或AdvancedFilter前處理資料重新匯總。

 

2025年11月12日 星期三

VBA 資料分析教學:DAY 6

 範例說明:使用 VBA 讀取 Excel 工作表資料,計算某欄位(例如「銷售額」)的總和與平均值,並將結果輸出到指定儲存格。

Sub CalculateSumAndAverage()

    Dim ws As Worksheet

    Dim lastRow As Long

    Dim rng As Range

    Dim totalSales As Double

    Dim avgSales As Double


    Set ws = ThisWorkbook.Sheets("銷售資料")

    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row ' 假設數據在 B 欄

    Set rng = ws.Range("B2:B" & lastRow)


    totalSales = Application.WorksheetFunction.Sum(rng)

    avgSales = Application.WorksheetFunction.Average(rng)


    ws.Range("D2").Value = "銷售總和"

    ws.Range("D3").Value = totalSales

    ws.Range("E2").Value = "銷售平均"

    ws.Range("E3").Value = avgSales

End Sub


解說:

先指定工作表與要處理的資料範圍。

用 Excel 內建函數 Sum 和 Average 計算銷售資料的總和與平均。

將計算結果寫入工作表上特定儲存格,方便查看。

此程式碼適合快速做簡單資料彙整。


2025年11月5日 星期三

VBA 資料分析教學:DAY 5

 VBA 資料分析教學:自動化資料輸入與基本 For-Next 迴圈用法

Sub 自動填入資料_基礎迴圈()

    Dim i As Integer

    For i = 1 To 10

        Cells(i, 1).Value = "第" & i & "筆"

    Next i

End Sub


說明:

建立一個 Sub 程序,使用 For 迴圈連續將「第1筆」至「第10筆」填入 Excel A1 至 A10 欄位。

For-Next 構造是 VBA 中處理重複工作最基本且常用的方法,非常適合資料分析中大量資料的自動化處理。


2025年11月3日 星期一

VBA 資料分析教學:Day 4

 VBA 資料分析教學範例與解說:自動填入流水號

目的:自動在 Excel 資料清單中填寫流水號,省去手動輸入時間。

範例程式碼:

Sub EnterSerialNumber()

    Dim serial_num As Integer

    serial_num = InputBox("請輸入欲產生的流水號最大值:")

    

    For sn = 1 To serial_num

        ActiveCell.Value = sn

        ActiveCell.Offset(1, 0).Activate

    Next sn

End Sub


說明:

1. 使用 InputBox 讓使用者輸入最大的流水號數字。

2. 使用 For 迴圈從 1 到輸入的最大值依序填入目前選取儲存格。

3. 每次填完後,透過 Offset(1,0) 移動到下一列繼續填寫。

用途:適合需要在資料表中對項目進行編號的初步資料清理與整理。


2025年11月2日 星期日

VBA 資料分析教學:Day 3

 此範例示範如何用VBA在Excel工作表中計算某一範圍內數字的平均值,並在欄位中標示出大於平均值的儲存格,使分析更直觀。適合初學者了解循環與條件判斷。

VBA 程式碼:

Sub 標示超過平均值的數字()

    Dim rng As Range

    Dim cell As Range

    Dim total As Double

    Dim count As Long

    Dim avgValue As Double

    

    ' 設定目標範圍(假設為A1:A10)

    Set rng = Range("A1:A10")

    

    total = 0

    count = 0

    

    ' 計算總和及數量

    For Each cell In rng

        If IsNumeric(cell.Value) And Not IsEmpty(cell.Value) Then

            total = total + cell.Value

            count = count + 1

        End If

    Next cell

    

    ' 計算平均值

    If count > 0 Then

        avgValue = total / count

    Else

        MsgBox "範圍內無有效數值"

        Exit Sub

    End If

    

    ' 標示大於平均值的儲存格

    For Each cell In rng

        If IsNumeric(cell.Value) And cell.Value > avgValue Then

            cell.Interior.Color = RGB(255, 255, 0) ' 黃色填滿

        Else

            cell.Interior.ColorIndex = 0 ' 清除色彩

        End If

    Next cell

    

    MsgBox "平均值為:" & avgValue

End Sub


說明:

用 For Each 迴圈遍歷指定範圍的儲存格

判斷儲存格是否為數字且非空白

計算平均值後,比較每個儲存格的值,並標示大於平均值者

適合快速視覺化資料分析結果


2025年11月1日 星期六

VBA 資料分析教學:Day 2

 VBA 資料分析教學範例與解說

這是一個簡單的 VBA 範例,用來計算 Excel 工作表「SalesData」中,從第2列開始的銷售額總和,並將結果寫入欄位D1與D2。

Sub CalculateSalesSummary()

    Dim ws As Worksheet

    Dim lastRow As Long

    Dim totalSales As Double

    Dim i As Long

    Set ws = ThisWorkbook.Sheets("SalesData")

    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    totalSales = 0

    For i = 2 To lastRow

        totalSales = totalSales + ws.Cells(i, "B").Value

    Next i

    ws.Range("D1").Value = "總銷售額"

    ws.Range("D2").Value = totalSales

End Sub

先指定要分析的工作表為SalesData。

利用 A欄找到最後一筆資料列數(lastRow)。

用迴圈累加B欄每列的銷售金額。

結果寫入D1標題及D2儲存格。

這個範例展示如何用 VBA 自動化資料彙總,適合初學者練習操作Excel資料。


2025年10月29日 星期三

VBA 資料分析教學:Day 1

 VBA 資料分析教學

Day 1 教學:自動填入流水號

實戰目標:自動在資料清單中填寫流水號,簡化手動操作。

程式範例:

Sub EnterSerialNumber()

    Dim serial_num As Integer

    serial_num = InputBox("請輸入欲產生的流水號最大值:")

    For sn = 1 To serial_num

        ActiveCell.Value = sn

        ActiveCell.Offset(1, 0).Activate

    Next sn

End Sub


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

 指數變化(2026.07.31) 開始透過AI做整理 一、上周焦點:  7/27 美國 耐久財訂單(6 月) - 全部耐久財訂單月增 0.3%,結束前一月 -4.0% 的跌勢,增幅低於市場預期約 1.8%。   - 核心耐久財(扣除運輸設備)約月增 0.6%,顯示一般設備需求溫...