• ベストアンサー

VBからエクセル(ブック)のプロシージャーをCallできますか?

VB初心者です。 いろんな処理をブックのマクロで行なっています。 今までは手作業でマクロを実行させてきたのですが 自動化したいと考えています。 処理させたいブックは複数あって それぞれを処理するためのコントロール的な役割を フォームをもたない実行ファイル(VB)で行ないたいと 思っているのです。 実行ファイルはタイマなどで自動起動を考えています。 そこで、 VBからブックのプロシージャーをCALLする方法がありましたら 具体的なコードを教えてください。 また、もっと簡単な方法がありましたら、 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

以前にエクセルとVBの連携のサンプルを乗せてます http://oshiete1.goo.ne.jp/kotaeru.php3?q=165565 の#2の内容を見てください。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=165565

その他の回答 (5)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

今日は仕事休んじゃいました。。。(^^;) エクセルを閉じた後か、ブックを閉じた後にマクロを呼んではいないですか? ちょっと郵便局に行って来るので、レスが遅れます。 m(__)m

hanikos2001
質問者

お礼

ありがとうございます。 ご指摘のとおりでした。 またよろしくお願いします。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

エクセル起動 Set xlApp = New Excel.Application 'アドイン情報の更新 xlApp.AddIns("分析ツール").Installed = False xlApp.AddIns("分析ツール").Installed = True 'DSFP_EP 作成 ワークブックを開く xlApp.Workbooks.Open ("F:\foruser\Duration Data 作成.xls") として、アドイン情報をリフレッシュする必要があるようです。 うまくいかなかったら報告してください。

hanikos2001
質問者

お礼

ありがとうございました。 解決できました。 しかしそのエキスパートさには脱帽です。解答数からみて 仕事の合間に回答しているとは思えないのですが。 ついでで申し訳ないのですが、いろいろやってみましたが 自分では解決できそうにありません。 以下の不具合があります。 呼び出すマクロによっては終了時にエラーとなります。 エラーの内容は 「実行時エラー 440 Run メソッドは失敗しました:'_Application'オブジェクト 」 ただし、結果的にはうまく処理(最終的なファイルが出力されて終了) できています。手動で行なった場合もうまく終了しています。 こころあたりありましたら、よろしくお願いします。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

なるほど、状況がわかりました。 全てはWORKDAY関数のせいです。 これはエクセルのアドインの分析ツールの関数です。 これはエクセルの追加機能なので、WORKDAY関数は反映しないようです。 回避方法は・・・すぐには調査不可能なので、また明日までに調べておきますね。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

>=TEXT(WORKDAY(TODAY(),0,Date!A2:A40),"yymmdd")&"_Duration.csv" >と設定されていて > >通常は"011113_Duration.csv"となります。 とありますが =TEXT(WORKDAY(TODAY(),0,Date!A2:A40),"yymmdd")&" の部分で[011113]を取得するのですか? WORKDAY関数って?オリジナル関数ですか? 画面の表示上では[011113]と出てるのに、VBAマクロ:Report内で、そこのセルの値を取得してる部分に"#NAME?"が入るという意味ですか? VBAマクロ:Reportの内容を見てみないと、なんとも言えません。。。

hanikos2001
質問者

補足

即日の解答ありがとうございます。これより別件で席を離れますが 以下補足いたします。 WorkDayはエクセルにあらかじめ組み込まれている関数のようです。以下はヘルプでみました。 書式 WORKDAY(開始日, 日数, 祭日) 開始日から起算して、指定された稼動日数だけ前または後の日付に対応する値を返します。 >とありますが >=TEXT(WORKDAY(TODAY(),0,Date!A2:A40),"yymmdd")&" >の部分で[011113]を取得するのですか? はいそうです。 我々が使用している意味は祭日休日でない営業日を算出しています。 通常(VB起動でない)エクセルを開くと ”011113_Duration.csv"と入っていますが、 VBから起動すると、エクセルが表示され項目を見てみると "#NAME?" となっています。 以下がReportのコードです(手動では動いています。) A1の項目に例の内容(011113_Duration.csv)が入っています。 その内容(XXX)をOpenしてるところでエラーになり、エラーは "実行時エラー 13 型が一致しません”です。 Sub Report() Sheets("Macro").Select Range("A1:A1").Select XXX = ActiveCell.Value Range("A10:A10").Select YYY = ActiveCell.Value Range("A2:A2").Select ZZZ = ActiveCell.Value ChDir "\\Tokyo\IFProto\foruser\調査\org" Workbooks.Open FileName:= _ "\\Tokyo\IFProto\foruser\調査\org\" & XXX Sheets("Yield").Select 以下コードはつづく

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

>VB初心者です。 とありますが、参考URLのサンプルは難しかったですか? わからない所があったら、聞いてください。 解決したのであれば、コメントもポイント発行しなくてもいいので、締め切ってくださいね。

hanikos2001
質問者

お礼

先日も重ね重ね解答ありがとうございます。 いろいろ試行錯誤しているのですが、新たな問題があって困っています。 以下の問題解決方法知ってましたらよろしくお願いします。 呼び出され側のエクセルのマクロ内でエラーとなります。 原因はシート内の項目を参照しているのですが、内容が "#NAME?"となっています。 実際は =TEXT(WORKDAY(TODAY(),0,Date!A2:A40),"yymmdd")&"_Duration.csv" と設定されていて 通常は"011113_Duration.csv"となります。 DateシートのA2からA10までは日付が入っています。 うまく関数が実行されていないのですかね? VBのコードは以下のように作成しました Sub main() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook 'エクセル起動 Set xlApp = New Excel.Application 'DSFP_EP 作成 ワークブックを開く xlApp.Workbooks.Open ("F:\foruser\Duration Data 作成.xls") Set xlBook = xlApp.ActiveWorkbook xlApp.Visible = True 'マクロをCallする Call xlApp.Run("Report") '閉じる時の「保存しますか」を表示させない xlBook.Saved = True Set xlBook = Nothing Set xlApp = Nothing End Sub

関連するQ&A

  • エクセルVBA イベントプロシージャを一時停止する方法を知りたい

    エクセルマクロのイベントプロシージャに関する質問です。 ・ブックオープン時に実行するマクロ ・ブックがアクティブになる際に実行するマクロ ・ブックが非アクティブになる際に実行するマクロ この3つがイベントプロシージャとして登録されているブックがあります。 ブックオープン時に実行するマクロが終了するまで、 残りの2個のイベントプロシージャマクロをストップさせておくような方法はないのでしょうか。 理由は、ブックオープンのマクロの中に ブック切り替えのプロセスがあって、そのブックオープンのマクロ実行中に 他の2個のマクロが走ってしまうと都合が悪いのです。

  • Excelのブックを閉じる

    お世話になります。 Excel処理について質問です。 今、サーバで常にマクロが動き続けているExcelファイル(ファイルAとします)があります。 今回はそのファイルを閉じ、マクロにてシートの更新をしたのち、また開きなおしてマクロを実行させたいです。 方法としては、 1.C#から閉じて更新して開く処理を行う。 2.別のブックにファイルAを閉じる処理を行うマクロを仕込んでおき、 C#からはそのファイルを開くだけ。 が考えられると思っています。 どちらの方法でも良いので、コードの例を書いていただけないでしょうか。 ちなみに、自分の現状のコードは以下です。 (アラート非表示) for each wb in Workbooks if wb.Name <> ThisWorkbook.Name then wb.Close SaveChanges:=false end if next Application ThisWorkbook.Close SaveChanges:=false これでは、異なるブックのExcelファイルであっても、ウィンドウが分かれ てしまっていては、削除の対象になりません。 どなたか、宜しくお願いします。

  • エクセル付きVBでファイルオープンすると止まる

    エクセル付きのVBでショートカットキーでマクロを起動し、他のエクセルのファイル(ブック)をオープンするとプログラムが止まり、以降のマクロを処理できません。VBの画面で実行ボタンをクリックするとマクロ通りに正しく処理されるので、マクロ自体に問題はないと思います。 どなたか同様の経験をされた方、もしくは解決方法をご存知の方、解決方法を教えてください。 マクロは「Workbooks.open("パス\ファイル名")」または「workbooks.open FileName:="パス\ファイル名"」としており、どちらも止まります。

  • ExcelマクロでVBエディタの自動化は出来ない?

    Excelのマクロで、VBエディタの操作を自動化したいと考えていますが、出来ないのでしょうか? マクロの記録では VBエディタの操作は一切記録されないようです。 バージョンは Excel2003 です。 具体的には、全てのマクロのコードをテキストファイルに吐き出したいと考えています。 ファイルメニューのエクスポートでも、コードウィンドウ1つ1つを "全てを選択" でも、Excelのマクロから実行させることは出来ないのでしょうか? よろしくお願いします。

  • VB6からEXCELマクロの終了を判断する方法を教えてください。

    VB6からEXCELマクロの終了を判断する方法を教えてください。 VB6とEXCEL(VBAも含む)を使って次のような流れの処理を行うソフトを作っています。 そこでどうしてもEXCELマクロの終了をVB6から判断する必要があり、方法を教えて頂けないでしょうか。 1)VB6でEXCELファイルを起動 2)VB6からセルA1に10,A2に20を代入 3)VB6からEXCELファイル内のマクロをコール 4)マクロはA1+A2の計算を行いA3に代入(30) 5)VB6からA3の値を読み込む (実際にはマクロは複雑な処理をします。) 1)~5)の処理を5000回程度行います。 VB6から送られるデータは毎回変わり、EXCELとマクロで計算させたデータを回収してテキストファイルに書き出します。 一通りのプログラムは完成したのですが、計算したデータを見ると10+20が1.99999とか15.51414とかおかしい結果になっています。 もしかしたらマクロの実行が終わっていない段階でVB6がデータを拾ってしまっている??と考え、マクロの終了をVB6で判断してからデータを回収するようにしたいと思っています。 何か方法はないでしょうか。(または他に間違っているところがあるのでしょうか。) 長文ですみません。よろしくご教示ねがいます。

  • VB.NET開発(イベントプロシージャはマルチスレッドですか?)

    VB.NET開発(イベントプロシージャはマルチスレッドですか?) 以前より.NETのWindowsフォームの業務アプリ開発してますが、基本的な質問をさせて下さい。 イベントプロシージャの実行処理は、本体スレッド(実行時のスレッド)とは別のスレッドで動作しているのでしょうか。 例えば、ボタンのクリックイベントに何かしらの重い処理があったとします。このクリックイベントの処理ではボタンの制御をしていないので、イベントプロシージャの実行中は、処理中のボタンが押下可能な前提とします。この時、このボタンを3回押下して実行させると3つのスレッドが新規に作成されて実行していると考えて宜しいのでしょうか。 デリゲートやイベントに関するキーワードで検索して、いくつか資料を見たのですが、上記の疑問にぴったり合う解答がなく、質問させて頂きました。 業務アプリの開発で、今まで、あまりマルチスレッドなど意識せずやってきましたが、実は意識しなくても、マルチスレッドの開発をしていたことになるのでしょうか。 以前、VB6の開発もしておりました。 ちなみにVB6の場合も、イベントプロシージャはマルチスレッドで実行されていると考えて宜しいのでしょうか。 よろしくお願いします

  • アクセスからエクセルのプロシージャーを実行させたい

    オフィス2007です。 ////////////////////////////////////////////////////////// ‘Excel側の標準モジュール ////////////////////////////////////////////////////////// Sub Excelのプロシージャー() MsgBox "Excelです" End Sub ////////////////////////////////////////////////////////// ‘Access側の標準モジュール ////////////////////////////////////////////////////////// Sub Accessのプロシージャー() Dim xlsWB As Object Dim MyFileName As String MyFileName = "D:\Accessからプロシージャーの実行テスト用ファイル.xlsm" Set xlsWB = GetObject(MyFileName) xlsWB.Application.Run xlsWB.Name & "!Excelのプロシージャー" Set xlsWB = Nothing End Sub の状態で、アクセス側から Accessのプロシージャー実行すると、 ////////////////////////////////////////////////////////// マクロ'Accessからプロシージャーの実行テスト用ファイル.xlsm!Excelのプロシージャー' を実行できません。 このブックでマクロが使用できないか、 またはすべてのマクロが無効になっている可能性があります。 ////////////////////////////////////////////////////////// となります。 エクセル側は、「すべてのマクロを有効にする」にしているし、エクセルファイルを単独で開き、 Excelのプロシージャーを実行すると問題なく動きます。 同じ条件で、2003で検証すると問題なく動きます。(拡張子は適宜変えてます) エクセルのパスが間違ってるのかな?と思い、適当なパスに変えたところ、 「オートメーション操作中にファイル名またはクラス名を見つけられませんでした。(Error 432)」 というエラーがでたので、パスは合ってます。 原因がわかる方、ご回答よろしくお願いします。

  • VBとVBAのコードの違い プロシージャー呼び出し方法

    何度かお世話になっておりおります 毎回アドバイスありがとうございます 早速なのですがまた躓いてしまいアドバイスお願いします。 ~質問内容~ 標準モジュールからフォームのプロシージャーを呼び出す エラー内容 オブジェクトが必要である       オブジェクト修飾が必要など 出てきました オブジェクト修飾 というのが もう理解出来ず 本当にスタートの時点ではありますが アドバイスお願いします VBのコード 標準モジュール Sub Main() MainForm.Initialize End Sub フォームのコード Public Sub initialize()  ”コード内容”  End Sub ↑上記で記入しました フォームで宣言されているInitialize を呼び出したいのですが VBでは このままで出来るはずなのですが VBAでは オブジェクト修飾が必要です CALL をつけても エラーのままでした 少し質問がわかりにくくなってしまいましたが 標準モジュールから フォームのプロシージャーを呼び出すには なんと入れれば宜しいでしょうか? アドバイスお願いします

  • マクロのプロシージャーが大きすぎる・・

    自動マクロで作成した二つのマクロをコピーして結合させました・・そして実行しようとするとプロシージャーが大きすぎるために実行できません、のエラーが出ました。マクロの余分なところを削除して軽くするしか方法がないでしょうか?他に方法があればご教授ください。よろしくお願いします。

  • VB.NETからエクセルを起動して、エクセルでVBを閉じたい。

    こんにちは。 先日、エクセルのフォームを最前面に配置したいという 質問をさせて頂いたものでございます。 それで、SetWindowPosのAPIで設定する方法を教えて頂いたのですが、 最前面にする事は出来たのですが、フォームを動かすと ブックはその一つ下に現れてしまい、 ブックを最背面に配置するなどを試みてみたのですが、 どうもうまく行かないので、 エクセルから直に立ち上げることが出来ないようにして VB.NETのフォームを作ってエクセルにデータを送ろうかと思いました。 それで、データを送る方法は何とかなりそうなのですが、 VB.NETのフォームからエクセルを起動して、 次にエクセルからそのフォームを出したり、隠したりしたいのですが、 その場合、VB.NETのフォームのなんと言うハンドルを取得すればよいでしょうか? IDにも色々あるようで、どれを使えばよいのか分からなくなってしまいました。 そのIDはVBのフォームを起動した時に、エクセルと共有するiniファイルなどに、書き込んでおこうかと思っています。 よろしくお願いいたします。m(__)m