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でマクロを実行することは可能ですか? にあるソリューションを試してみましたが、これまでのところ(そしてもちろん変更されました)、動作しませんでした。 「Microsoft Office Excel:マクロ 'Macro.TestMacro'が見つかりません」というエラーが引き続き表示されます。
編集:Excel 2003。
わかりました、実際は簡単です。マクロがいずれかのシートではなくモジュールにあると仮定すると、次を使用します。
objExcel.Application.Run "test.xls!dog"
'notice the format of 'workbook name'!macro
スペースを含むファイル名の場合は、ファイル名を引用符で囲みます。
マクロをシート(シート1など)の下に配置した場合、シート1が関数を所有していると想定してください。
objExcel.Application.Run "'test 2.xls'!sheet1.dog"
注意:使用していたmacro.testfunction表記は必要ありません。
これをやろうとしていると思いますか? (試行およびテスト済み)
このコードはファイル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
「マクロが見つかりませんまたは無効になっています」エラーを克服する方法を探して終日殺した後、私の関連する質問が義手によって削除されたため、ここで私のために働いた唯一の構文を投稿しました(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、勝利7
open_form
マクロを実行するために@Siddhartのコードを相対パスに適合させようとしましたが、うまくいかないようでした。これが私の最初の試みでした。私の作業ソリューションは以下です。
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
には「表示に戻す」も含まれていることに注意してください。
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
とにかく、あなたの助けに感謝し、誰かがそれを必要とする場合、これが役立つことを願っています
上記の方法を試しましたが、「マクロが見つかりません」というエラーが表示されました。これが機能する最終コードです!
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です。
個人のブックからマクロを実行しようとすると、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を開き、そこから他のすべてのワークブックのマクロを実行しています。私がやったように誰かがこれに遭遇した場合に備えてここに投稿すべきだと思ったが、なぜマクロがまだ実行されていないのか理解できない。
こんにちは、このスレッドを使用してソリューションを取得し、誰かがそれを使用できる場合に備えて、私がしたことを共有したいと思います。
私が望んでいたのは、いくつかのセルを変更し、いくつかの行を消去するマクロを呼び出すことでしたが、1500以上のExcelが必要でした(各ファイルに約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