Ruby操作VBA的注意事项和技巧(2):宏里调用和控制窗体以及窗体上的控件、不同workbook之间的宏互相调用

时间:2021-07-26 15:18:21

4.宏里调用并控制窗体以及窗体上的各种控件

1 Sub Criterion_Check()
2   If Workbooks.count = 0 Then   '如果当前没有打开的工作薄的话需要发出警告
3         MsgBox "工作簿未创建,请先创建一个工作簿,或打开一个工作簿。"
4         Exit Sub
5     End If
6  CriterionCheckDlg.Show (vbModeless)  '调用对话框进行规则检查,放到static_check函数下,在按钮CommandButtonOk的响应事件下调用该函数 CriterionCheckDlg.CommandButtonOk = True  '哈哈,直接调用按钮事件原来就可以啦,直接设置窗体的CommandButtonOk属性设置为True,后面凡是调用这个Criterion_Check宏的都会自动触发按钮执行静态检查,无需再麻烦进行快捷键出发了,简直太棒了
7 End Sub

5.不同WorkBook之间宏的相互调用(基于Ruby里的Run方法只能调用系统宏和当前Excel自带宏的问题提出的解决方法)

1 excel.Run('CriterionCheck')#这个宏只能是当前操作的Excel里的宏,为了用一个workbook里的宏操作另一个workbook,应该在VBA里用切换活动窗口的形式,而且把前面的宏的操作设置为针对活动窗

别问我为神魔不能直接写一个宏供系统里工所有打开的Excel调用,公司里的Excel2007应该是做过改装的,没有那个可以存储自定义宏供所有Excel文件都可以调用的个人工作簿PERSONAL.XLSB。本来我写了一个名为内容为空的A.xlsm的文件存储了用于

部门业务的宏,但当在Ruby里用run方法调用的时候,处理的永远是宏所在的这个啥内容都没有的A.xlsm,,,简直快逼疯宝宝了...苦想两天,终于彻底解决了这个问题!!!解决步骤如下

(a):同时打开A.xlsm和业务需要处理的Excel文件(例如B.xlsm),在业务宏(含有各种规则)里设置B.xlsm为当前活动窗口

1 Dim i As Integer, str As String
2  i = Workbooks.count
3  i = i - 1
4  'MsgBox i
5  'For i = Workbooks.count To 1 Step -1
6  'str = Workbooks(i).Name
7  'MsgBox "第" & i & "个活动窗口名称为" & str
8  Workbooks(i).Activate '将要检查的表先打开,再打开含有静态检查宏的表,这个顺序是必要的,绝对不苛刻颠倒,要不会出很大问题!!

(b)在要调用业务宏之前,同样要先执行一遍上面的代码,然后就可以执行业务宏了,处理的即为自己想要处理的表格

 1 Sub 切换工作簿()     Dim i As Integer, str As String
 2     i = Workbooks.count
 3     i = i - 1
 4     'MsgBox i
 5     'For i = Workbooks.count To 1 Step -1
 6      'str = Workbooks(i).Name
 7      'MsgBox "第" & i & "个活动窗口名称为" & str
 8         Workbooks(i).Activate
 9
10         Criterion_Check’业务宏调用,处理的即为上面的Workbooks(i)
11     'Next i
12
13 End Sub