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 麥可傑克森