37

Excelファイルの外部からExcelマクロを実行しようとしています。現在、コマンドラインから実行される「.vbs」ファイルを使用していますが、マクロが見つからないというメッセージが表示され続けます。これが私が使おうとしているスクリプトです

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("test.xls")

objExcel.Application.Visible = True
objExcel.Workbooks.Add
objExcel.Cells(1, 1).Value = "Test value"

objExcel.Application.Run "Macro.TestMacro()"
objExcel.ActiveWorkbook.Close


objExcel.Application.Quit
WScript.Echo "Finished."
WScript.Quit

そして、これが私がアクセスしようとしているマクロです:

Sub TestMacro()
'first set a string which contains the path to the file you want to create.
'this example creates one and stores it in the root directory
MyFile = "C:\Users\username\Desktop\" & "TestResult.txt"
'set and open file for output
fnum = FreeFile()
Open MyFile For Output As fnum
'write project info and then a blank line. Note the comma is required
Write #fnum, "I wrote this"
Write #fnum,
'use Print when you want the string without quotation marks
Print #fnum, "I printed this"
Close #fnum
End Sub

にあるソリューションを試しました。外部コマンドからExcelでマクロを実行することは可能ですか?ここまで到達する(そしてもちろん変更する)が、うまくいかなかったようだ。「MicrosoftOfficeExcel:マクロ'Macro.TestMacro'が見つかりません」というエラーが表示され続けます。

編集:Excel2003。

4

8 に答える 8

44

わかりました、それは実際には簡単です。マクロがシートの1つではなくモジュールにあると仮定すると、次を使用します。

  objExcel.Application.Run "test.xls!dog" 
  'notice the format of 'workbook name'!macro

スペースを含むファイル名の場合は、ファイル名を引用符で囲みます。

マクロをシート、たとえばsheet1の下に配置した場合は、sheet1が関数を所有していると想定してください。

    objExcel.Application.Run "'test 2.xls'!sheet1.dog"

注意:これまで使用してきたmacro.testfunction表記は必要ありません。

于 2012-04-19T16:42:32.183 に答える
23

このコードは、ファイルTest.xlsを開き、マクロTestMacroを実行して、テキストファイルに書き込みます。TestResult.txt

Option Explicit

Dim xlApp, xlBook

Set xlApp = CreateObject("Excel.Application")
'~~> Change Path here
Set xlBook = xlApp.Workbooks.Open("C:\Test.xls", 0, True)
xlApp.Run "TestMacro"
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Echo "Finished."
WScript.Quit
于 2012-04-19T16:50:48.327 に答える
5

「マクロが見つからないか無効になっている」エラーを打ち負かす方法を探して一日中殺した後、私の関連する質問が正しい手によって削除されたので、ここに私のために働いた唯一の構文を投稿しました(application.runは関係ありませんでした私が試したこと)

Set objExcel = CreateObject("Excel.Application")

' Didn't run this way from the Modules
'objExcel.Application.Run "c:\app\Book1.xlsm!Sub1"
' Didn't run this way either from the Sheet
'objExcel.Application.Run "c:\app\Book1.xlsm!Sheet1.Sub1"
' Nor did it run from a named Sheet
'objExcel.Application.Run "c:\app\Book1.xlsm!Named_Sheet.Sub1"

' Only ran like this (from the Module1)

Set objWorkbook = objExcel.Workbooks.Open("c:\app\Book1.xlsm")
objExcel.Run "Sub1"

Excel 2010、Win 7

于 2016-04-20T23:20:49.357 に答える
4

@Siddhartのコードを相対パスに適合させてopen_formマクロを実行しようとしましたが、機能しなかったようです。これが私の最初の試みでした。私の実用的な解決策は以下のとおりです。

Option Explicit

Dim xlApp, xlBook
dim fso
dim curDir
set fso = CreateObject("Scripting.FileSystemObject")
curDir = fso.GetAbsolutePathName(".")
set fso = nothing

Set xlApp = CreateObject("Excel.Application")
'~~> Change Path here
Set xlBook = xlApp.Workbooks.Open(curDir & "Excels\CLIENTES.xlsb", 0, true)
xlApp.Run "open_form"
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Echo "Finished."

編集

誰かがスタンドアロンアプリケーションと「同じように」ユーザーフォームを実行したい場合に備えて、私は実際にそれを解決しました。

私が直面していた問題:

1-Excelが読み取り専用でロックされているため、Workbook_Openイベントを使用したくありませんでした。2-バッチコマンドは、(私の知る限り)マクロを呼び出せないという事実に制限されています。

私は最初に、アプリケーションを非表示にしながらユーザーフォームを起動するマクロを作成しました。

Sub open_form()
 Application.Visible = False
 frmAddClient.Show vbModeless
End Sub

次に、このマクロを起動するためのvbsを作成しました(相対パスを使用して実行するのは難しいです)。

dim fso
dim curDir
dim WinScriptHost
set fso = CreateObject("Scripting.FileSystemObject")
curDir = fso.GetAbsolutePathName(".")
set fso = nothing

Set xlObj = CreateObject("Excel.application")
xlObj.Workbooks.Open curDir & "\Excels\CLIENTES.xlsb"
xlObj.Run "open_form"

そしてついにVBSを実行するためのバッチファイルを作成しました...

@echo off
pushd %~dp0
cscript Add_Client.vbs

Userform_QueryClose私の:に「Setbacktovisible」も含めていることに注意してください。

Private Sub cmdClose_Click()
Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ThisWorkbook.Close SaveChanges:=True
    Application.Visible = True
    Application.Quit
End Sub

とにかく、あなたの助けに感謝します、そして私は誰かがそれを必要とするならばこれが助けになることを願っています

于 2014-01-05T08:22:55.303 に答える
3

上記の方法を試しましたが、「マクロが見つかりません」というエラーが発生しました。これは機能した最終的なコードです!

Option Explicit

Dim xlApp, xlBook

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True

  ' Import Add-Ins
xlApp.Workbooks.Open "C:\<pathOfXlaFile>\MyMacro.xla"
xlApp.AddIns("MyMacro").Installed = True

'
Open Excel workbook
Set xlBook = xlApp.Workbooks.Open("<pathOfXlsFile>\MyExcel.xls", 0, True)

' Run Macro
xlApp.Run "Sheet1.MyMacro"

xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Quit

私の場合、MyMacroはたまたまSheet1の下にあり、したがってSheet1.MyMacroです。

于 2016-01-20T09:26:14.417 に答える
1

私は通常、マクロをxlamワークブックとは別にアドインに保存するので、ワークブックを開いてから、別々に保存されたマクロを実行したいと思いました。

これにはVBSスクリプトが必要だったので、引数を渡して使用できるように「ポータブル」にしたかったのです。これが最後のスクリプトで、3つの引数を取ります。

  • ワークブックへのフルパス
  • マクロ名
  • [オプション]マクロでワークブックを分離するためのパス

私はそれを次のようにテストしました:

"C:\Temp\runmacro.vbs" "C:\Temp\Book1.xlam" "Hello"

"C:\Temp\runmacro.vbs" "C:\Temp\Book1.xlsx" "Hello" "%AppData%\Microsoft\Excel\XLSTART\Book1.xlam"

runmacro.vbs:

Set args = Wscript.Arguments

ws = WScript.Arguments.Item(0)
macro = WScript.Arguments.Item(1)
If wscript.arguments.count > 2 Then
 macrowb= WScript.Arguments.Item(2)
End If

LaunchMacro

Sub LaunchMacro() 
  Dim xl
  Dim xlBook  

  Set xl = CreateObject("Excel.application")
  Set xlBook = xl.Workbooks.Open(ws, 0, True)
  If wscript.arguments.count > 2 Then
   Set macrowb= xl.Workbooks.Open(macrowb, 0, True)
  End If
  'xl.Application.Visible = True ' Show Excel Window
  xl.Application.run macro
  'xl.DisplayAlerts = False  ' suppress prompts and alert messages while a macro is running
  'xlBook.saved = True ' suppresses the Save Changes prompt when you close a workbook
  'xl.activewindow.close
  xl.Quit

End Sub 
于 2020-01-10T17:11:38.370 に答える
0

個人のブックからマクロを実行しようとすると、VBScriptでExcelファイルを開いてもPERSONAL.XLSBが自動的に開かないため、機能しない場合があります。次のようなことをする必要があります。

Dim oFSO
Dim oShell, oExcel, oFile, oSheet
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
Set oExcel = CreateObject("Excel.Application")
Set wb2 = oExcel.Workbooks.Open("C:\..\PERSONAL.XLSB") 'Specify foldername here

oExcel.DisplayAlerts = False


For Each oFile In oFSO.GetFolder("C:\Location\").Files
    If LCase(oFSO.GetExtensionName(oFile)) = "xlsx" Then
        With oExcel.Workbooks.Open(oFile, 0, True, , , , True, , , , False, , False)



            oExcel.Run wb2.Name & "!modForm"


            For Each oSheet In .Worksheets



                oSheet.SaveAs "C:\test\" & oFile.Name & "." & oSheet.Name & ".txt", 6


            Next
            .Close False, , False
        End With
    End If



Next
oExcel.Quit
oShell.Popup "Conversion complete", 10

したがって、ループの開始時に、personals.xlsbを開き、そこから他のすべてのブックのマクロを実行します。誰かが私のようにこれに遭遇した場合に備えて、ここに投稿する必要があると思ったのですが、マクロがまだ実行されていない理由がわかりません。

于 2013-11-20T20:38:53.733 に答える
0

こんにちは、このスレッドを使用してソリューションを取得しました。次に、誰かが使用できる場合に備えて、私が行ったことを共有したいと思います。

私が欲しかったのは、いくつかのセルを変更し、いくつかの行を消去するマクロを呼び出すことでしたが、1500以上のエクセルが必要でした(各ファイルに約3分を費やしました)

主な問題:-vbeからマクロを呼び出すと、同じ問題が発生しました。スクリプトがExcelを実行したときに、PERSONAL.XLSBからマクロを呼び出すことができず、personal.xlsbが実行されず、マクロウィンドウにオプションがありませんでした。

私はこれを解決するために、マクロがロードされた状態で1つのExcelファイルを開いたままにします(a.xlsm)(スクリプトを実行する前に)

次に、スクリプトが適用したExcelからマクロを呼び出します

    Option Explicit
    Dim xl
    Dim counter

   counter =10



  Do

  counter = counter + 1

  Set xl = GetObject(, "Excel.Application")
  xl.Application.Workbooks.open "C:\pruebas\macroxavi\IA_030-08-026" & counter & ".xlsx"
  xl.Application.Visible = True
  xl.Application.run "'a.xlsm'!eraserow" 
  Set xl = Nothing


  Loop Until counter = 517

  WScript.Echo "Finished."
  WScript.Quit
于 2015-05-28T15:11:47.123 に答える