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

2017年1月26日 星期四

輕鬆用VBA做網路爬蟲(中)之 字串處理

字串處理(String Parsing)簡單說就是將一堆文字(包括符號、數字等)清理、整理後擷取我們需要的部份;以輕鬆用VBA做網路爬蟲(上) 最後的小挑戰做例子的話,可以(跟面試官)說我們是在開發處理玩股網報價的演算法


開發一個網路爬蟲時,大概有八成以上的時間都在做字串處理,

在這篇文章中我會用網路爬蟲“上篇”中最後的小挑戰作為例子,

再用一個線上的字庫讓大家練習一下。


上一篇文章中我們抓下來的原始資料長這樣:

200.32▲3.861.96%
108.47▲2.011.89%
134.03▲2.41.82%
130.71▲2.341.82%
113.09▲1.861.67%
82.59▲1.161.42%
208.67▲2.581.25%
160.88▲1.941.22%
484.47▲5.691.19%
380.09▲4.31.14%
263.25▲2.921.12%

首先,我們在被證明錯誤前先找找其中自以為的規律:「

1. 指數報價一定都到小數點後兩位;
2. 指數報價後會跟著上漲▲或下跌▼的符號,平盤時沒有符號(某天看見的);
3. 當天漲跌(有負號)一定都到小數點兩位,平盤時為0(某天看見的);
4. 不論當天漲跌(有負號),漲跌幅一定到小數點後兩位(eg. x.xx%)。」

因此,萃取指數報價的方式就是:「

找到第一個"."的位置(假設為n),然後抓第1位~第n+2位,
也就是 Left( 原始資料, inStr( 1, 原始資料, "." )+2 )。」


再來,萃取指數漲跌的方法稍微複雜點:「

【先看原始資料中是否有那兩個符號,有的話:「

首先,我們知道指數報價的結尾在n+2處,
因此我們新創一個從n+3開始的資料叫做"改動資料",
改動資料= Right( 原始資料, (len( 原始資料) -(n+2)) ),

所以,我們一樣找改動資料中第一個"."的位置(假設為m),然後抓第1位~第m+2位就行了,
也就是 Left( 改動資料, inStr( 1, 改動資料, "." )+2 )。

如果找不到▲或▼的符號,那當日漲跌就是0了。】」


最後是當日漲跌幅:「

如果當日漲跌不為0,那麼改動資料的第m+3位~最後一位就是漲跌幅了,
也就是Right( 改動資料, (len( 改動資料) -(m+2)) )。

當日漲跌為0的話,漲跌幅自然也為0( 0.00%)了。」


========================================================

以下是另一個字串處理+網路爬蟲的例子

========================================================


這是一個古登堡計畫下的字庫網頁(A開頭):
http://www.mso.anu.edu.au/~ralph/OPTED/v003/wb1913_a.html


我們要嘗試著計算出A開頭字庫中各種詞性(part of speech)佔的數目,
原始碼大致上長這樣子:「

<P><B>Abacinate</B> (<I>v. t.</I>) To blind by a red-hot metal plate held before the eyes.</P>
<P><B>Abacination</B> (<I>n.</I>) The act of abacinating.</P>
 <P><B>Abstaining</B> (<I>p. pr. & vb. n.</I>) of Abstain</P>  」

單字被<B>標籤包住、詞性則被<I>標籤包住,
除此之外一個單字可能會有多個詞性(在<I>標籤裡面被&符號分開)。
(註:實作後才發現有極少數的多詞性會被“ /” 以及“ ,” 符號分開)

爬蟲的前置除了網址不一樣外,其它的與上篇文章都一樣,
以下是抓取詞性的code:「

圖1:
















圖2:



























圖3:





















理論上,運行完後我們得到的資料大概會長這樣(部份):

Part of Speech
numbers
prep.
70
n.
5444
a.
2861
v.t.
1088
adv.
574
pl.
239
p.p.
317
imp.
287
p.pr.
285
vb.n.
285
v.
67
v.i.
278
n.pl.
171
superl.
10
i.
44
p.a.
7
a
2
interj.
15
p.p.Adored(/);p.pr.
1
a.superl.
2
Aprefix.
3
conj.
26
網路爬蟲中,字串處理的部份大致上就是這個樣子。

以下是範例檔案(附code):


字串處理是一門相當重要的功夫,
無論是做資料分析、語意分析、或甚至要暴力破解某個密碼都會用到它,
而有些問題只有在實作後才會被發現,
建議大家多多找出生活、工作中可以被自動化的工作,試著動手開發。

有任何問題歡迎來信或者留言,
如果想自動化一件工作卻毫無頭緒也可以來信我們討論看看,



IT'S   ALL   FREE !!






2015年7月28日 星期二

巨集(Macro)在Excel中的應用

巨集(Macro)簡介

如果把巨集比喻成一首歌,那麼VBA就是穿插其中的音符,
在一張名為Excel的紙上被譜就、被記錄、被演奏。

用非文青的語言來說,巨集是用VBA記錄下來的一連串動作的集合,
並只能在Excel中執行。

巨集可以用錄的,就像錄音一樣你做什麼動作它就保存下什麼動作;
另外也可以透過Excel中的編輯器來撰寫,兩者的優劣在上篇文章已經有提及。

由於錄製的巨集不具有"邏輯判斷"的功能,它只知道你在哪個位置做了什麼事情,
因此就實用性而言是大大輸給了人為撰寫的VBA巨集的。


錄製巨集(Record Macro)

錄製巨集功能被放在Excel視窗的左下角(如下圖),














點選並按下確定錄製後會開始記錄你的一舉一動,
因此在錄製之前一定要先想好接下來的每一個步驟,
萬一步驟做錯了或者是做了一堆無意義的動作,
那麼可能一切就要從頭來過了。

但幸好錄製巨集時,只有新的動作出現才會再錄製下去,
因此忘記下一步時最好的動作就是不要動作,想清楚之後再繼續Click Click。


巨集錄製範例

以下表(圖)做為一個簡單的範例:
























每天更新收盤價後,
"手動由大到小排序現金殖利率,並且篩除扣抵率10%以下的個股"就是機械性工作,
而且沒有使用到較複雜的邏輯判斷,我們就可以用巨集來自動化這個任務。

首先點選左下方的record macro輸入巨集名稱跟其他資訊,
建議巨集名稱一眼就看得懂它的功能,
否則日後試算表日趨複雜時,
你會再也想不起來當初那個叫tt或111的巨集是什麼東西。

















注意到左下角的圖示變成一個小正方形,
滑鼠移上去可以看到目前處於巨集錄製中的狀態,
接下來就是把你"機械化"的動作重複一次給電腦看了。

先排序現金股利殖利率所在的列(Column),
接著再用篩選(filter)掉扣抵稅額低於10%的個股,
最後停止錄製巨集即可。
(點選左下角的那個小正方形即可停止錄製)


巨集錄製完成之後

巨集錄製完成之後,
該份Excel表必須儲存為xlsm格式才能把巨集儲存下來。
























日後打開這份Excel文件(WorkBook),
只要按Ctrl+w或者在開發者欄位中執行該巨集就可以自動化這份報表囉。

2015年7月26日 星期日

什麼是VBA,為什麼要學習VBA

VBA簡介

VBA的全名是Visual Basic for Application,是一種寄生在Excel當中而且只能在Excel裡運行的一種程式語言。VBA能做什麼? VBA有很多事情做不到,像是開發一套獨立的應用程式、設計網站網頁,或是設計3D模型等等;但在它的專業領域上可以實現令人常常感到驚奇的功能,WOW~原來整理試算表的速度可以這麼快!

舉凡你能用紙筆一步步寫下工作步驟的事務,像是:計算上百家公司的本益比是否低於最近三年的平均評價、稽核公司各員工的KPI後打出考績兼製圖、測試一套新構想的交易邏輯,或甚至化身網路爬蟲抓下你要的資訊,只要一鍵輕鬆搞定;若凡你身邊有那種看似整天偷雞打混卻又按時做完交辦事項的同事,要嘛他人緣特佳,否則大概便是學了VBA。

雖然光靠Excel的內建函式也可以處理大量的運算工作,但只要牽扯到"邏輯"的部分非人力介入不可,像是判斷各家公司的淡旺季、KD黃金交叉後鴻海股票呈現出怎麼樣的走勢、整理完今天公司的收支後用檔名加上今天的日期等等,VBA都可以輕鬆的化解以上問題。

更別提VBA的專長---大量的資料運算,當決心使用VBA實現工作上所有例行事務後,很多需要2~3個小時的工作可以在幾秒鐘之內解決完畢,當"秒殺"成為事實,學習VBA就是你的義務了。


學習VBA的先備條件

學習VBA必須懂英文?學習VBA必須要熟悉Excel?學習VBA必須要先懂VB(Visual Basic)??? 別再相信沒有事實根據的說法了,雖然不可能上了八堂課後就成為coding專家,但學習VBA遠比學習操作Win 8磚塊格來得簡單,而如果Windows的藍屏以及更新提示對你如同家常便飯,學習VBA應該不會讓你另外感受到太大的挫折才是。

只要你知道Excel中的欄位、工作表、工作簿分別是什麼、會排序、會篩選、大概知道Excel可以實現什麼樣的工作,以及有健全的電腦,那麼你就是一個潛在的VBA code了。


如何學習VBA

台灣有關VBA學習的書籍大多為條列示的功能整理,優點是需要實現某個功能的時候可以立即查找;缺點則是沒有教你怎麼全部統整起來使用,常常過了下面這村就忘了前面那店,到頭來還是一場空。

筆者教學VBA的經驗4年有餘,教學範圍除了常見的辦公室應用、資料處理、工作自動化外也包括程式交易及網路爬蟲等等,期間整理出一套快速且容易上手的方法。除了在這裡分享有關Excel、VBA的心得及技巧外,也希望推廣VBA在工作上的運用,讓大家從無腦的庶務中解脫出來。


















圖片來源:http://goodmoneying.com/wp-content/uploads/2013/08/freedom.jpg