VBA学习笔记2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VBA学习笔记2 ⾃动计算出Gross Demand
前⾯⼀次已经做成了BoM数据的汇总,然后MPS就⽐较简单了,接下来的⼀步就是由BoM的透视表和MPS这两张表⾃动计算出Gross Demand。

代码如下,⽐较外⾏的代码,但是可以实现我要的功能了。

Sub GrossDemand()
Dim c, d, e, rowend, columnend As Variant
c = Sheets("sheet1").Range("a65536").End(xlUp).Row - 1
= "Gross Demand"
Sheets("sheet1").Range("a4:a" & CStr(c)).Copy
ThisWorkbook.Sheets("Gross Demand").Activate
Range("a1:a" & CStr(c - 3)).Select
ActiveSheet.Paste
d = Sheets("MPS").Range("b1").End(xlToRight).Column
Sheets("MPS").Activate
Range(Cells(1, 2), Cells(1, d)).Copy
Sheets("Gross Demand").Activate
Range(Cells(1, 2), Cells(1, d)).Select
ActiveSheet.Paste
End Sub
Sub mmult1()
Dim MaxBomRow, MaxBomColumn, MaxMPSRow, MaxMPSColumn As Variant
MaxBomRow = Sheets("sheet1").Range("a65536").End(xlUp).Row - 1
MaxBomColumn = Sheets("sheet1").Range("a5").End(xlToRight).Column - 1
MaxMPSRow = Sheets("MPS").Range("a65536").End(xlUp).Row
MaxMPSColumn = Sheets("MPS").Range("b1").End(xlToRight).Column
ThisWorkbook.Sheets("Gross Demand").Activate
Range("b2").currentregion.Select
Selection.Offset(1, 1).Resize(Selection.Rows.Count - 1, Selection.Columns.Count - 1).Select
Application.CutCopyMode = False
Selection.FormulaArray = "=MMULT(Sheet1!R5C2:R" & CStr(MaxBomRow) & "C" & CStr(MaxBomColumn) &
",MPS!R2C2:R" & CStr(MaxMPSRow) & "C" & CStr(MaxMPSColumn) & ")"
End Sub
简单来说就是⼀个MMULT矩阵公式的扩充,主要的功能如下:
第⼀个程序
1. ⾃动创建 Gross Demand的Worksheet,
2. 将BoM表的第⼀列Copy到Gross Demand的第⼀列
3. 将MPS表的第⼀列Copy到Gross Demand的第⼀⾏
第⼆个程序
1.找出BoM和MPS⾥⾯合适的区域相乘并将结果放到Gross Demand对应的区域。

代码很菜,所以应该是⽐较容易看懂的。

存在的问题
1. MMULT公式作为矩阵计算公式对数据量有限制,这个会影响这个程序在数据量⼤的状况下是否能正常运⾏。

2. BoM数据透视表的列标顺序和MPS的⾏标顺序必须⼀致,这个地⽅⽐较不傻⽠。

设想的解决⽅案
1. 针对第⼀个问题,将原来的公式替换掉,不⽤矩阵公式算整个区域,⽤BoM表⾥I⾏*MPS⾥的I列这样来算单个材料某天的⽤量,这样是不会有数据量的问题的,设想的逻辑就是设两个参数⽤来定位要计算的单元格,然后这两个参数分别代表Gross Demand表⾥的⾏数和列数,⽤For… Next… 语句。

2. 在我最初设计的表⾥需要先将MPS输到表⾥和BoM对应,现在想修改⼀开始的想法,就是⽤户在⼀开始这个过程的时候先把⽤到的BoM都放到⽂件夹后,MPS先不输⼊,只需要输⼊时间,成品料号和数量在整个程序跑完之后再输⼊,这样可以确保不会因为BoM和MPS⾥⾯成品的顺序问题啊,数量问题导致算出来的结果是错的。

其实逻辑想想不难,就相当于把BoM透视表⾥⾯第⼀⾏复制并且贴到MPS表⾥并且将B2单元格的currentregion选择然后做Offset(1,1),然后再Resize⼀下,把这个区域全填上0就好了。

发布,睡觉!
另外昨晚终于找到了马维峰的Excel & VBA教程,居然在我电脑上本来就有…。

相关文档
最新文档