- 締切済み
VBScript実行時エラーについて
filemakerでデータをコピーし下記のようなVBScriptを使いエクセルファイル(グラフを下準備してある)を開きそのデータを貼り付けグラフを完成させ、そのグラフをgifファイルにエクスポートで保存し、次にfilemaker側でそのgifファイルを読み込む作業するスクリプトを組んでいます。ここで,PCを起動したときとか、作業中でも度々VBScript実行時エラー(パスまたはファイル名が無効です)が発生します。エクスポート先のgifファイル名を替えると1時的に問題は解決しますが・・・あくまで一時的なものなのでなんとか根本的解決策をご教示願います。 Set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open("C:\Users\hhh gggg\Documents\FM_Trial\グラフ6.xlsx") objExcel.Visible = True objExcel.Sheets("sheet1").Select Createobject("WScript.Shell").AppActivate("グラフ6.xlsx") ' --A1のセルに値を設定 objExcel.Sheets("sheet1").Range("A1").Select objExcel.Sheets("sheet1").Paste objExcel.Sheets("sheet1").ChartObjects("グラフ 1").Chart. Export ("C:\Users\hhh gggg\Documents\FM_Trial\test61.gif") ' --0.5秒待つ WScript.Sleep(1500) ' --Excel終了 objWorkbook.Close False objExcel.Quit ' --Excelオブジェクトクリア Set objExcel = Nothing
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Prome_Lin
- ベストアンサー率42% (201/470)
私の環境で作成した、そのまま(動作確認済み)掲載しておきます。 私の試したのは「D:\Programming」フォルダ内の「Graph.xlsx」ファイルを開いて、そのファイル内のグラフを同じフォルダ内に「Graph.gif」として保存しています。 質問者のプログラムでの最大の問題は、「Createobject("WScript.Shell").AppActivate("グラフ6.xlsx")」などを使って、その機能で処理しようとしていることです。 これでは、タイミングが合わないときがあります。 すべて、「Excel」の機能内で処理すれば、タイミングの問題は出ません。 したがって、ブックを開いて、そのブックの「Sheet1」を処理するのです(質問者のプログラムでは、シートを表示して、その表示したものをアクティブにして処理しています)。 すなわち、「objWorkbook.Sheets("Sheet1").ChartObjects("グラフ 1").Chart.Export ("D:\Programming\Graph.gif")」とするのです。 「objExcel.Sheets("sheet1")」と、「objExcel」ではなく「objWorkbook」なのです。 そうすれば、「Select」や「Paste」の必要は全くなくなります。 一度試してみてください。 ちなみに、「Documents」フォルダは、 Set wa = CreateObject("WScript.Shell") dc = wa.SpecialFolders("MyDocuments") によって、取得できます。 Set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open("D:\Programming\Graph.xlsx") objExcel.Application.DisplayAlerts = False objExcel.Visible = False objWorkbook.Sheets("Sheet1").ChartObjects("グラフ 1").Chart.Export ("D:\Programming\Graph.gif") objWorkbook.Close objExcel.Quit Set objWorkbook = Nothing Set objExcel = Nothing MsgBox("Finished!")
お礼
>「Select」や「Paste」の必要は全くなくなります。 この部分がよく分かりませんが >「objExcel.Sheets("sheet1")」と、「objExcel」ではなく「objWorkbook」なのです。 とりあえず、セル値の設定以下の「objExcel」を「objWorkbook」にしてみました。 Set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open("C:\Users\hhh gggg\Documents\FM_Trial\グラフ6.xlsx") objExcel.Visible = True objExcel.Sheets("sheet2").Select Createobject("WScript.Shell").AppActivate("グラフ6.xlsx") ' --A1のセルに値を設定 objWorkbook.Sheets("sheet2").Range("A1").Select objWorkbook.Sheets("sheet2").Paste objWorkbook.Sheets("sheet2").ChartObjects("グラフ 4").Chart. Export ("C:\Users\hhh gggg\Documents\FM_Trial\test61.gif") ' --0.5秒待つ WScript.Sleep(1500) ' --Excel終了 objWorkbook.Close False objExcel.Quit ' --Excelオブジェクトクリア Set objExcel = Nothing 問題なく動きエラーは出ません。 コードの仕組みを理解しないでて過去に作っていた動けば良しとしたVBSとVBAで作るとたまに動くから困る。反省!! 暇人なので勉強します。有難うございました。
補足
回答有難うございます。しかし私のしたいのは、 gggg\Documents\FM_Trial\グラフ6.xlsx") objExcel.Visible = True objExcel.Sheets("sheet1").Select Createobject("WScript.Shell").AppActivate("グラフ6.xlsx") ' --A1のセルに値を設定 objExcel.Sheets("sheet1").Range("A1").Select objExcel.Sheets("sheet1").Paste とすることによって指定したグラフ6.xlsxのsheet1を開きA1にグラフの基になるデータを貼り付ける作業が不可欠なのです。 詳しい事は知識不足のため分からないのですが >すべて、「Excel」の機能内で処理すれば、タイミングの問題は出ません。 については、最初はfilemaker側から直接Excelを開く(VBAでopenと同時にデータを貼り付けグラフをアクティブにしそれをgifファイルにエクスポートするようのしてある)、つぎにfilemakerからExcelの強制終了命令。。。様な形でしたがこれでは1つのグラフ毎エクセルファイルが必要になるのでsheetを指定しそのsheetに設定してあるグラフをgifファイルとして保存したいと(グラフのcpoyではfilemakerで手動では貼り付けられるのですがスクリプト肉も込めないのでgifファイルとして保存しそれを読み込むようにしている。)vbsで出来ないか試行しているところです。