• 締切済み

ExcelVBA内のVBSで別ブックを開いたとき

ブック1で、誰のPCからでもセキュリティの警告を出さないようにブック2を開くVBSを実行し、ブック1で使用した変数xの値をブック2に渡すということをやりたいのですが、上手くいきません...。 ブック2を開く所まではできたのですが、ブック2のセルに変数xの値を入れようとすると、エラー「インデックスが有効範囲にありません。」が発生し、そもそもブック2をアクティブにできません。 ファイル名・パス等は絶対に間違えていないと思います。 原因とどう修正すれば良いか、教えて頂けないでしょうか。 下記が簡略化したプログラムになります。 Book1のプログラム Sub Book1() Dim x As String x = "aaa" CreateObject ("Shell.Application") CreateObject("Shell.Application").ShellExecute "○○.vbs" Workbooks("Book2.xlsx").Sheets("Sheet1").Range("A1") = x End Sub ---------------------------------------------------------------------------------------------------------- VBSのプログラム Dim strExcFileName Dim objExcApp strExcFileName ="○○¥Book2.xlsx" Set objExcApp = WScript.CreateObject("Excel.Application") objExcApp.Visible = True Call objExcApp.Workbooks.Open(strExcFileName,,True) objExcApp.DisplayAlerts = False WScript.Quit 以上、宜しくお願い致します。

みんなの回答

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

いろいろ実験してみたのですが・・・ たとえば、「abc.vbs」に Dim strExcFileName Dim objExcApp strExcFileName ="D:\Programming\Book2.xlsx" Set objExcApp = CreateObject("Excel.Application") objExcApp.DisplayAlerts = False objExcApp.Visible = True Set bk = objExcApp.Workbooks.Open(strExcFileName) と、記述しておき、 「VBA」の方は、 Sub Book1() Dim x As String x = "aaa" CreateObject("WScript.Shell").Run "D:\Programming\abc.vbs" Application.Wait Now() + TimeValue("00:00:10") Debug.Print Workbooks.Count Workbooks("Book2.xlsx").Worksheets("Sheet1").Range("A1").Value = x End Sub としたところ、「Book2.xlsx」ファイルが立ち上がるのを「10秒」も待っているのに(実際立ち上がっています)、「Workbooks.Count」は、「1」のままなのです。 どうも、マクロを動かすときに、開いているブックが確定してしまい、後から開いたブックは認識されないみたいです。 マクロを動かす前に、これから開くブックを開いておかなければならない、ということですから、質問者のおやりになりたいことは、このままでは、不可能のように思えます。 ただ、「VBScript」側で、データを書き込んでしまうことは可能でした。 「abc.vbs」 Dim bk, wa, strExcFileName, objExcApp Set wa = WScript.Arguments strExcFileName ="D:\Programming\Book2.xlsx" Set objExcApp = CreateObject("Excel.Application") objExcApp.DisplayAlerts = False objExcApp.Visible = True Set bk = objExcApp.Workbooks.Open(strExcFileName) bk.Worksheets("Sheet1").Range("A1").Value = wa(0) 「VBA」側 Dim x As String x = "aaa" CreateObject("WScript.Shell").Run "D:\Programming\abc.vbs " & x すなわち、「WScript.Arguments」で、引数を受け取るのです。

回答No.1

CreateObjectだと、新たにExcelのインスタンスが生成されるので、既存のExcelとは別になってしまい、相互にデータの参照ができない状態になると思います。 既存のExcelインスタンスを取得するには、GetObjectが使えるはずです。

関連するQ&A

  •  VBSの作り方がわかりません

    下記のようなVBSを使いたいのですが   テキストでなくエクセルをアクティブにしたいのですがうまくいきません   どのように直せばよいのかお教えください。  お願いいたします。 Dim excel With CreateObject("Wscript.Shell") .Run "D:\DATA\T.txt" End With On Error Resume Next Set excel = GetObject(, "Excel.Application") If Err.Number <> 0 Then Set excel = CreateObject("Excel.Application") End If excel.Visible = True excel.Workbooks.Open "D:\DATA\Sin1.xls"

  • vbsでexcelのクリアとフォームの表示をしたい

    お世話になっております。 vbsの以下の記述でexcelを開いています。 開くところまでは行くのですが、その後のsheet1のデータのクリアとUserForm1の表示がどうしてもできません。 申し訳ありませんが、どなたかおわかりの方、教えていただけないでしょうか。 宜しくお願いいたします。 Dim oApp Dim objWshShell Dim scriptPath 'Excelオブジェト作成 Set oApp = CreateObject("Excel.Application") 'WScript.Shellオブジェクト作成 Set objWshShell = CreateObject("WScript.Shell") oApp.Visible = True '不可視にする oApp.UserControl = True 'Excelファイルを開く scriptPath = WScript.ScriptFullName scriptPath = left(scriptPath,len(scriptPath)-len(WScript.ScriptName)) oApp.Workbooks.Open scriptPath & "共同資料.xlsm"

  • VBSからのエクセル操作

    エクセルでテキストファイルを開く作業をVBSで自動化したいのですが、下のスクリプトが上手く動作しません。どうすれば上手いこと動くように出来るでしょう? OpenTextのVBS上での使用法がポイントだと思うんですが。 Dim objXL Set objXL = WScript.CreateObject("Excel.Application") objXL.Workbooks.OpenText "hoge.txt", ,1, xlDelimited, xlDoubleQuote, False, False, False, False, False, True, ":", Array(1, 1) objXL.Visible = True

  • vbsでexcelファイルを印刷したいのですが、印刷部数の設定がどうし

    vbsでexcelファイルを印刷したいのですが、印刷部数の設定がどうしてもわかりません。 他で見つけたスクリプトですが…。 Set obj = CreateObject("Excel.Application") Set WSHShell = CreateObject("Wscript.Shell") Set objWkBk = obj.Workbooks.Open("D:\TEST.xlsx") obj.ActiveWindow.SelectedSheets.PrintOut() obj.quit() Set obj = Nothing ご教授お願いいたします。

  • エクセルVBAでブックを開くと処理が終わってしまう

    VBA初心者なのですが、VBAでエクセルブックを開くとVBAの処理が終わってしまいます。理由がわからないのでアドバイスをお願いします。なお、止まってしまう箇所にコメントを入れプログラムを下記しました。また、4000字以上質問できないためプログラムの途中までしか書かれていません。そのため、余分な宣言が多数ありますが無視してください。よろしくお願いいたします。 Option Base 1 Sub 健康診断の郵送() Dim kyoNum() As String Dim b_name As String Dim a_name() As Variant Dim b_address As String Dim a_address() As Variant Dim mailNum() As Variant Dim place() As String Dim banchi() As String Dim ken() As String Dim Adr As String Dim AdrLen As Integer Dim i, j, k, cnt, l, m As Integer Dim ChrCode As Integer Dim cell As Range Dim Book1 As String Dim wb As Workbook Dim Book1_Path As String Dim flag As Boolean 'セルのクリア ThisWorkbook.ActiveSheet.Cells.ClearComments 'セルのプロパティを設定をする With ThisWorkbook.ActiveSheet.Columns("A:B") .ShrinkToFit = True .NumberFormatLocal = "@" .ColumnWidth = 45 End With 'カレントディレクトリのチェンジ(Windows2000以降) CreateObject("WScript.Shell").CurrentDirectory = ThisWorkbook.Path '簡易名称Book1にする Book1 = "Book1.xlsx" 'パスを取得する Book1_Path = ThisWorkbook.Path & "\" & Book1 If Dir(Book1_Path) = "" Then MsgBox "Book1.xlsxファイルが存在しません。", vbExclamation End If '同名ブックのチェック For Each wb In Workbooks If wb.Name = Book1 Then MsgBox "健康診断の郵送.xlsmはBook1を開こうとしています" _ & vbCrLf & "Book1を閉じて再実行してください", vbExclamation Exit Sub End If Next wb Application.ScreenUpdating = False '画面の更新を止める Workbooks.Open Book1_Path '*****←ここで処理が終わってしまう***** 'ブック名を指定して非表示 Application.Windows("Book1.xlsx").Visible = False '後方検索でBook1.xlsxの入力済みセルの行数と列数を取得 With Workbooks("Book1.xlsx").ActiveSheet.UsedRange Book1_MaxRow = .Find("*", , xlValues, , xlByRows, xlPrevious).Row - 2 'データ入力済み行数取得 End With Application.ScreenUpdating = True Workbooks("Book1.xlsx").Activate j = 1 ReDim kyoNum(Book1_MaxRow) ReDim a_name(Book1_MaxRow) ReDim a_address(Book1_MaxRow) ReDim mailNum(Book1_MaxRow) ReDim ken(Book1_MaxRow) ReDim place(Book1_MaxRow) ReDim banchi(Book1_MaxRow)

  • VBSについて

    VBSの中でDOSのコマンドを実行したいのですが、VBS内で使用した変数を Runで使うことはできないのでしょうか? ################################################ Set WSHShell = CreateObject("WScript.Shell") x = "C:\Documents and Settings\user" WSHShell.Run "cmd.exe /K dir x" ################################################ たとえば上記のようなプログラムを作ったときに最終行のcmd.exeの 実行で変数xを使用したいのですが、可能でしょうか? このまま実行するとコマンドプロンプトの窓が開いて「ファイルが見つかりません」と表示されてしまいます。 何か方法があればご教授ください。よろしくお願いします。

  • VBSファイルをスタートアップフォルダに入れておいて、

    エクセル2007の特定ファイルをそのVBSファイルにより自動起動させる方法を教えてください。ちなみに、次のようなVBSファイルを作成しましたがエラーとなってしまいます。 Option Explicit 'オブジェクト変数の宣言とWshShellオブジェクトの作成。 Dim objWshShell Set objWshShell = WScript.CreateObject("WScript.Shell") WScript.Sleep 1000 '1秒待機 objWshShell.Run "C:¥Program Files¥Microsoft Office¥Office12¥EXCEL.exe" です。

  • インターネットで調べてVBSで下のようなものを作ってみました。

    インターネットで調べてVBSで下のようなものを作ってみました。 やりたいことは、IEを起動して複数のサイトを複数のタブで表示 したいのですが、サイトの種類分IEも起動してしまいます。 考えているようなことはできないのでしょうか。 ========ここから下です======== Option Explicit Dim objIE Dim objShell 'Shell.Application Set objShell = CreateObject("Shell.Application") Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True 'IEウィンドウを表示 objIE.Navigate2 "http://www.okwave.jp/" Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True 'IEウィンドウを表示 objIE.Navigate2 "http://www.google.co.jp/" Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True 'IEウィンドウを表示 objIE.Navigate2 "http://www.yahoo.co.jp/" ======================= よろしくお願いいたします。

  • VBSで起動したアプリが前面表示しない

    Powerpointをコンテキストメニューに「読み取り専用」を追加するために以下のVBscriptを起動すると前面表示されません。 どうしたら前面表示されますでしょうか? 起動コマンド wscript.exe "C:\Program Files\Microsoft Office\Office14\OpenPptAsReadOnly.vbs" "%1" 以下がVBscript(OpenPptAsReadOnly.vbs)です。 Dim strPPTFileName Dim objPPTApp '引数のチェック If WScript.Arguments.Count <> 1 Then WScript.Quit 'ファイル名取得 strPPTFileName = WScript.Arguments(0) '起動 Set objPPTApp = WScript.CreateObject("Powerpoint.Application") objPPTApp.Visible = True '読み取り専用で開く Call objPPTApp.Presentations.Open(strPPTFileName,True) '終了処理 Set objPPTApp = Nothing WScript.Quit

  • vbsでループさせる

    vbsでループさせる http://nagabuchi.jugem.jp/?eid=237 で作ったバッチで常駐ソフト(自分はSkydriveとかのクラウドサービス)の起動を遅らせる事ができるようになり、めでたしめでたしなんですが、 セキュリティソフト(KasperskyInternetSecurity2013)より先に常駐ソフトが立がるのは問題だろうと思い、 上記URLで作成する.vbsを改良しようと思いました。 http://q.hatena.ne.jp/1203153427 を参考に以下に示すような感じに変更してみたものの、CreateObjectの行がうまくいきません。 KasperskyInternetSecurity2013 (実行ファイルはC:\Program Files (x86)\Kaspersky Lab\Kaspersky Internet Security 2013にあるavp.exe) が起動した後にstartup.batを起動するにはどうすればいいでしょうか? wait9s.batの中身 ping -n 9 127.0.0.1 > nul 問題の.vbsファイル Sub StartAfterKaspersky() Const program_name = "avp.exe" Dim x For x = 1 To 10 If processCheck(program_name) = Ture Then CreateObject("WScript.Shell")ws.run "cmd /c startup.bat",vbhide Else CreateObject("WScript.Shell")ws.run "cmd /c wait9s.bat",vbhide End If Next MsgBox "27秒も待ったのに、Kasperskyが起動しません。強制起動します。" CreateObject("WScript.Shell").Run program_name End Sub '//------------------------------------------------ ' プロセスが動いているかチェックする関数 '//------------------------------------------------ Function processCheck( pName ) '//------------------------------------------------ processCheck = False Dim objPWMI On Error Resume Next Set objPWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\localhost\root\cimv2") Err.Clear On Error GoTo 0 If Err.Number <> 0 Then Exit Function '接続できなかったら、終了 Dim colProc Set colProc = objPWMI.ExecQuery("Select * from Win32_Process WHERE Name='" & pName & "'") If colProc.Count > 0 Then processCheck = True End Function

専門家に質問してみよう