公告版位

目前分類:02_EXCEL VBA自動化教學 (123)

瀏覽方式: 標題列表 簡短摘要

用EXCEL VBA做大數據分析視覺化程式設計教學心得分享

本學期應邀回母校台師大開課課程主要是:
用EXCEL VBA做大數據分析視覺化程式設計
 
另一個母校,東吳大學也邀請我開課,但限於自己的時間無法排出適合的時間,
於是系主任便推薦我開設遠距課程於是,
便有了可以在台師大上課,並將上課錄影除了提供上課學生複習,
也可以將後製後的影片,提供東吳的遠距課程的想法,
這樣我只要認真地把一次課程作法,就可以讓兩邊的學生都學習的好辦法。
 
於是開學後,台師大受限電腦教室,選修人數只有50人,加上加選5人,
有55位學生,幾乎是秒殺,至於東吳遠距課程,沒有這樣的限制,
所以選課人數近百人,有95位選修。
 

一、課程大綱:

期中前,主要從EXCEL高階函數巨集錄製VBA程式設計,
資料來源為政府開放資料,配合樞紐分析表。
 
期中後,網路爬蟲+樞紐分析到視覺化圖報表,用EXCEL內建功能與錄製巨集寫爬蟲,
無法抓取資料則用IE物件,將IE瀏覽器嵌入EXCEL VBA程式中,只要能連結的網頁,單可以下載裡面的資料。
 
 
 
課程進行中提供雲端講義,裡面有說明、畫面與老師自己寫的程式碼,並隨課全程錄影,
後製後上傳YOUTUBE,建立播放清單,直接件給學生複習與學習。
建立一個GOOGLE論壇,只有學生可以加入,
課後會將上課的YOUTUBE影片建立播放清單,並貼到論壇,
好處就是會自動轉信給學生,這樣我就不用一個一個的郵寄了,
用了超過十年覺得沒什麼問題,只是雖是論壇,
但討論的介面做的很不好,最好用的還是分享上課影片清單。
 
 
 

二、修課人數/學院分布

 

 

 

三、期中專題作業

 

 

 

 

 

四、期末專題作業

 

 

 

 

 

 

 

 

 

 

 

五、本學期授課心得:

1.兩學分真的有點趕,因此輔以影音錄製與雲端講義,對認真學習學生幫助很大。
2.期中專題有範圍,但許多學生都能加入自己的需求和想法,加上EXCEL容易上手,雖說需要撰寫VBA程式,但因為懂得錄製巨集與修改的方式,都能完成理想專題。
3.期末專題為難度很高的網路爬蟲+製作圖表,但結果超過預期的好,可見學生接受度很好,以學生回饋意見可知,上課錄影可重複學習備查,與雲端講義助益很大。
4.遠距學習(東吳)結果因為有影音與雲端輔助,成果不遜於實體上課。

 

非資訊背景教程式設計

非資訊卻講程式設計二十一年(89年巨匠教VB)
比較沒包袱,能從非資訊角度看學習與應用
重視實作,很多人看的懂書上寫的但寫不出程式
程式寫作要會寫,還要熟練,更需要完全正確(99分程式還是無法執行)
教學的核心都在如何幫助學生學會寫程式。
從EXCEL函數開始,再學習錄製巨集,再慢慢進入VBA程式設計的世界
 

如何幫學生寫出又快會好又正確程式

1.所有程式都是自己預先多次撰寫,用自己的寫作風格撰寫,不要求學生有標準答案,可以用自己的方式與邏輯寫程式。
2.提供雲端即時講義,取名雲端白板,有解答程式畫面結果與文字敘述。
3.隨課錄影,並課後上傳YOUTUBE播放清單用用GOOGLE論壇分享。
4.期中報告以開放資料為資料來源,用EXCEL樞紐分析圖表、函數、巨集與VBA完成專題。
5.期末報告以網路爬蟲取得資料(GET與POST),用EXCEL製作圖表與VBA完成專題。
 

Pyhton V.S. VBA

自己也教Pyhton發現還是比VBA來的困難
1.安裝環境
2.有EXCEL可以存資料,甚至當資料庫
3.有錄製巨集可以產生不會寫的程式
4.樞紐分析 vs Pandas
5.圖表 vs Matplotlib
入門的學生與非資訊相關科系,建議可以先從學習VBA設計下手
 

第14次上課教學影片分享:

(期末專題作業說明&全省氣溫改為跨工作表與物件的使用&跨工作表說明與用IE物件)

 

教學論壇:

 

EXCEL VBA進階班的課程規劃

主要是延伸入門課,延伸資料庫、多工作表、工作簿、網路爬蟲、視覺化報表等應用並與Python程式協同應用

單元01_資料拆解相關(VBA)
單元02_輸入自動化與表單設計
單元03_用ADO匯入與匯出資料庫
單元04_大量工作表合併與分割
單元05_資料查詢(篩選與分割工作表)
單元06_下載網路資料(YAHOO股市)
單元07_活頁簿與檔案處理(工作表分割與合併活頁簿)
單元08_視覺化報表與快速匯入圖片


其他相關學習:

函數東吳進修推廣部, EXCEL, EXCEL VBA 函數,程式設計,線上教學
文章標籤

吳老師 發表在 痞客邦 留言(0) 人氣()

用EXCEL VBA網路爬蟲擷取YAHOO股市資料

 

EXCEL錄製巨集爬取YAHOO股市資料,

會有亂碼的問題,用PYTHON來爬取,

對一般人來說門檻又太高,

如果如何在EXCEL VBA就可以輕鬆爬取網路資料,

就是本文所要分享的重點。

當然本文不是要推崇VBA有多棒,Python不好用,

我的想法是只要用對工具,工作可以很愜意,

可以協同應用工具,讓彼此都能發揮最大的強項,

是本文寫說明的,

另外順便分享在EXCEL除了用匯入資料從WEB功能外,

也可以用IE物件,

功能很像是Python的requests加上beautifulsoup4差不多功能,

不同的是,可以將下載的資料直接放在EXCEL,

也就是把EXCEL當成資料庫用,這樣可以減少很多資料庫匯入匯出的麻煩。

 

首先,YAHOO股市當日行情表網址:

https://tw.stock.yahoo.com/class-quote?sectorId=1&exchange=TAI

 

*改用IE物件下載

 

VBA程式碼

Sub 下載YAHOO_水泥()

    '清除資料

    Cells.Clear

    '1.建立IE物件

    Set ie = CreateObject("internetexplorer.application")

    '2.連線到網址

    ie.navigate "https://tw.stock.yahoo.com/class-quote?sectorId=1&exchange=TAI"

    '3.等待3秒

    Application.Wait (Now + TimeValue("0:00:5"))

    '4.取得網頁中第1個表格

    Set tbl = ie.document.getElementsByTagName("ul")(5)

    '5.取得表格中所有的列<tr>

    Set trs = tbl.getElementsByTagName("li")

'    '6.取得列中的每一個儲存格內文字<td>如果沒有<td>抓<th>

    For i = 0 To trs.Length - 1

        Set tds = trs(i).getElementsByTagName("div")

        For j = 5 To tds.Length - 1

            Cells(i + 1, j - 4) = tds(j).innertext

        Next

    Next

    Columns("C").Delete

    ie.Quit    

    Rows(1).Insert

    Range("A1") = "股票名稱": Range("B1") = "代號": Range("C1") = "股價"

    Range("D1") = "漲跌": Range("E1") = "漲跌幅(%)": Range("F1") = "開盤"

    Range("G1") = "昨收": Range("H1") = "最高": Range("I1") = "最低"

    Range("J1") = "成交量 (張)": Range("K1") = "時間"

    Columns.AutoFit

End Sub

教學影片分享:

 

 

教學論壇:

 
 

EXCEL VBA進階班的課程規劃

主要是延伸入門課,延伸資料庫、多工作表、工作簿、網路爬蟲、視覺化報表等應用並與Python程式協同應用

單元01_資料拆解相關(VBA)
單元02_輸入自動化與表單設計
單元03_用ADO匯入與匯出資料庫
單元04_大量工作表合併與分割
單元05_資料查詢(篩選與分割工作表)
單元06_下載網路資料(YAHOO股市)
單元07_活頁簿與檔案處理(工作表分割與合併活頁簿)
單元08_視覺化報表與快速匯入圖片


其他相關學習:

函數東吳進修推廣部, EXCEL, EXCEL VBA 函數,程式設計,線上教學
文章標籤

吳老師 發表在 痞客邦 留言(0) 人氣()

班級資料工作表的分割與合併(用EXCEL VBA)

 

最常遇到學員問到如何將工作表分割與合併為同一個工作表

若是用人工方式複製貼上,真的非常浪費時間,

工作表越多越麻煩,

其實只要一個迴圈,加上範圍複製,與資料篩選,

其實就可以在瞬間完成工作,

以下分享用VBA直接撰寫程式,將工作表分割合併的方法。

 

 

完成畫面:


分割工作表

 

程式碼

 合併工作表

 

教學影音(完整版在論壇):

 

教學影音完整版在論壇:

https://groups.google.com/forum/#!forum/scu_excel_vba2_86

 

EXCEL VBA進階班的課程規劃

 

主要是延伸入門課,延伸資料庫、多工作表、工作簿、網路爬蟲、視覺化報表等應用並與Python程式協同應用

單元01_資料拆解相關(VBA)

單元02_輸入自動化與表單設計

單元03_用ADO匯入與匯出資料庫

單元04_大量工作表合併與分割

單元05_資料查詢(篩選與分割工作表)

單元06_下載網路資料(YAHOO股市)

單元07_活頁簿與檔案處理(工作表分割與合併活頁簿)

單元08_視覺化報表與快速匯入圖片

 

其他相關學習:

函數東吳進修推廣部, EXCEL, EXCEL VBA 函數 程式設計 線上教學 excel vba 教學 excel vba指令教學 vba範例教學excel  excel vba教學視頻 函數教學 excel函數

吳老師 發表在 痞客邦 留言(0) 人氣()

EXCEL VBA網路爬取大樂透歷史資料

如果想將網路上總共有57頁網頁資料複製到EXCEL工作表中,

如果用土法煉鋼是非常花時間的事,如果每天需要經常性抓取網路資料,

真的非常必要用VBA程式來完成

其實就是目前很夯的網路爬蟲,

Python 程式相比,VBA相對比較親民一些,

直接抓取到EXCEL相對的好處理後續的動作

利用VBA程式,配合 For迴圈+If邏輯判斷一下

基本上程式就可以快速一鍵完成資料下載。

接下來要產生報表作統計分析,或是視覺化圖表就更簡單了。

以下有六個步驟如下,

1.錄製巨集與修改VBA程式

2.VBA寫刪除日期列

3.VBA寫複製日期

4.VBA寫刪除列

5.VBA寫增加中獎號碼

 

6.VBA寫剖析資料

 

 

完成畫面:


統計結果:

 

 

大樂特歷史資料下載程式碼

 

 

**利用資料的從WEB功能下載資料,再利用錄製巨集產生基本VBA程式加以修改

1.資料的從WEB功能

 

程式碼:

Sub 大樂透下載()

    With ActiveSheet.QueryTables.Add(Connection:= _

        "URL;https://www.lotto-8.com/listltobigbbk.asp?indexpage=1&amp;orderby=new", _

        Destination:=Range("$A$1"))

        .WebFormatting = xlWebFormattingNone

        .WebTables = "5"

        .Refresh BackgroundQuery:=False

    End With

End Sub

 

Sub 批次大樂透下載()

    For i = 1 To 57

        '1.匯入WEB資料

        If Range("A1") = "" Then

            r = 1

        Else

            r = Range("A1").End(xlDown).Row + 1

        End If

        With ActiveSheet.QueryTables.Add(Connection:= _

            "URL;https://www.lotto-8.com/listltobigbbk.asp?indexpage=" &amp; i &amp; "&amp;orderby=new" _

            , Destination:=Range("$A$" &amp; r))

            .WebFormatting = xlWebFormattingNone

            .WebTables = "5"

            .Refresh BackgroundQuery:=False

        End With

    Next

End Sub

 

VBA程式碼

Sub 刪除日期列()

    For i = Range("A1").End(xlDown).Row To 2 Step -1

        If Cells(i, "A") = "日期" Then

            Rows(i).Delete

        End If

    Next

End Sub

Sub 複製日期()

    For i = 2 To Range("A1").End(xlDown).Row

        If (i - 2) Mod 3 = 0 Then

            Cells(i, "A") = Cells(i + 1, "A")

            Cells(i, "A").NumberFormatLocal = "yyyy/m/d"

        End If

    Next

End Sub

Sub 刪除列()

    For i = Range("A1").End(xlDown).Row To 4 Step -3

        Rows(i).Delete

        Rows(i - 1).Delete

    Next

End Sub

Sub 增加中獎號碼()

    For j = 1 To 6

        Cells(1, j + 3) = j

    Next

End Sub

Sub 剖析資料()

    For i = 2 To Range("A1").End(xlDown).Row

        Range("D" &amp; i &amp; ":I" &amp; i) = VBA.Split(Cells(i, "B"), ",")

    Next

End Sub

Sub 刪除B欄()

    Columns("B").Delete

    Columns.AutoFit

End Sub

Sub 大樂透下載()

    Call 批次大樂透下載

    Call 刪除日期列

    Call 複製日期

    Call 刪除列

    Call 增加中獎號碼

    Call 剖析資料

    Call 刪除B欄

End Sub

 

教學影音(完整版在論壇):

 

教學影音完整版在論壇:

https://groups.google.com/forum/#!forum/scu_excel_vba2_86

 

EXCEL VBA進階班的課程規劃

 

主要是延伸入門課,延伸資料庫、多工作表、工作簿、網路爬蟲、視覺化報表等應用並與Python程式協同應用

單元01_資料拆解相關(VBA)

單元02_輸入自動化與表單設計

單元03_用ADO匯入與匯出資料庫

單元04_大量工作表合併與分割

單元05_資料查詢(篩選與分割工作表)

單元06_下載網路資料(YAHOO股市)

單元07_活頁簿與檔案處理(工作表分割與合併活頁簿)

單元08_視覺化報表與快速匯入圖片

 

其他相關學習:

函數東吳進修推廣部, EXCEL, EXCEL VBA 函數 程式設計 線上教學 excel vba 教學 excel vba指令教學 vba範例教學excel  excel vba教學視頻 函數教學 excel函數

文章標籤

吳老師 發表在 痞客邦 留言(0) 人氣()

用EXCEL VBA快速將大量的EXCEL檔轉為PDF檔

 

這是EXCEL VBA進階課程的單元七的大量工作表的分割時講到,

剛好有學員問道如果想把大量的工作表,直接分割為PDF檔,

該怎麼做?其實只要一個For迴圈配合ExportAsFixedFormat方法,

就可以快速的將大量的工作表輸出為一個一個的PDF檔,

省去人工所要花費的時間,如果你每天都需要將工作表轉為PDF,

這個分享,應該可以幫到您很多的忙,節省大量時間。

 

其他可參考

如何用EXCEL VBA批次轉PDF檔  [連結]
[問題詢問]如何修改VBA讓EXCEL自動轉存成PDF時不會出現副檔名 [連結]
先學會如何用EXCEL VBA批次另存成2003與CSV等格式 [連結]
如何用EXCEL VBA自動批次匯入圖片與超連結 [連結]
如何增加EXCEL VBA按鈕 [連結]

 

預覽:


大數時代來臨如果不懂得裡用自動化方式處理資料,

處理資料將非常沒有效率,

至於處理大數據的方案很多,

但最通行也沒有額外費用的大概只剩VBA了。

而且開啟EXCEL就包含VBA,除了在Windows外,

MAC蘋果電腦一樣也有EXCEL,

VBA也可以沿用以前VB的資源,這樣看來VBA處理大數據應該沒有什麼對手了。

 

 

 

程式碼:

Public Sub 批次將工作表轉存為工作簿_PDF()

    If Dir("C:\Users\SCU\Desktop\VBA\*.xlsx") &lt;&gt; "" Then Call 刪除檔案

    

    Application.FileDialog(msoFileDialogFolderPicker).Show

    sPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)

 

    Application.ScreenUpdating = False

    For i = 2 To 14

        x = Sheets("甲班").Cells(i, "I")

        Sheets(x).Copy

        ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=sPath &amp; "\" &amp; x &amp; ".pdf"

        ActiveWorkbook.Close False

    Next

    Sheets("甲班").Select

    Application.ScreenUpdating = True

End Sub

 

 

教學影音(完整版在論壇):

 

教學影音完整版在論壇:

https://groups.google.com/forum/#!forum/scu_excel_vba2_86

 

EXCEL VBA進階班的課程規劃

 

主要是延伸入門課,延伸資料庫、多工作表、工作簿、網路爬蟲、視覺化報表等應用並與Python程式協同應用

單元01_資料拆解相關(VBA)

單元02_輸入自動化與表單設計

單元03_用ADO匯入與匯出資料庫

單元04_大量工作表合併與分割

單元05_資料查詢(篩選與分割工作表)

單元06_下載網路資料(YAHOO股市)

單元07_活頁簿與檔案處理(工作表分割與合併活頁簿)

單元08_視覺化報表與快速匯入圖片

 

其他相關學習:

函數東吳進修推廣部, EXCEL, EXCEL VBA 函數 程式設計 線上教學 excel vba 教學 excel vba指令教學 vba範例教學excel  excel vba教學視頻 函數教學 excel函數

文章標籤

吳老師 發表在 痞客邦 留言(0) 人氣()

範例_字串切割與Do_While迴圈不定數量結果

 

練習檔 [下載]

這個範例是學員工作上的問題,

每天都需要將儲存格中的超連結取出到B欄中,

若儲存格中只有一個超連結還好解決,

可以用Find函數找中括弧位置,再用Mid函數切割,

剛好這個範例裡面不只一個超連結,

可能有兩個、三個甚至更多,

也就是數量不定,如果要用For迴圈,也要知道數量範圍,

所以只能用 Do While 迴圈了,

從第一個字找起,之後再從找到的位置加一再找了,該如何做。

預覽影片:

 

一、函數

=FIND(C$1,A2)

=FIND(D$1,A2)

=MID(A2,C2+1,D2-C2-1)

 

如果用VBA撰寫的程式

 

一、階段一,先撰寫只取一個超連結

外面的For迴圈是跑每一列,用 Instr函數找"【&lt;"和"&gt;】",

分別放在將找到位置的值放在 a和b 中,

如果a或b為0,表示找不到。

 

Sub 字串切割()

    '1.迴圈範圍

    For i = 2 To Range("A2").End(xlDown).Row

        '2.取得頭尾位置與切割字串

        a = VBA.InStr(Cells(i, "A"), "【&lt;")

        b = VBA.InStr(Cells(i, "A"), "&gt;】")

        If a &lt;&gt; 0 Then

            '5.輸出結果

            Cells(i, "B") = Mid(Cells(i, "A"), a + 1, b - a)

        End If

    Next

End Sub

 

如果多個超連結,可以先多產生 a1和b1變數,預設值為 1,

即從頭找起,找到之後再把  a1和b1 加1之後繼續找,

直到找不到為止,Do While 後面就是邏輯,為 True 就繼續找,

反之就離開迴圈了。

 

Sub 字串切割_所有超連結()

    '1.迴圈範圍

    For i = 2 To Range("A2").End(xlDown).Row

        '兩個位置初始值,從1開始找

        a1 = 1

        b1= 1

        '2.取得頭尾位置與切割字串

        '當找到關鍵字就執行以下程序

        Do While InStr(a1, Cells(i, "A"), "【&lt;") &lt;&gt; 0

            a = InStr(a1, Cells(i, "A"), "【&lt;")

            b = InStr(b1, Cells(i, "A"),  "&gt;】")

            S = S &amp; Mid(Cells(i, "A"), a + 1, b - a) &amp; Chr(10)

            a1 =