【無料配信♪】Renta !全タテコミ作品第1話

お世話になります。
PLC/TakebishiDeviceXPlorer/PC(ExcelVBA)で、生産設備のモニタリング&分析を行うべく作業を進めています。
その中で『メインBookから別インスタンスでモニタBookをマクロ有効で開く』に関し、ネットの情報を頼りにvbsで実現する事は出来ましたが、vbsで下記エラーが発生しています。
(呼出側/起動Open側共に、問題なく次の動作に入り正常に動作しています。)

▲発生エラー
 :未知の実行時エラーです。/コード:800A9C68/ソース:MicrosoftVBScrip・・・

●メイン側呼出コード
'---引数
Dim arg_str10 As String '---Exle FullPathName
Dim arg_str20 As String '---Exle ModName
Dim arg_str21 As String '---Exle ProcName
temp1 = objMySheet.Range("D9")  ’---起動するモニタBook保存先
temp2 = objMySheet.Range("D10")  '---起動するBook名
arg_str10 = temp1 & "\" & temp2
arg_str20 = objMySheet.Range("D13")
arg_str21 = objMySheet.Range("D14")
vbsRslt = "開始": objMySheet.Range("D15") = vbsRslt
'---vbs起動
vbsRslt = Shell("WScript.exe """ & vbsFullPathName & """" _
& " " & arg_str10 & " " & arg_str20 & " " & arg_str21)
 ’---結果(実行OK_64[タスクID]5584) 
 objMySheet.Range("D15") = "実行OK_" & vbInformation & "[タスクID]" & vbsRslt
 ※マクロ直接起動です。BookOpenEventは使用していません。
■VBS
Option Explicit
DIM Prms
Set Prms = WScript.Arguments
DIM tgtExcelFullPName,tgtModule,tgtProc,tgtMacro
tgtExcelFullPName= Prms(0)
tgtModule=Prms(1)
tgtProc=Prms(2)
tgtMacro=tgtModule & "." & tgtProc
DIM objExcelApp,objWbk
Set objExcelApp= CreateObject("Excel.Application")
objExcelApp.EnableEvents=False
Set objWbk= objExcelApp.Workbooks.Open(tgtExcelFullPName,False,True)
objExcelApp.Visible = True
objExcelApp.Run"'" & objWbk.Name & "'!" & tgtMacro ←▲エラー発生行 
objExcelApp.EnableEvents=false
Set objWbk=Nothing
Set objExcelApp=Nothing

今後も機能を追加し仕組みが大きくなって行く事から、将来的にこのエラーが原因となり
仕組みの再構築等の事態になる事があるのかを確認しておきたいです。
ネットで「800A9C68」を検索してみましたが、英文のみで・・・・

教えてください。
1)エラーの意味合いは?
2)発生の原因と対処法は?

A 回答 (3件)

1) は、月次で、VBSから、VBAが実行できなかったというだけのエラーだと思います。



2)試しにこちら(○)に変えてみてください。

理屈は、マクロのセキュリティを騙すように、自分の配下から呼び出すという方法です。

'objExcelApp.Run"'" & objWbk.Name & "'!" & tgtMacro ←▲エラー発生行 
objWbk.Application.Run tgtMacro '←○

他に問題があるのかどうかは、まだ見ていません。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございました。

2)objWbk.Application.Run tgtMacro '←○
  objExcelApp.Run"'" & objWbk.Name & "'!" & tgtMacro ←× 
  『○』にてエラー無しに起動できました。
  理屈に関しては??ですが
  ⇒もう少し勉強したく、参照先等有りましたら教えてください。

1)月次で、VBSから、VBAが実行できなかったというだけのエラーだと思います。
(1)「月次で、」は何でしょうか?
(2)VBSから別インスタンスのエクセルを開き、そのVBAコードは
   実行できています、(但しVBSエラーが出る。)
  「VBAが実行できなかった」とはちょっと違うかなと?
  (800A9C68は、余計なお世話エラー?)

お礼日時:2018/05/10 13:36

>(1)「月次で、」は何でしょうか?


要するに、VBA単独でしたら、すぐ分かる、「○○のためにマクロが実行できません」というエラーメッセージ付きのエラーも、VBS を通すと、その内容がなくなって、エラーコードだけになってしまうものではないか、と考えました。

>2)VBSから別インスタンスのエクセルを開き、そのVBAコードは
>   実行できています、(但しVBSエラーが出る。)◆
>  「VBAが実行できなかった」とはちょっと違うかなと?

しかし、これはあくまでも推理だけで、実際は、Excel側からは確認できない、VBS の Unknown Error だから証明のしようがありません。

1)で書いたものは、一例ですが、そのエラー[◆]は、本当は、VBSからのものではなく、Excelのマクロからのでもなく、Excel本体からの何らかのメッセージだと思ったのです。

最近、私の別の質問の回答の中で、私の公開したマクロに、Excelのセキュリティの警告がでると言われて、エラーコードは違いますが、800... と似たコードで、同類のエラーで悩まされました。私の通常のPCでは発生しません。このVBSのコードを試してみた時に、その類の警告がコードとなって現れたのではないか、と思いました。だから「実行できなかった」というように捉えました。実際はそうではなかったようですが。

もし、それが正しければ、objExcelApp.DisplayAlerts = False で抑え込めるはずではあるけれども、そんな無茶なことはできませんね。

それで、経験的なことですが、Excel VBAだけの特徴で、オートメーション・オブジェクトとしてインスタンスが生成された時に、標準モジュールとオブジェクトモジュール(ThisWorkbookモジュールなど)と分離してしまう現象があります。だから、一旦、そのマクロは、分離したものではなく、自分の配下であるとして実行してやらなくてはならない、そういうところにあるのではないか、と考えました。(*)

英語の掲示板をざっと見ましたが、結果的には解決していても、どうも解決の手順や理屈は分かりません。

また、私の記憶にある解決方法は、Run を使わないで、別にあったような気がしてなりません。記憶違いかもしれません。*
結果オーライだから、深くは追求するつもりはありませんが。
    • good
    • 0
この回答へのお礼

ありがとうございました。
自分にとっては、理屈についてはやはり難しですね
VBS/ブック/マクロ指定起動の
「結果オーライツールコード」として捉える事にします。

お礼日時:2018/05/14 08:30

>メインBookから別インスタンスでモニタBookをマクロ有効で開く



「Excel から 別インスタンスで Excel を開く」ということは普通に出来ますけど、
何か不都合でもありましたか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QバッチファイルからVBA実行でエラー

バッチファイルからエクセルのマクロを動かそうとしているのですが、
処理はきちんと動いて処理を行なうのに、エラーウィンドウが出力され
”未知実行時エラーです”(画像添付)となり困っています。
どうすれば、このエラーを無くせますでしょうか?

因みにバッチファイルは以下の通りです。

Dim obj

Set obj = WScript.CreateObject("Excel.Application")

obj.Visible = True

obj.Workbooks.Open "C:\Documents and Settings\ne05576\My Documents\Datamove.xls"

obj.Application.Run "FileMove"

よろしくお願いします。

Aベストアンサー

おそらく「FileMove」のマクロの記述に誤りがあるのだと思います。

FileMoveの記述を単純に以下にしてテストしたところ、こちらの環境では何の問題もなく動作しました。

Sub FileMove()
MsgBox "OK"
End Sub

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QvbsからのExcelマクロ呼び出しの際に保存ダイアログが表示されてしまう

vbsからExcelのマクロを呼び出しExcelを閉じる処理を以下のように実施しています。
その際に保存ダイアログが表示されてしまうため非表示としようとコメントアウトされている
ように変更しました。
そしたらダイアログは表示されなくなりましたがstrTextの値が返却されなくなってしまいました。
原因がよくわからないのですがわかりましたらご教授ください。

Set oApp = CreateObject("Excel.Application")
oApp.Workbooks.Open WScript.Arguments(0)

strText = oApp.Run("CheckText")

oApp.DisplayAlerts = False
'oApp.Workbooks.Close saveChanges:=False
oApp.Workbooks.Close

Set oApp = Nothing
WScript.echo(strText)

Aベストアンサー

こんばんは。

単体でファイルを開けたら、単体でファイルを閉じればいいのでは?
その時に、ファイル変更のSaved =False は、初めて通用するはずです。
後は、CheckText の内容ですが、CheckTextの戻り値が、
strText に入っているかの確認はしていません。

できれば、On Error Resume Next を入れておいたほうが無難だと
は思いますが……。

一例:
'-------------------------------------
Set oApp = CreateObject("Excel.Application")
Set xlWb =oApp.Workbooks.Open(WScript.Arguments(0))
strText = oApp.Run("CheckText")
xlWb.Close False
Set oApp = Nothing
WScript.echo(strText)
'-------------------------------------

こんばんは。

単体でファイルを開けたら、単体でファイルを閉じればいいのでは?
その時に、ファイル変更のSaved =False は、初めて通用するはずです。
後は、CheckText の内容ですが、CheckTextの戻り値が、
strText に入っているかの確認はしていません。

できれば、On Error Resume Next を入れておいたほうが無難だと
は思いますが……。

一例:
'-------------------------------------
Set oApp = CreateObject("Excel.Application")
Set xlWb =oApp.Workbooks.Open(WScript.Arguments(0))
s...続きを読む

QVBScriptからEXCELのVBAコマンドを実行するには?

VBScriptからEXCELのVBAコマンドを実行するにはどうしたら良いでしょう?

例)
Set P_OBJEXCEL = CreateObject("Excel.Application")
※ここで EXCEL VBA の Chdir "N:\"を行いたい
W_INFILE = P_OBJEXCEL.Application.GetOpenFilename("EXCEL(*csv),*.csv",,"入力ファイル")
P_OBJEXCEL.Application.Quit

環境→EXCEL2000+Windows2000+IE6
目的→入力ファイルを取得ため、N:\配下をGetOpenFileNameにて開きたい
※EXCELのデフォルトパスを変更したくないため

何かヒントを御願いします

Aベストアンサー

> 目的→入力ファイルを取得ため、N:\配下をGetOpenFileNameにて開きたい

ファイル名の取得だけなら、こういうのじゃダメですか?
Excel で開くなら、この後で Workbooks.Open で開けば良いですし。。

なお、字下げは全角SPでしてますので、実際にテストするときは、
タブに置換して下さい。

With CreateObject("MSComDlg.CommonDialog")
  '.CancelError = True
  .MaxFileSize = 256
  .InitDir = "N:\"
  .DialogTitle = "ファイルを開く"
  .Filter = "TEXT (*.csv)|*.csv|すべてのファイル (*.*)|*.*"
  .ShowOpen
  MsgBox .FileName
End With

あと、

> ※EXCELのデフォルトパスを変更したくないため

この意味が良くわからないです。

QVBAでブックを非表示で開いて処理して閉じる方法

エクセルVBAで質問なのですが、別のブックを非表示で開いて処理をし、処理が終わったらそのブックを閉じるマクロを作りたいです。

ネットで方法をたくさん調べたのですが、うまくいきません。
ActiveWindow.Visible = Falseを使うと非表示でブックを開くのですが、次の処理をしようとすると非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。

どなたか良い方法をご存じないでしょうか?


↓今作ろうとしているマクロを参考に書いておきます。

ブックA内に書かれているブックBを非表示で開く

処理(ブックBのシート内の表に記入漏れの空白セルがあればブックAに空白セルの番地を表示させる)

ブックBを非表示のまま閉じる


非表示にせずにブックBを開けばうまく処理が完了するのですが、ActiveWindow.Visible = Falseを入れて非表示でブックBを開くと処理が開始しないという状況です。

Aベストアンサー

こんにちは

>非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。
手作業でも非表示のブックでシートやセルを選択しようとしても無理ですよね?

VBAの記述の方法をSelectやActivateなどを用いないように書き直せば、ご希望のことは実現可能だと思います。

例として、以下では"TestBook"というブックを開き、そのシート1内でA1:C20の範囲の空白セルを探して、メッセージボックスにカンマ区切りで結果を表示します。
(殆ど時間がかかりませんので、非表示にしなくても同じだとは思いますが…)

Sub sample()
 Dim wb As Workbook, c As Range
 Dim str As String

 str = ""
 Set wb = Workbooks.Open(ThisWorkbook.Path & "\TestBook.xlsm")
 Windows(wb.Name).Visible = False

 For Each c In wb.Worksheets(1).Range("A1:C20")
  If c = Empty Then
   If str <> "" Then str = str & " , "
   str = str & c.Address
  End If
 Next c
 wb.Close SaveChanges:=False

 MsgBox str
End Sub

※ わざわざ『非表示』に設定しなくても、現在のウィンドウをアクティブにすることで、新しく開いたウィンドウを(裏側に)隠すこともできますね。

こんにちは

>非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。
手作業でも非表示のブックでシートやセルを選択しようとしても無理ですよね?

VBAの記述の方法をSelectやActivateなどを用いないように書き直せば、ご希望のことは実現可能だと思います。

例として、以下では"TestBook"というブックを開き、そのシート1内でA1:C20の範囲の空白セルを探して、メッセージボックスにカンマ区切りで結果を表示します。
(殆ど時間がかかりませんので、非表示にしなくても同じだとは思いま...続きを読む

QEXCELマクロで上書きメッセージ無しで保存する方法

EXCELマクロで上書きメッセージ無しで保存する方法をお願いします
ActiveWorkbook.SaveAs "C:\Documents andSettings\Nakatani\MyDocuments\Book1.xls"
の様にするとすでにファイルがある場合上書きメッセージが出ます
メッセージを出さずに上書きするプログラミングを教えて下さい
宜しくお願いします

Aベストアンサー

Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "C:\Documents andSettings\Nakatani\MyDocuments\Book1.xls"
Application.DisplayAlerts = True

QEXCEL VBAで2つEXCELを起動したときのブック名取得の方法

for each *** In workbooks・・・Nextで現在開いているexcelのブック名をすべて取得することができますが、2つめのexcelを起動し、そこで開いたブック名は取得することができません。
プロシージャは個人用マクロブックに記載しているのですが、複数起動したexcelのすべてのブック名を取得する方法をどなたかご存知の方いませんでしょうか?
excel2007を使用しています。よろしくお願いします。

Aベストアンサー

> 別プロセスのExcelは外注したアプリがデータを表示する際に
> 起動する...

(その外注アプリが)表示するデータとは、

 1)Excel ファイルを作成され、特定の場所に保存されている。
   表示は、そのファイルを開いているにすぎない。ファイルを
   改めて保存する必要はない
 2)Excel 画面で表示されるが、ファイルには書き出されていない。
   手動で保存しなければならない

のどちらですか?

1)の場合でファイル名が自明ならば、

  Dim xlApp As Application
  Set xlApp = GetObject(ファイルフルパス).Application

で別プロセスの Excel で開かれていても Application オブジェクト
は参照できますよ。

2)の場合は、厄介です。

QExcel VBAで、ユーザーフォームの値を、モジュールで使用したい。

VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。
ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。

Sub TEST ()
Dim N
Userform1.Show
MsgBox N
End Sub

Private Sub CommandButton1_Click()
Dim N
N = TextBox1.Text
UserForm1.Hide
End Sub

Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

Aベストアンサー

'モジュールに変数宣言(グローバル変数)
'Public 宣言すると他のモジュールやフォームと
'共有できる変数になります。
Public AA As String

'sample
'A1 を実行する。

Sub A1()
Call A2
AA = InputBox("input", , AA)
End Sub

Sub A2()
AA = InputBox("input", , AA)
End Sub

QVBとVBAの違い

お世話になります。

現在、ExcelVBAで機械設計の計算をさせようと思い勉強しているのですが、VBとVBAの違い(VBと比較したとき、VBAできること、できない事)の境目?がいまいち判りません。
まだまだ勉強中で困惑しております。このままExcelVBAを勉強していく物か、VBについて勉強していくか迷っています。このままExcelVBAを勉強してExcelVBAを理解すれば判断できるかと思うのですが、畑違いの勉強になってしまわないかと心配です。

やりたいことは、各種計算の簡略化です。
現在は、関数電卓で行っていますが、これをパラメータを入力すると計算結果が出る。このような物を作りたいと思っています。

長くなってしまったのでまとめると、
1、VBAとVBの違い
2、ExcelVBAで設計計算が可能か
あと、
プログラムにより計算させるときに、最適なプログラム(JavaとかPHPとかHTML等など・・・)お勧めのプログラムがありましたらアドバイス頂けたらと思います。

Aベストアンサー

1. VBAとVBの違い

VBは単体で動作するアプリケーションが作れますが、VBAはOfficeが必要です。
また、VBAはOfficeの環境が使えるので、Excel等を使った入出力の機能が既にできていますが、VBではある程度自分で作る必要があります。また、費用的な面でVBは購入しないと使えませんが、VBAはOfficeがあれば使えますので、既にExcelなどを導入されているならば、追加の費用が必要ありません。
もし、複数の人間で作ったプログラムを利用され、かつその中にOfficeを持っていない人が含まれるのであればVBAではできませんので、VBが必要です。

2. ExcelVBAで設計計算が可能か

可能です。また、多分VBAを使わなくてもExcelの関数でもある程度のことが可能だと思われます。お持ちの関数電卓の桁数にもよりますが、相当な高精度が必要でない限り大丈夫です。

文面からすると、プログラミング未経験のようですが、やりたいことが明確なので、Excelをお持ちであればVBAで始めてみてはいかがでしょうか。他の言語(Java, C, PHP...)でも可能でしょうが、中には環境を用意しなくてはならなかったり、本質である計算以外に気にしなくてはならないことが多く、初心者にはとっつきづらいのではないかと考えます。

VBAからVBへの移行、VBからVBAへの移行はどちらも可能ですし、VBAからVBへの移行は多少時間がかかるかもしれませんが、VBよりVBAから始める方が楽なので、どちらに優越があるとは一概に言えないと思います。一人でちょっと使う程度や勉強用なら、ExcelVBAをお勧めします。
しばらくすると、ExcelVBAの限界を感じるようになると思うので、そこからVBに移行するというのでも悪くないと思います。

1. VBAとVBの違い

VBは単体で動作するアプリケーションが作れますが、VBAはOfficeが必要です。
また、VBAはOfficeの環境が使えるので、Excel等を使った入出力の機能が既にできていますが、VBではある程度自分で作る必要があります。また、費用的な面でVBは購入しないと使えませんが、VBAはOfficeがあれば使えますので、既にExcelなどを導入されているならば、追加の費用が必要ありません。
もし、複数の人間で作ったプログラムを利用され、かつその中にOfficeを持っていない人が含まれるのであればVBAではで...続きを読む

QVBSCRIPTで返されるErr.Numberの意味について

VBscriptで実行時にErr.Numberオブジェクトに返される番号の意味について教えてください。
または参考となるサイト云々の情報でも結構です。
よろしくお願いします。

Aベストアンサー

Windows Script ドキュメント
(http://www.microsoft.com/japan/msdn/scripting/default.asp
からダウンロードできます。)

目次
+VBScript
+リファレンス
+エラー
にエラー番号と内容の対応表があります。
また、Err.Description
でErr.Numberに対応する説明が取り出せるので、これを利用して、一覧表を作ることもできます。

ErrList.vbs
----------------------------------------------------------
On Error Resume Next
dim i
for i=1 to 5021
Err.Raise i
if Err.Description <> "未知の実行時エラーです。" then
WScript.Echo "" & i & ":" & Err.Description
end if
Err.Clear
next
-----------------------------------------------------------
コマンドプロンプトで
Cscript //nologo ErrList.vbs >err.txt
のようにして一覧表を作れます。

1000番台のエラーは構文エラーです。
それ以外は実行時エラー。

Windows Script ドキュメント
(http://www.microsoft.com/japan/msdn/scripting/default.asp
からダウンロードできます。)

目次
+VBScript
+リファレンス
+エラー
にエラー番号と内容の対応表があります。
また、Err.Description
でErr.Numberに対応する説明が取り出せるので、これを利用して、一覧表を作ることもできます。

ErrList.vbs
----------------------------------------------------------
On Error Resume Next
dim i
for i=1 to 5021
Err.Raise i
if Err.Description <> ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング