VBScript打开Excel,然后添加VBA宏

VBScript打开Excel,然后添加VBA宏,excel,vbscript,vba,Excel,Vbscript,Vba,我需要一个VBScript来打开某个Excel文档,然后在打开它时必须添加一个宏并保存 我可以打开Excel文档,但我不知道如何打开宏屏幕(Alt+F11),然后添加代码并保存 有什么办法可以这样做吗 Set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open("C:\test.xls") objExcel.Application.DisplayAlerts = False

我需要一个VBScript来打开某个Excel文档,然后在打开它时必须添加一个宏并保存

我可以打开Excel文档,但我不知道如何打开宏屏幕(Alt+F11),然后添加代码并保存

有什么办法可以这样做吗

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:\test.xls")
objExcel.Application.DisplayAlerts = False
objExcel.Application.Visible = True`

'Macro Script

Sub HideRows()
    Dim cell As Range   
    For Each cell In Range("H1:W200")
        If Not isEmpty(cell) Then
            If cell.Value <> "" And cell.Value = 0 Then 
                cell.EntireRow.Hidden = True
                Columns("H").EntireColumn.Hidden = True
                Columns("I").EntireColumn.Hidden = True
                Columns("J").EntireColumn.Hidden = True
                Columns("M").EntireColumn.Hidden = True
                Columns("N").EntireColumn.Hidden = True
                Columns("O").EntireColumn.Hidden = True
                Columns("P").EntireColumn.Hidden = True
                Columns("Q").EntireColumn.Hidden = True
                Columns("S").EntireColumn.Hidden = True
                Columns("T").EntireColumn.Hidden = True
                Columns("V").EntireColumn.Hidden = True
            End If
        End If
    Next
End Sub
Set-objExcel=CreateObject(“Excel.Application”)
设置objWorkbook=objExcel.Workbooks.Open(“C:\test.xls”)
objExcel.Application.DisplayAlerts=False
objExcel.Application.Visible=True`
'宏脚本
子隐藏对象()
暗淡单元格作为范围
对于范围内的每个单元格(“H1:W200”)
如果不是空的(单元格),那么
如果cell.Value“”和cell.Value=0,则
cell.EntireRow.Hidden=True
列(“H”).entireclumn.Hidden=True
列(“I”).entireclumn.Hidden=True
列(“J”).entireclumn.Hidden=True
列(“M”).entireclumn.Hidden=True
列(“N”).entireclumn.Hidden=True
列(“O”).entireclumn.Hidden=True
列(“P”).entireclumn.Hidden=True
列(“Q”).entireclumn.Hidden=True
列(“S”).entireclumn.Hidden=True
列(“T”).entireclumn.Hidden=True
列(“V”).entireclumn.Hidden=True
如果结束
如果结束
下一个
端接头

这不是直截了当的,但我要做的是使用
SendKeys
函数模拟Alt+F11

然后使用相同的逻辑,使用按键导航到适当的窗口,添加模块,然后使用以下命令将宏代码粘贴到正确的位置:

Application.SendKeys ""^V"
Application.SendKeys ""^V", True   'Incase that one above does not work
然后,您可以使用以下方法进行保存:

Application.SendKeys ""^S", True
你可以阅读更多关于这个和


但另一种方法是使用鼠标和键盘宏记录器(可以编程模拟动作的独立应用程序)。我个人已经用了十多年的时间做这类事情。

您可以使用
VBProject
对象的
VBComponents
对象以编程方式添加代码。因此,在代码的最后一行后面添加以下内容:

Set objModule = objworkbook.VBProject.VBComponents.Add(1)       ' 1 = vbext_ct_StdModule

objExcel.Visible = True    ' not necessary if you close Excel anyway

theSource = ""
theSource = theSource & "Sub HideRows()" & vbCrLf
theSource = theSource & "    Dim cell As Range   " & vbCrLf
theSource = theSource & "    For Each cell In Range(""H1:W200"")" & vbCrLf
theSource = theSource & "        If Not isEmpty(cell) Then" & vbCrLf
theSource = theSource & "            If cell.Value <> """" And cell.Value = 0 Then " & vbCrLf
theSource = theSource & "                cell.EntireRow.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""H"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""I"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""J"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""M"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""N"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""O"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""P"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""Q"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""S"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""T"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "                Columns(""V"").EntireColumn.Hidden = True" & vbCrLf
theSource = theSource & "            End If" & vbCrLf
theSource = theSource & "        End If" & vbCrLf
theSource = theSource & "    Next" & vbCrLf
theSource = theSource & "End Sub" & vbCrLf

objModule.CodeModule.AddFromString theSource

'objExcel.Quit

'Set objExcel = Nothing
Set objModule=objworkbook.VBProject.VBComponents.Add(1)'1=vbext\u ct\u StdModule
objExcel.Visible=True'如果仍然关闭Excel,则不需要
theSource=“”
theSource=theSource&“Sub HideRows()”&vbCrLf
源=源和“作为范围的变暗单元格”&vbCrLf
theSource=范围(“H1:W200”)中每个单元格的源(&vbCrLf)
theSource=theSource&“如果不是空的(单元格),那么”&vbCrLf
theSource=theSource&“如果cell.Value”“”“和cell.Value=0,则”&vbCrLf
theSource=theSource&“cell.EntireRow.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““H”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““I”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““J”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““M”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““N”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““O”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““P”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““Q”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““S”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““T”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“Columns(““V”)。EntireColumn.Hidden=True”&vbCrLf
theSource=theSource&“End If”&vbCrLf
theSource=theSource&“End If”&vbCrLf
theSource=theSource&“Next”&vbCrLf
theSource=theSource&“End Sub”和vbCrLf
objModule.CodeModule.AddFromString源
'objExcel.Quit
'Set objExcel=Nothing
遵循以下步骤:

  • 在Excel中打开VBA编辑器并添加新模块
  • 将宏代码粘贴到其中
  • 右键单击模块并选择导出…
  • 给它一个文件名并保存在某个地方
  • 在VBScript中,添加以下代码行:

    objWorkbook.VBProject.VBComponents.Import "/path/to/your/module.bas"
    objWorkbook.Save
    
    请注意,在Excel 2007+中,不能将宏保存在
    xlsx
    文件中。您需要改用
    SaveAs
    ,并为文件提供
    xslm
    扩展名。或者,您可以使用旧的
    xls
    格式(这是您在示例中使用的格式)


  • 我强烈建议您在不使用SendKeys的情况下解决这个问题,因为这种方法可能会(不情愿地)被用户破坏,并且会使屏幕在整个过程中变得无用。或者@Zam的链接应该对您有所帮助。只需一提:许多人认为SendKeys风险太大,通常不建议将其用于业务解决方案。
    objWorkbook.VBProject.VBComponents.Import "/path/to/your/module.bas"
    objWorkbook.Save