~ 上傳‧分享‧網賺 ~
~ 免費上傳空間‧請即申請 Freak Share ~
~ 進入後請點選左上角 注冊 ! ~
~ 聲明事項 ~
如各位想把以下本文章轉貼 , 請記得要注明出處.
本文章之內容為本人之經驗所寫, 絕無抄襲成份, 特此聲明.
由於圖片製作需時, 所以更新會比較慢.
存放圖片的 SHARE A PIC SERVER 可能讀取速度較慢, 請耐心等待.
之前已經做好了一個使用者介面 , 現在 , 我們要開始動手做一個模組了 , 增加模組的方法就跟增加使用者介面的第一步一樣 . 增加模組之後 , 就在屬性窗格內把 (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 留言:
發佈留言