~ 上傳‧分享‧網賺 ~
~ 免費上傳空間‧請即申請 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 留言:
發佈留言