• ベストアンサー

マクロで、次のコードへ行く前に時間をおくにはどうしたらいいのでしょうか?

いつもお世話になっております。 早速質問なのですが、ADOで一旦データベースの内容を取り出した後、別のワークブックへコピーするというマクロを作っています。 問題は、データベースの内容を取り終わる前に別のワークブックへコピーする処理が始まってしまい困っています。 マクロの処理だけを一定時間止める方法、またはADOの処理が終わるのを待って次の処理へ進む方法はないものでしょうか? ご存知の方がいましたら、アドバイスをお願いします。

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

  • ベストアンサー
  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.4

>ADOの処理が終わるのを待って次の処理へ進む方法はないものでしょうか? 【クエリの更新が終わるまで次の処理に移行しない】 ということであれば、  .Refresh BackgroundQuery:=True としている部分を、  .Refresh BackgroundQuery:=False とすれば良さそうに思うのですが…? ご参考まで。

wise123
質問者

お礼

ありがとうございました。 .Refresh BackgroundQuery:=False で、クエリの更新を待つようになりました。 今後のこともあるので、ADOで作り直してみようと思います。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 ソースを見る限りは、ADO ではなくて、QueryTable から、ODBCをお使いのようですが、Table を作った後に、Cells.Copy では、かなり無理があるようです。 最初の行で、↓を宣言しているようですが、False では? Application.ScreenUpdating = True この部分もへんですね。 Cells.Select Selection.Delete Shift:=xlUp 単に、 Cells.Clear で良いように思います。 >データベースの内容を取り終わる前に別のワークブックへコピーする処理が始まってしまい困っています。 今の段階で、終了を確認していないから、時間差を置いたり止めたりする方法は、感心しません。QueryTable 自体の問題ではないでしょうか。本格的に、ADOでやってみたらいかがですか? 当面、 Application.Wait Now + TimeSerial(0, 0, 30) '30秒間、ウェイトする こんなコマンドもありますが……。

wise123
質問者

補足

ご指摘ありがとうございました。 WEBでADOのサンプルを見つけてそれを参考に作っていたのですが、そもそもADOではなかったのですね。すみませんでした。 まだわからないことだらけなもので、もう1度ADOのやり方を勉強してみます>< ウェイトの方法まで載せていただきありがとうございました^^

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.2

うーん・・・肝心の処理進行のステートメント(もしくは処理中枢部分)が書かれていないような・・・^^; ・データ抽出処理 ・コピー処理 この二つはステートメントを分けていますか? _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ sub 処理実行ステートメント() Call データ抽出処理ステートメント Call コピー処理ステートメント end sub sub データ抽出処理ステートメント() ~データ抽出処理~ end sub sub コピー処理ステートメント() ~コピー処理~ end sub のようになっていますか? _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

wise123
質問者

補足

ご指摘ありがとうございました。 データ抽出処理とコピー処理の二つにステートメントを分けていませんでした。処理中枢部分といっても先ほど載せたものしかありません。あとはコピー後に保存するとかそれくらいなのですが・・・。 ステートメントを分けて以下のようにしてみましたが、やはりデータ取り出し中の状態でコピー処理が始まってしまいました。 何度も申し訳ありませんが、見ていただければ幸いです。 sub 処理実行ステートメント call データ抽出処理ステートメント call データコピー処理ステートメント end sub Sub データ抽出処理ステートメント() Application.ScreenUpdating = True Application.DisplayAlerts = True Sheets("得意先マスター").Select Cells.Select Selection.Delete Shift:=xlUp Range("A1").Select ' With ActiveSheet.QueryTables.Add(Connection:= _ "ODBC;DSN=AAADSN;APP=MicrosoftR Query;Trusted_Connection=Yes" _ , Destination:=Range("A1")) .CommandText = Array( _ "SELECT *" & Chr(10) & "FROM AAA" & "DB.dbo.得意先M 得意先M") .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = True .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .Refresh BackgroundQuery:=True End With end sub sub データコピー処理ステートメント() Sheets("得意先マスター").Select Cells.Select Selection.Copy Workbooks.Open Filename:="C:\得意先M.xls" Windows("得意先M.xls").Activate Sheets("得意先M").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False end sub 

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.1

通常、プログラムは並行して二つの処理、ということはしません。 恐らくコーディングの問題だと思いますので、「時間をおく」よりも「ソースを書き直す」ことを強くお勧めします。 恐らく差し支えない程度にソースを載せて頂いた方が話が早いと思いますが、転記は可能でしょうか?

wise123
質問者

補足

さっそくのご回答ありがとうございました。 ソースを載せますので、気づいたことがあればご指摘下さい。 Sub toku() Application.ScreenUpdating = True Application.DisplayAlerts = True Sheets("得意先マスター").Select Cells.Select Selection.Delete Shift:=xlUp Range("A1").Select ' With ActiveSheet.QueryTables.Add(Connection:= _ "ODBC;DSN=AAADSN;APP=MicrosoftR Query;Trusted_Connection=Yes" _ , Destination:=Range("A1")) .CommandText = Array( _ "SELECT *" & Chr(10) & "FROM AAA" & "DB.dbo.得意先M 得意先M") .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = True .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .Refresh BackgroundQuery:=True End With '(※ Sheets("得意先マスター").Select Cells.Select Selection.Copy     ・     ・     ・ ※ここで、データ取得が完了するまで待ちたいのですが・・・。

関連するQ&A

専門家に質問してみよう