一回のボタンのクリックで、3つのプロシージャーを同時に稼働させる方法は?

このQ&Aのポイント
  • ExcelファイルからサイトAのデータを取得し、処理が終了したらサイトBのデータを取得し、最後にサイトCのデータを取得する処理を行う際に、一つのボタンのクリックでこれらのプロシージャーを同時に実行する方法をご教示ください。
  • 現在は一つの処理が終わるまで次のプロシージャーに進むことができず、Excelファイルを手動で立ち上げる必要があります。しかし、一つのボタンのクリックで全てのプロシージャーを同時に実行できる方法があれば教えてください。
  • どのような方法でも構いませんが、一つのボタンのクリックでサイトA、サイトB、サイトCのデータを同時に取得できるようにしたいです。
回答を見る
  • ベストアンサー

一回のボタンのクリックで、3つのプロシージャーを同

一つのエクセルファイルから サイトAからデータを取得し、 全ての情報を取得し終わったら サイトBを開き、データを取得し、 データを取得し終わったら サイトCを取得して・・・と言う流れです。 一つのサイトのデータを取得したり加工したりで2分くらいかかります。 サブプロシージャーは Sub サイトAを取得() Sub サイトBを取得() Sub サイトCを取得() とありますが、 これを同時に行うにはどうすればいいでしょうか? 今は一つの処理(プロシージャー)が終わらないと次のプロシージャーに進みません。 (当たり前ですが) 一つのエクセルファイルを立ち上げ、 新しいアプリケーションで、読み取り専用で同じファイルを立ち上げ と言うのを手動でやるしかないでしょうか? 方法は何でもいいのですか 一回のボタンのクリックで、3つのプロシージャーを同時に稼働させたいです。

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

  • ベストアンサー
  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.8

> ExApp.OnTime Now(), "Proc1" その手がありましたか。ナイスな回答です。 試してはいませんが、これで1つのブックであまりややこしいことをせずにマルチプロセスできそう。 (って質問者でもないのに失礼いたしました)

agikhmtfdpvx
質問者

お礼

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

その他の回答 (7)

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.7

> ただ、動かすプロシージャを選択する方法がややこしそうです。 ExApp.OnTime Now(), "Proc1" みたいな感じで。

agikhmtfdpvx
質問者

お礼

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

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.6

なるほど、同時に動かしたいプロシージャを無理に個別のブックに分けなくてもどうにかなりそうですね。 ただ、動かすプロシージャを選択する方法がややこしそうです。 (ちなみにNo.3の回答ですが、実はExcel複数起動のことが書いてあるのかも?)

agikhmtfdpvx
質問者

お礼

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

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.5

> それぞれ異なるブックに分けます 一応、分ける必要もないです。^^; Dim ExApp As Application Set ExApp = New Application With ExApp .Visible = True .Workbooks.Open ThisWorkbook.FullName End With

agikhmtfdpvx
質問者

お礼

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

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.4

おそらくはNo.3様の回答のように、同時にアクセスする1つのプロシージャを作るのが最も的を射ているとは思います。 でも、あえて3つの異なるプロシージャを同時に動かすという観点で回答いたします。 Excel VBAを並行動作させるには、Excelを複数起動しなければならないと思います。 まず、Excelは複数起動可能になっているでしょうか。積極的に複数起動禁止設定を行っていなければ可能なはずです。 データを取得する3つのサブプロシージャはそれぞれ異なるブックに分けます(子ブックと呼びます)。 子ブックを開くとサブプロシージャが自動起動するようにしておくのが簡明だと思います。(イベントでプロシージャを起動してもいいのですが、イベントを発生させた側が一時停止してしまうケースがあるようなのでそのあたりの対策が面倒です) さらに、子ブックをExcel複数起動で開くプロシージャを作成し、別のブックに入れます。(これを親ブックと呼びます)。 子ブックの起動方法ですが、CreateObject("Excel.Application")でExcelを新たに起動、そのオブジェクトを用いて子ブックを開きます。子ブック1つにつきExcelを1つ起動する必要があるので、親ブックと合わせて4つのExcelを同時起動することになります。 収集したデータは子ブックのシートに書き込んで子ブックのマクロは終了します。すると子ブックを開いているExcelのApplicationオブジェクトのReadyがTrueになるので、そうなったら親ブックから子ブックにアクセスしてデータを読み込むことができると思います。 以上考え方のみで申し訳ありませんが、どうしても別プロシージャを並行に動作させたい場合はご検討ください。 なお、Excelを4つも起動するのは大掛かりな話なので、VBAのかわりにVBScriptを並行に動作させる方法も考えてみたのですが、データを1つのブックにまとめる速くて簡単な方法が思いつきません。(もしご希望があればもう少し考えてみたいと思います)

agikhmtfdpvx
質問者

お礼

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

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.3

> これを同時に行うにはどうすればいいでしょうか? VBAなのでマルチスレッドは無理として、XMLHTTP(Open で引数をTrue)やWinHTTPやIE(Navigateメソッド)は、非同期動作が可能なので 同時に複数のオブジェクトをインスタンス化してアクセスさせるとか。

agikhmtfdpvx
質問者

お礼

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

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

>Sub サイトAを取得() >Sub サイトBを取得() >Sub サイトCを取得() 一体全体どんなマクロを書いててエクセルに何をやらせている時のご相談なのか、具体的にアナタが何やってるのかさっぱりイミフメイです。 【不明のため仮定その1】 WEBクエリでネット(サイト)からデータをエクセルに落としている、というお話でしょうか。 【不明の仮定その2】 だとするとあなたの「サイトAを取得」マクロの具体的な内容は、わざわざゼロからシートにWEBクエリを埋め込むところから、やらせてる状況でしょうか。 1.今のマクロはすべて廃棄します。今まで使っていたシートも必ず破棄します。 2.必ずまっさらのシートを用意、手動操作で各シートにWEBクエリABCを埋め込みます 3.マクロABCで、それぞれ埋め込んでおいたWEBクエリを「リフレッシュ(更新)」させます 4.マクロを使い、マクロABCを順繰り実行させます 通常は以上で、マクロABCによる更新が並行して走ります。 #補足 「既に埋め込み済みのWEBクエリAやBやCをそれぞれリフレッシュするマクロ」は、新しいマクロの記録を使い、埋め込み済みWEBクエリを右クリックして「更新」する操作をマクロに録る事で入手できます。

agikhmtfdpvx
質問者

お礼

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

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.1

サブブックを3つ用意し コードの最初でその内の2つを開き 各々のオープンするイベントで その1つづつを分担させればいいのじゃないでしょうか? このメインのブックのその後の処理と会わせ、 これら3つのコードは各々それぞれ 並列で動作すると思い得ます。 半信半疑ですが。 そして 結果を残り最後1つのブックに 書き込ませればいいのじゃないでしょうか? 3回書き込みが起こることと思います。 書き込みによる 書き換えイベントで起こされたコードが 各々自らが立ち上がった痕跡を残し、 加えて他の痕跡を確認する。 確認した結果、揃っていたものが集計する。 勿論メインのこのブックの処理が一番遅くなることもある。 しかしどれが一番最後でも構わない 一番最後、 全書き込みの痕跡を確認できた処理が集計を行えばいい。 じゃないでしょうか? 半信半疑ですが。 もし可能ならば処理を分担するブックを各々別々のPcに置いておけば完璧ですね。 如何でしょうか? お役に立てていたならば幸いです。

agikhmtfdpvx
質問者

お礼

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

関連するQ&A

  • subプロシージャ

    2次方程式a*x^2+bx+c=0えお解くプログラムを考える。メインプロシージャmain1がsubプロシージャread1,solve1,display1を1回ずつ呼び出す。プロシージャread1で変数a,b,cにinputboxで整数値を入力する。プロシージャsolve1では、まず判別式D=b^2-4*a*cを計算して、D>0の場合にはx1、x2に実数解x1=(-b+sqr(D)/(2*a)、x2=(-b-sqr(d)/(2*a)を求める。D<0の場合はx1に実部-b/(2*a)を、x2に虚部sqr(-D)/(2*a)を求める。プロシージャdisplay1は入力された3つの整数値とsolve1で得られた2つの変数x1.x2の値を判別式Dの符号に応じてMsgbox関数で表示する。 以上のプログラムをモジュールレベル変数を用いてつくりなさい。 Sub read1() '問10(1) Dim a As Integer, b As Integer, c As Integer a = InputBox(" aの値を入力して") b = InputBox(" bの値を入力して") Sub solve1() D = b ^ 2 - 4 * a * c If D > 0 Then x1 = (-b + Sqr(D)) / (2 * a) x2 = (-b - Sqr(D)) / (2 * a) Else x1 = -b / (2 * a) x2 = Sqr(-D) / (2 * a) Sub display1() End Sub ここまでやったのですがこの先どうやるかわかりません。 おしえてください。 あとモジュールレベル変数ってなんですか?

  • Accessからoutlookのプロシージャー

    Accessからoutlookのプロシージャーを実行する方法は? AccessからExcelなら、エクセルに ************************ Sub エクセルマクロ() MsgBox "a" End Sub ************************ を作り、アクセス側で、 ************************ Private Sub AccessからExcel() Dim xlsWB As Object Set xlsWB = GetObject("D:\My Documents\up\エクセル.xls") xlsWB.Application.Run xlsWB.Name & "!エクセルマクロ" Set xlsWB = Nothing End Sub ************************ を実行すると、エクセル側のプロシージャーが実行されますが、 Accessからoutlookの場合は、どうすればいいでしょうか? Outlookの標準モジュールに、 ************************ Sub Outlookマクロ() MsgBox "a" End Sub を作っても、 アクセス側で、 Private Sub AccessからExcel() Dim xlsWB As Object Set xlsWB = GetObject("D:\My Documents\up\ ")‘ここをどうすればいいかわからない。 xlsWB.Application.Run xlsWB.Name & "! Outlookマクロ" Set xlsWB = Nothing End Sub ************************ と言うコードしか作れなくて、詰んでしまいます。 Accessからoutlookのプロシージャーを実行する方法をご教授ください。よろしくお願いします。

  • アクセスからエクセルのプロシージャーを実行する際の

    アクセスからエクセルのプロシージャーを実行する際のエラーです。 おはようございます。長文ですがお許しください。 http://www.geocities.jp/cbc_vbnet/tips/excll.html(03.プロシージャの作成) を参考にアクセスからエクセルのプロシージャーを実行させてるのですがエラーになります。 エクセルファイルのパス→C:\Users\User\Desktop\a.xlsm エクセルファイルに入っているプロシージャ→test() *********************エクセルの標準モジュール********************* Sub test() MsgBox "" End Sub *********************アクセスのイベント********************* Private Sub 更新_Click() Dim App As Excel.Application ’参照設定済み Dim MyFileName As String Dim res As Variant MyFileName = "C:\Users\User\Desktop\a.xlsm" Set App = Excel.Application res = App.Application.Run(MyFileName & "!" & "test") End Sub このアクセスのイベントを実行すると、 「実行時エラー1004 マクロ'C:\Users\User\Desktop\a.xlsm!test'を実行できません。 このブックでマクロが使用できないか、また全てのマクロが無効になっている可能性があります。」 となります。 エクセルのマクロの設定は、「全てのマクロを有効にする」にしてあります。 a.xlsmはダブルクリックすれば普通に開けるし、testも問題なく実行できます。 そして、このアクセスのイベントを実行した後は、エクセルファイルが開けなくなります。 一瞬開くんですが、すぐ閉じてしまいます。 タスクマネージャーのプロセスからエクセルのアプリケーションを強制終了させると 再度開けるようになりますが、画像のように変なドキュメントの回復が出ます。 とりあえず、エクセルが開けなくなることは置いといて、 アクセスからエクセルのプロシージャーを実行する方法を教えてください。 当方オフィス2007です。ご回答よろしくお願いします。

  • エクセルからアクセスのプロシージャーを実行させるには?

    エクセルの標準モジュールには→エクセル側のプロシージャー アクセスの標準モジュールには→アクセス側のプロシージャー と言う名前のプロシージャーが作成されています。 これをどちらもエクセル側で実行させることは出来ないでしょうか? 「アクセス側のプロシージャー」ではアクセス側の処理が実行されます。 でもできればエクセル側のコマンドボタンを一回押すだけで エクセルとアクセスの両方の処理を実行させたいです。 エクセルの標準モジュールには Sub エクセル側のプロシージャー() Call アクセス側のプロシージャー End Sub これを実行すると コンパイルエラーになります。 どうすれば一度で二つのアプリケーションのプロシージャーを実行させることが可能でしょうか? よろしくお願い致します。

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

    オフィス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)」 というエラーがでたので、パスは合ってます。 原因がわかる方、ご回答よろしくお願いします。

  • vbs subプロシージャーにするべきなの?し

    vbs subプロシージャーにするべきなの?しないべきなの? call a sub a() msgbox "b" end sub vbsでこのコードを実行すると問題なく動くのですが、 call a をsubとend subで囲わなくていいのでしょうか?

  • エクセルからアクセスのプロシージャーを実行する

    エクセルからアクセスのプロシージャーを実行する方法を教えてください。 アクセスファイル名→ファイル1.accdb プロシージャー名→test1 なのですが、 エクセルで Sub ACCESSのプロシージャーを実行する() Dim OBJ As Object Set OBJ = GetObject("C:\Users\Desktop\ファイル1.accdb") OBJ.Application.Run OBJ.Name & "!test1" Set OBJ = Nothing End Sub としたら、 実行時エラー 2517 ’Microsoft Access!test1’プロシージャーが見つかりません。 になります。 test1は、アクセスの標準モジュール内に記載しています。 モジュール名も指定しないとだめなのでしょうか? その場合のコードの書き方がわからないので教授ください。 該当のアクセスファイルは既に起動しているときもあるし、してない時もあります。

  • VBA Functionプロシージャで複数の値を

    エクセルでVBAのFunctionプロシージャについて複数の値を戻り値として 受け取る方法を考えています。 下記のようなサンプルプログラムを作りました。 --------------------------------------------------------------------------------- Option Explicit Private Sub CommandButton1_Click() Dim kekka(3) As Double Dim txt As String txt = "12.12A,34.34B,56.56C,78.78D" kekka(0) = test(txt) End Sub Public Function test(ByVal text As String) As Double Dim txt_kakou(3) As String '## 渡された「txt = "12.12A,34.34B,56.56C,78.78D"」を加工し、数値のみを取り出し '## 下記のように配列txt_kakou(3)に振り分ける '## 加工方法は割愛 txt_kakou(0) = 12.12 txt_kakou(1) = 34.34 txt_kakou(2) = 56.56 txt_kakou(3) = 78.78 'string型からdouble型に変換する。 txt_kakou(0) = CDbl(txt_kakou(0)) txt_kakou(1) = CDbl(txt_kakou(1)) txt_kakou(2) = CDbl(txt_kakou(2)) txt_kakou(3) = CDbl(txt_kakou(3)) test = txt_kakou() End Function ----------------------------------------------------------------------------------- まず、呼び出し側のプロシージャでkekka(3)という配列を宣言します。 次に変数txtに「"12.12A,34.34B,56.56C,78.78D"」の文字列を代入します。 そして変数txtをFunctionプロシージャに投げます。 Functionプロシージャでは、受け取った「"12.12A,34.34B,56.56C,78.78D"」 を数値のみに分解し、4つの変数に代入します。 この4つの変数も配列で用意し、txt_kakou(3)とします。 このtxt_kakou(3)を呼び出し元に返し、呼び出しもとの変数kekka(3)に入れたいのです。 また、はじめ変数txtに代入される値は文字列ですが、この文字列をFunctionプロシージャで分解し、 分解した値は、最終的には数値として扱いたいので、途中でdouble型に変換しています。 これを実行すると、Functionプロシージャの最後のtest = txt_kakou()で、型が一致しません といわれてしまいます。 どのように書き直せばいいのでしょうか。 よろしくお願いします。

  • VBA で2つのプロシージャを一つにまとめたい

    いつもここにはお世話になっており、ありがとうございます。 さて、タイトルにもありました通り、下記2つのプロシージャでコマンドボタンを設定して、実行しておりますが、これを一つのプロシージャ(ボタン)にまとめたく、ご指導お願いいたします。 ○作ろうとしているVBAの概要 1)EXCELのデータベースで、一枚目の「inputシート」に入力し、2枚目の「dataシート」でデータをどんどん格納していきます。 2)データは、「顧客CDボタン」で管理しており、これをキーとしています。 3)「顧客CD」は[inputシート」ではC4セル、「dataシート」ではA列にで管理しています。 3)データは新規にデータを入力したときの登録ボタン(一つ目のプロシージャ)、既存のデータを編集して、上書きするときの、変更登録ボタン(二つ目のプロシージャ)があります。 ○相談したい内容 「登録ボタン」と「変更」ボタンを一つにまとめて、ひとつのボタンとして、新規にデータを登録するときも、変更したデータを登録するときも、同じボタンで行えるようにしたい。 '■1つ目のプロシージャー Private Sub CommandButton1_Click() '登録ボタン Dim row As Integer row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 2).Value = Range("C5").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 3).Value = Range("C6").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 4).Value = Range("C7").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 5).Value = Range("F5").Value ActiveWorkbook.Save End Sub '■2つ目のプロシージャー Private Sub CommandButton3_Click() '変更ボタン Dim fRange As Range Dim fRow As Long If (Range("C4").Value = "") Then '顧客CDが入力されていない? MsgBox "顧客コードを入力してください。", vbExclamation Exit Sub End If Set fRange = Sheets("data").Columns(1).Find(What:=Range("C4").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If fRow = fRange.row '検索された顧客DCの行位置を求める Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 3).Value = Range("F5").Value

  • ExcelVBAのSetFocusとプロシージャーの呼び出しについてで

    ExcelVBAのSetFocusとプロシージャーの呼び出しについてです。 質問させて頂きます。 セルをSetFocusで選択することはできないのでしょうか? 同じブックの別々のユーザフォームからプロシージャーを呼びだすことはできないのでしょうか? ユーザフォーム1 sub mh() a=1 msgbox a End sub SUB A_clik() 呼び出し可能 mh            End sub ユーザフォーム2  Sub B_click() call mh    呼び出し不可能     End Sub Sub B_click() userform1.mh    呼び出し不可能     End Sub 呼び出しの指定の仕方がわかりません。 よろしくお願いします。

専門家に質問してみよう