2009年4月27日

自製無用小工具系列 - 利用 Excel VBA 產生大量亂數日期

這個工具起因於某日,坎尼要建立測試資料,但日期必須打散
極度懶惰的坎尼就用 Excel 做了個亂數跑日期的小程式

「為什麼要用 Excel 哩?」『簡單、好用、又好玩』

第一、要產生某種格式的資料很快很簡單
第二、啟動不像 visual studio 那麼久
第三、不用再重新拉UI,每個儲存格都是 TextBox

要寫 VBA 之前,先知道 VBA 編輯器要怎麼開啟,見下圖
(快速鍵為 ALT + F11)

再來是原始資料的創建
先全選 Sheet1 的儲存格,右鍵選儲存格內容,將儲存格轉換為文字格式
A1儲存格輸入 1995,B1輸入01,C1輸入01
再利用 Excel 的自動填滿選項功能建立如下圖的資料 (這時候就知道Excel的好用了)

接著一樣把 Sheet2所有的儲存格改為文字格式
以免產生出來的資料,Excel會自以為聰明的幫你改格式 :D

資料準備好之後,就按下 ALT + F11 進入 VBA 編輯器
再來就是寫程式了,當然,是要用 VB 的語法

下圖先用兩個 For 迴圈決定要產生的資料量 (I、J分別為 Column及Row)
新增三個亂數值,分別決定年月日的亂數 Index
再將亂數產生的值組合起來放進 Sheet2 的儲存格裡

寫完程式之後,直接點執行鍵即可 (編輯器上面的綠三角形)
再切到Sheet2就可以看到滿滿的亂數日期了


Excel 檔下載 (若要使用坎尼的檔案,記得打開巨集)

其實這個程式把Sheet1的資料來源改一改 (亂數index的range也可以更改)
就可以變成 電影名稱產生器武功名稱產生器...

最後補充一下,坎尼程式裡年的 index 亂數設錯了 (應該為 14)
所以不會有 2007 及 2008 年的資料

7 則留言:

匿名 提到...

大大您好,因為小弟鮮少接觸程式,所以對程式一竅不通,在此有些關於VBA程式撰寫的問題想請教您,希望您別介意。^^"

問題如下:
小弟現在想用VBA寫一個4x4矩陣相乘的程式,可是目前所寫的程式只適用於3個矩陣相乘(我是用最笨的方法,先導完通式,再用通式去寫的),所以想請問一下大大,現在我想用迴圈的方式把它改成「給幾個矩陣就會連乘幾個」來做運算的話,該怎麼寫呢?懇請大大幫忙!謝謝。

坎尼 提到...

請問你說的矩陣相乘是指下列網址所描述的嗎?
http://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95

給幾個矩陣就連乘幾個坎尼想到的有
1. 用遞迴(Recursive)的方式去解決
2. 另外寫個方法,用來處理一維矩陣計算,再用 for 迴圈將矩陣運算出來

若有誤解意思,麻煩再將問題描述清楚一些吧 ^^

坎尼 提到...

再講一下上述的作業流程吧
寫程式不外乎 Input → Process → Output以 Excel VBA 來講
你的 Input 應該是 Sheet 上的儲存格
Process 是判斷矩陣的大小及計算
Output 就是將運算出來的值放到 Sheet 上面去

其中 Process 的運作模式
坎尼應該會用一個兩層的巢狀 for 迴圈取得輸入的矩陣值
再用一個 for 迴圈將值傳到運算的方法中計算,以取得最終結果

大致上是這樣,程式實際部份坎尼會再研究一下 (應該是不會超過兩個迴圈?)

匿名 提到...

坎尼大您好:
小弟就是想像大大說的那樣,用迴圈的方式來達到矩陣連乘的效果,也就是大大說的第2種方法。

之前上網找到有人用3個巢狀for迴圈寫矩陣的相乘,可是小弟看不太懂,也不曉得要如何將它運用到自己的程式裡。

匿名 提到...

在此補上之前找的網頁:
http://blogs.msdn.com/vbteam/archive/2007/05/07/operator-overloading-a-demonstration-using-matrices-matt-gertz.aspx

小弟說的3個巢狀for迴圈在最下面哪一段程式裡喔!^^

感謝大大相助!

坎尼 提到...

由於內容太多,已經另開文章作說明,請洽下方連結
連結

匿名 提到...

謝謝大大還特地另開文章,我會去看看的,超感謝~~~^^!

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D