VBA操作中关於行数的用vba变量单元格表示方法表示的问题?

程序功能: 判断excel文件中某个工作簿中第一列的最后一行数据的行数(假设第一行有数据,以后每行数据为连续的,无空值。)

表中使用的字段请尽量参照各模块的SAP字段标准使用习惯;

根据表的用途,需确定是否属于配置目的、还是业务目的。

需要加入MANDT字段

需提供相应的维护视图;

例:如ZCHECK_MM01工厂和利润中心的对应

为保证DEV/QAS/PRD系统的一致性,不应该对配置表提供批量维护的功能,而应该走Request传输流程;

例: “ZMM_GSJJGLJ公司间物料转卖价格逻辑”就是一个失败的开发案例。

若有必要,可激活日志功能,便于对配置的更改查询;

在定义表的时候,请不要偷懒使用“预定义数据类型”这种方式;

若无特殊目的,也请加入MANDT字段

在定义关键字段的时候,请务必慎重,在理解业务需求的前提下,合理设置;(数据存在后,关键自动的变更存在较大风险)

为减少系统存储空间,一般不需要激活更改日志;

在定义表的时候,请不要偷懒使用“预定义数据类型”这种方式;

程序的选择屏幕,如果需要提供缺省值,请尽量通过Memory ID的方式实现,不要使用硬代码。

程序的选择屏幕上的选择文本,如果属于标准字段,若无特殊需求,请尽量使用Dictionary,避免造成在不同语言环境中显示错误的情况。

程序变式(选择变式、输出变式)的灵活使用

二次开发程序中定义的自定义表,需考虑相应数据的删除及归档策略,并应该对数据量的大小有合理的估计。

金额,请考虑币别;数量,请考虑计量单位;

一个工厂只能属于一个公司代码;

例:3110起重机工厂只能属于3011公司代码。

  • 公司代码与利润中心的关系

SAP是允许一个利润中心属于多个公司代码的,但是,我们实际业务上一个利润中心通常只应该对应一个公司代码(有部分特例!)

一个公司代码下,可以存在多个利润中心;

表:CEPC_BUKRS分配利润中心至公司代码

 工厂跟利润中心按照SAP的本身逻辑是没有关系的;

 但为了保证业务的正确性,我们创建了表ZCHECK_MM01(工厂和利润中心的对应)来进行检查(如在物料主数据创建的时候进行检查)。

库存地点必须跟工厂一起才有意义,牢记“工厂+库存地点”!

在不同的工厂下虽然可以存在同样的库存地点代码,但本质上是有区别的;

T001L,工厂+库存地点

  • WM仓库与库存地点的关系

一个仓库可以包括多个“工厂+库存地点”,一个“工厂+库存地点”只能属于一个仓库;

  • 销售组织与公司代码的关系

一个销售组织只能属于一个公司代码;

例:3011宁乡起重机销售组织只能属于3011公司代码。

  •  销售组织与工厂的关系

 销售组织与工厂是多对多的关系,但是该关系仅说明了销售组织可以“销售”哪些工厂的,并不能表示两者之间有财务上的所属关系;

  • 采购组织与公司代码的关系

采购组织与公司代码可以不存在分配关系,我们除极少的两三家公司外,基本上没有进行分配(如果进行分配的话,则一个采购组织只能分配给一个公司代码)。

 采购组织与工厂是多对多的关系(但是如果采购组织已经分配给公司代码后,则只能分配该公司代码下的工厂给采购组织)

T024W工厂的有效采购组织

  • 不能根据字段在前台所属的物料视图来确定相应的数据表,一定要使用F1->技术信息;

  •  物料主数据的关键表:

MARD,工厂/库存地点

MVKE,销售组织/分销渠道

MLGT,仓库/存储类型

MSTA,物料主数据维护状态

BOM用途:1表示生产

任务清单类型:N表示工艺路线、Q表示检验计划

MAPL,分配任务清单到物料

PBIM,物料的独立需求

PBED,独立需求数据

PBID,独立需求数据(MRP区域)

PLAF,计划订单,需注意计划工厂PLWRK、生产工厂PWWRK的区别;

  其中WERKS 工厂是指生产订单的生产工厂、 LOEKZ删除标记是对删除状态的生产订单生效(其他状态需通过JEST)进行读取。

AFVV,工序中数量/日期/值的DB结构

 其中STAT的具体含义通过TJ02T对应,注意当INACT=X时,表示该状态不存在。

由于我们没有激活COGI更改历史,所以COGI的更改在AFFWPRO中是没有记录的,若有必要,可通过自定义备份表ZAFFWH进行查看。

该表的数据更新需依赖于PP的相关配置。此外,如果需要得到某一预留的累计发料数量,可直接使用RESB-ENMNG;如果需要得到某一订单的累计入库数量,可直接使用AFPO-WEMNG。均不需要对物料移动数据进行累加。

LFB1,公司代码数据

LFM1,采购组织数据

凭证类别(EKKO-BSTYP)等于K(合同)

EKKO,采购凭证抬头

EKPO,采购凭证项目

信息记录类别(EINE-ESOKZ):0(标准)、 2(寄售)、3(分包合同)

凭证类别(EKKO-BSTYP)等于F(采购订单)

EKKO,采购凭证抬头

EKPO,采购凭证项目

EKET,计划协议计划行

EKKN,采购凭证中的帐户设置

EKBE,采购凭证历史

如果需要得到某一采购订单行项目的累计入库数量,可直接使用EKET-WEMNG,不需要对物料移动数据进行累加。 (虽然SAP是允许同一采购订单行项目是允许多个交货计划(EKET),但我们实际上业务中只允许一个交货计划,很多开发和考核都是基于此)

RBKP,凭证表头:发票收据

RSEG,凭证项目:收款发票

通过发票凭证读取会计凭证建议使用函数AC_DOCUMENT_RECORD

仓位必须跟仓库号、仓储类型一起才有意义,牢记“仓库号+仓储类型+仓位”!

IM库存数据(注意使用待H的数据):

MARD,物料的仓储位置数据

MSLB,供应商特殊库存(o)

MKOL,供应商的特殊库存(k)

MSKA,销售订单库存

LQUA,份(quants错误翻译为数量)

MKPF,抬头:物料凭证

MSEG,凭证段:物料

不是所有的物料移动数据都需要从这物料移动表中进行读取。

生产订单相关 AUFM,采购订单相关 EKBE,销售相关 VBFA

借贷标示:MSEG-SHKZG,S表示增加库存、H表示减少库存

T030,移动类型科目自动记账

LTBK,转储请求抬头

LTBP,转储请求项目

根据条件类型(如PR01)查找存储顺序(如PR02),得到表(如A305等A*表)

KONP,条件记录号关联

财务供应商、财务客户(同后勤模块,维护事务代码FK01,只有公司代码数据)

COSS(计划/实际,通过WRTTP区分,期间通过字段区分,如WTG004)

CO与FI的区别及数据

 标准程序的修改(以CO02为例)

当你在一个现行 VBA 过程,对对象、属性或方法有疑义时按 F1 打开在线帮助,如果你需要快速列出每个可用对象的属性和方法时,或者查找一个很难找到的过程时,使用对象浏览器。如果你想要测试VBA并且立即查看VBA命令的结果时,激活立即窗口。


当你已经准备好编写你自己的 VBA 过程,将电子表格任务自动化的时候,你很可能是从寻求操作电子表格单元格的指令开始的。你需要知道如何选择单元格,如果在单元格输入数据,如何给单元格区域命名,如何设置单元格格式,以及如何移动,复制和删除单元格。虽然这些任务可以通过鼠标或键盘轻易执行,掌握VBA这些方面的技术需要一些练习。你必须使用Range 对象来引用单个单元格,单元格区域,行或列。如果你看了 Excel 对象模型,你会注意到Range 对象是另外一个大对象——Worksheet 对象——的一部分。有三种属性让你访问Range 对象:Range 属性,Cells 属性和 Offset 属性。

Range 属性返回一个单元格或者单元格区域。引用必须是 A1 在引号里的样式(例如:”A1”)引用可以包括区域运算符冒号(例如:”A1:B2”)或者联合运算符逗号(例如:”A”,”B12”)


当你要选择一个确定的单元格时,Cells 属性要求两个自变量,第一个是行号,第二个是列号或者列字母。自变量输入在括号中。如果忽略自变量,Excel 将会选择当前工作表的所有单元格。

注意,在上面的例子中,你如何结合使用 Range 和 Cells 属性:

在上面的例子里,第一个 Cells 属性返回单元格 A6,而第二个返回单元格 A10。Cells 属性返回的单元格之后又当做 Range 对象的参数。结果 Excel 就选择了上面单元格为第一个 Cells 属性返回的结果和下面为第二个 Cells 属性返回单元格的区域了。

工作表是单元格的集合,你也可以使用只带一个自变量的 Cells 属性来表示单元格在工作表所有单元集合中的位置。Excel 按下列方式给单元格编号:单元格 A1 是工作表中的第一个单元格,B1 是第二个,C1 是第三个,等等。Cell256 是第一行中的最后一个单元格。你也许会想起 Excel 只有 256 列。


注意,Item 是返回一个集合成员的属性。因为 Item 是一个集合的默认成员,你可以直接引用工作表单元格,而不必明确地使用 Item 属性。现在你发现了两种方法选择单元格(Range 属性和 Cells 属性),你也许很迷惑为什么要使用更复杂的 Cells 属性呢?很明显 Range 属性更具有可读性,毕竟,你远在决定学习 VBA 之前就在 Excel 公式和
函数里面使用了 Range 引用。然而,当需要将单元格当做集合操作的时候,Cells 属性则使用更方便。使用这个属性去访问单元格集合中的所有单元格或者单个单元格。

另外一个引用工作表单元格非常灵活的方法是使用 Offset 属性。当工作表任务自动化时,你也许不知道某个单元格的确切地址。你如何能够选择一个你根本不知道地址的单元格?你可以让 Excel 基于当前选择的单元格来选择一个位置。Offset 属性通过计算从开始选择的单元格向下或向上移动的具体行数,来得到新的区域。同样也可以从当前选择的单元格区域向右或向左移动具体的列数。

Offset 属性使用两个自变量来获得新单元格区域的地址。第一个自变量表示行偏移,第二个自变量则表示列偏移。我们来测试一下几个例子:


上面的第一个例子里,Excel 选择的时单元格 D2。一旦你输入了第二个例子,Excel选 择了单元格 C13。如果单元格 A1 和 D15 已经被选中了,你也可以将上面的两个例子改写为这样:

注意,上面第三个例子里的第二个自变量是 0,第一个或第二个自变量为 0 时,Offset 属性相应表示当前行或当前列。如果当前活动单元格在第一行,那么指令 ActiveCell.Offset(-1, 0).Select 会导致错误。

当使用 Offset 属性时,你可能有时需要改变选择区域的大小。假设开始选择的区域是A5:A10,如何将选择区域向下移动两行,向右移动两列,然后再改变新选择区域的大小呢?假设新的选择区域应该是 C7:C8。Offest 属性只能完成前面部分,后面部分要求另外一个属性来完成。Excel 有个专门的 Resize 属性,你可以结合 Offset 属性和 Resize 属性来回到上面的问题。在你结合这两个属性之前,我们先来看看如何独立地使用它们:
2.激活立即窗口,并且输入下述指令:

上面的第一条指令选择区域 A5:A10,当前活动单元格是 A5。第二条指令将选区偏移到C7:C12。单元格 C7 处于活动单元格A5的向下两行和向右两列。现在,活动单元格是 C7。最后一条指令将当前选区改变大小,单元格区域 C7:C8 被选中了,而不再是 C7:C12。象Offset 属性一样,Resize 属性也需要两个自变量。第一个是你要选取的行数,第二个则是要选取的具体列数因此,指令

上面的例子,先是 Offset 属性计算得到新区域的起始点(译者:选区左上角的单元格),接着是 Resize 属性决定新选区的大小,然后是 Select 方法选取具体的单元格区域。

技巧:录制单元格的选择
宏录制器默认地使用 Range 属性录制选择单元格。如果你打开宏录制器,并且选择单元格A2,输入“text”,再选择单元格A5,你将在 VB 编辑器窗口里得到下述代码:

如果你使用相对引用方式,宏录制器会使用 Offset 属性。你可以在录制前,点击宏录制工具条上的相对引用按钮。宏录制器将得到如下代码:

当你使用相对引用方式录制宏时,过程总是会选择相对于当前活动单元格的单元格。注意,上面指令中的第一和第三行的引用单元格 A1,即使我们没有涉及到 A1 的任何东西。你可能记得,在第一章中,宏录制器用它自己的方式将事情搞定。为了将上面的指令变简单一些,你可以删除对单元格 A1 的引用:

使用相对引用来录制过程后,不要忘记再次点击这个按钮,如果下次录制一个非相对地址的过程。

如果你经常需要访问你工作表里某些遥远的单元格,你可能已经对下面的键盘快捷键很熟悉:End+上箭头, End+下箭头, End+左箭头和End+右箭头。在 VBA 中,你可以使用 End 属性快速地移动到遥远的单元格。


注意,End 属性要求一个自变量来表示你要移动的方向。使用下列 Excel 内置的常数来跳到具体的方向:xlright, xlleft, xlup, xldown。


你选择了一个单元格区域,你也许想要知道选区包括多少行,多少列。我们来让 Excel 计算区域 A1:D15 中的行数和列数:

如果 Excel 窗口可见,当你按回车后,VBA 会选中区域 A1:D15

一旦你回车,VBA 在下一行显示结果。你的选择包括 15 行

3.输入下列语句来得到选区的列数

现在 VBA 告诉你,选中的区域 A1:D15 占据了四列的宽度。

4.将光标放在关键字 Rows 或 Columns 中的任意位置,并且按下 F1,获取这些有用属性的更多信息。

Excel 工作表有多大?它有多少单元格,列和行?即使你忘记了这些细节,使用 Count 属性。


输入工作表里的信息可以是文本,数字或者公式。你可以使用 Range 对象的两种属性之一来往单元格或单元格区域里输入数据:Value 属性或者 Formula 属性。

上面两种例子,A1 单元格都显示 4 乘 25 的结果 100。


毫无疑问,你在某些 VB 过程中可能需要返回单元格或者单元格区域的内容。虽然你既可以使用 Value 属性也可以使用 Formula 属性,但是,这次,Range 对象的这两个属性是不可互用的。


我要回帖

更多关于 vba全局变量 的文章

 

随机推荐