2008年7月25日星期五

Part09 - VBA 學習第八回 - 煩惱要開始了 ( 繁體 )

| |
~ 上傳‧分享‧網賺 ~
~ 免費上傳空間‧請即申請 Freak Share ~
~ 進入後請點選左上角 注冊 ! ~

~ 聲明事項 ~

如各位想把以下本文章轉貼 , 請記得要注明出處.

本文章之內容為本人之經驗所寫, 絕無抄襲成份, 特此聲明.

由於圖片製作需時, 所以更新會比較慢.

存放圖片的 SHARE A PIC SERVER 可能讀取速度較慢, 請耐心等待.

Picture


之前已經做好了一個使用者介面 , 現在 , 我們要開始動手做一個模組了 , 增加模組的方法就跟增加使用者介面的第一步一樣 . 增加模組之後 , 就在屬性窗格內把 (Name) 的值改成 DataEntry 吧 , 這樣子是為了方便自己辨認 . ( 名字是可以隨你改變的 , 但是必須要以容易辨認來做大前提 )

或者你在想 , 為什麼要增加模組 ? 模組對於很多人來說只是一個聽過但又不知道是什麼的東西 , 實際一點來說 , 如果在程式編寫的時候 , 我們利用不同的模組把程式碼分開擺放 , 對於日後我們要除蟲 ( DEBUG ) 就方便得多了 .

打個比喻 , 就好像你身上有三張港幣五張人民幣七張新台幣 , 當你在香港的時候要用港幣 , 在國內要用人民幣 , 在台灣要用新台幣 , 但是你卻把它們亂七八糟的堆在一起 , 到你要使用的時候就要一張一張的看清楚可不可以用 , 但是只要你把它們分門別類 , 需要使用的時候就方便多了 .

模組的情況也是一樣 , 程式設計者大部份都會把不同功能的模組分開擺放 , 目的就是為了在除蟲時放便找到出問題的地方 , 而且分開製作的時候 , 同時也可以讓思想變得更清晰 , 一步一步的想清楚 , 程式出錯的機會就會大大降低了 . 另一方面 , 如果要你編寫的是一個非常龐大的項目 , 一個人根本不足以應付 , 比如大型軟件 , 遊戲等等 , 的確 , 一個人是有可能可以把程式碼完成的 , 但是要花的時間就是一大堆人一起做的幾倍 . 要不然公司就不用把不同功能的部門分開了 .

我們之前所訂下來的目標 , 就是要做一個簡單的倉庫管理系統 , 之前有提過 , 一個倉庫的數據中 , 最基本而又一定會出現三種不同的情況 , 準備到倉 , 已經在倉 和 出貨 三種 , 但是 , 在程式設計的時候 , 我們要知道的並不是只有這三種情況 , 而是要知道這三種情況中每一個有可能出現的東西 , 和每一個情況中會出現的必須處理事項 . 所以我們的第一步需要先確定 , 到底要電腦做什麼 .

簡單地說明一下 , 如果使用最初我教大家所用的方法 Worksheets("Sheet1").Range("A1").value = "100" , 這個方法的確可以令到電腦按照我們給它的指示進行工作 , 把儲存格 A1 的值改變為 100 , 但是 , 我們每天的要處理的東西又何止一票 ?? 出入次數是一個疑問 , 沒可能確定 , 另一方面 , 如果我們只能在報表的第一個記錄中不停地更新 , 那麼這個報表豈不是只有一行 ?? 沒可能吧 , 所以我們要使電腦能夠分辨出最後一行記錄在那裡 , 然後在最後一個記錄的下面再加一個記錄 . 就在這個時候 , 我們的報表又出問題了 , 之前在訂立報表的格式時 , 行 A - 記錄編號中是什麼都沒有的 , 如果要每一次都先用人手增加一個記錄編號 , 然後再利用我們的程式輸入資料 , 再修正程式碼 , 讓程式找到對應行號才加入記錄 , 這樣的操作方法豈不是笨得要死嗎 ?


( Pic9_1 )

可能你想到的方法跟我說的差不多 , 不過不要緊 , 我們現在再一次細心地想一想 , 到底用什麼方法才可以最簡單而又有效地找到最後一個記錄 . 首先看一看報表 , 從 A 到 K 分別記錄了不同的東西 , A 是記錄編號 , 剛才都說了 , 我們不可能利用人手先增加編號再利用 VBA 的程式來輸入其他資料的 , 狀態就是用來記錄 PI , RM 和 OUT 的欄位 , 紅色部份記錄 PI 的數據 , 橙色記錄 RM 的數據 , 藍色記錄 OUT 的數據 , 我們的目的是要程式自動增加記錄編號 , 所以記錄編號是原全沒有資料的 , PI , RM , OUT 三個部份的資料 , 不可能在同一時間出現的 , PI 不會記錄在 RM 或者 OUT 的部份 , 另外兩個都是一樣 , 每次只會記錄你做過的一個東西 , 如果是這樣的話 , 每一個儲存格都會有東西記錄了的 , 就只有 欄 B 中的狀態了 .

只要想到這一點 , 我們就可以利用 VBA 中的程式碼 , 借助 狀態記錄 把最後一個記錄找出來 , 從而在對應位置的記錄編號增加一個號碼 . 一個名為 End(xlDown) 的命令 , 絕對可以做到我們想要的東西 .

在新增一個模組後 , 在編寫程式碼的窗格輸入 :

Sub AAA()

Worksheets("Sheet1").Select
Worksheets("Sheet1").Range("B1").Select

ActiveCell.End(xlDown).Select

End Sub


( Pic9_2 )

然後在 Sub AAA() 的那一行點一下滑鼠的左鍵 , 再按 F8 , 直到 End Sub 之後再按一次 F8 . F8 是 VBA 中的偵錯功能 , 會由第一句程式碼開始執行 , 每按一次就執行一句 , 現在程式執行完了 , 我們看一看報表的情況 , 很驚訝吧 ~ 哈哈哈 ~ B65536 的儲存格被選擇了 .


( Pic9_3 )

別著急 ~ 別著急 ~ 緊按你的 CTRL 鍵再按上箭頭 , 我們一同回到 B1 的儲存格吧 ~

現在先跟大家講解一下 , 這幾句程式碼是在做什麼 , 首先 , 第一句就是要命令電腦選擇名為 Sheet1 的工作頁 , 第二句就是要他找到 Sheet1 工作頁中的 B1 儲存格 , 第三句大家都沒見過吧 ~ 呵呵呵 ~ 新玩具哦 ~ 哈哈 ~ ActiveCell 就是指現在選擇了的儲存格 , 第二句程式碼選擇了儲存格 B1, 那麼 Activecell 所指的也就是 B1 的儲存格了 . End(xlDown) 就是告訴電腦 " 我要你由這一格開始向下找 , 找到有資料的最後一個儲存格 " , 可能你會有疑問 , 如果按照你所說的 , 找到有資料的最後一個儲存格 , 那麼為什麼會變成 B65536 ?? B65536 可是什麼東西也沒有耶 ~ 對 , 我並沒有說錯 , 他是會找到對應位置的 , 如果 B1 儲存格有資料 , 電腦會按照指示向下找到連續記錄中的 , 最後一個有資料的儲存格 , 如果 B1 沒有資料 , 它就會向下找到最後一個有資料的儲存格 , End(xlDown) 就跟你在報表內緊按 CTRL 再加上下左右的功能一樣 " () 內的指令可以更改為 xlToLeft , xlToRight , xlUp , xlDown 來處理你所需要的上下左右 "

還是不相信嗎 ? 來 , 我們來做一個實驗 , 看一下圖片


( Pic9_4 )

先按照圖片在報表中加上一些亂來的數據 , 然後選擇 B1 的儲存格 , 按一下 CTRL + 下箭頭 , B2 被選擇了 , 再按一次 , B4 被選擇了 , 按下 CTRL + 右箭頭 , 儲存格 F4 被選擇了 , 很簡單吧 ~ End(xlDown) 的使用方法就是這樣了 . Select 就不用說明了吧 . 剛才程式執行時 , 因為由 B2 開始到 B65536 都沒有數據資料 , 所以程式就一直找 , 找到 B65536 就停下來了 , 你知道為什麼嗎 ? 因為 EXCEL 最多只有 65536 , 英文字母最多排到 IV .


( Pic9_5 )

現在我們知道了 ActiveCell.End(xlDown).Select 這句程式碼可以找到最後一個記錄 , 那麼我們還要想辦法避開一個問題 , 就是當儲存格 B2 沒有資料時所導致的運作不正常 ( 直接跳到 B65536 的問題 ) , 如果我們增加幾句程式碼 , 要電腦先檢查 B2 的儲存格有沒有資料 , 如果有資料就尋找最後一個記錄的位置 , 否則就直接使用這一個位置 , 這樣又可以嗎 ?

先賣一個關子 , 打字太多手也累了 XD

下一回 , 我們就來玩一玩一個新遊戲 , 一個讓程式設計者都感到有點暈眩的東西 , 但是搞不定你又會很痛苦的東西 ~ 呵呵呵 ~ 不用怕 ~ 你能夠看到這裡就已經證明我的簡化能力蠻高的嘛 ~ 哈哈 ~ 你應該不會看不懂吧 XD ~ 相信我 , 我會帶你走進這個 VBA 的世界 ~ 讓你感受一下自己開發工具幫助自己工作的威力 XD

0 留言:

最新回應

Loading...

有事啟奏‧無事閒聊 ~ 哈 ~


米高積遜全復刻 哈利波特 Michael Jackson 妙麗 金曲獎 MJ 迈克尔杰克逊其实没有死!美国CBC电台已证实 哈利波特 hongkong168 蓮花河畔景苑 盧廣仲 鄧麗欣 不想放手New! 陳珊妮 方大同 巨乳排球 痞子英雄 23 東風 蕭閎仁 米高積遜全復刻 上海 倒塌 南王姐妹花 周杰倫 變形金剛2下載 michael jackson 去世 天文台 米高積遜 花拉科茜 天圖佈局 浪卡 耳廓狐 神探俏嬌娃 韶关旭日玩具厂 譚曉風 严妍 僧老少閒 地下天文台 金泰浩 百老匯 巨乳排球 陳振聰 柯柏文 aika 麥可傑克森