プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。
早速質問なのですが、ADOで一旦データベースの内容を取り出した後、別のワークブックへコピーするというマクロを作っています。
問題は、データベースの内容を取り終わる前に別のワークブックへコピーする処理が始まってしまい困っています。

マクロの処理だけを一定時間止める方法、またはADOの処理が終わるのを待って次の処理へ進む方法はないものでしょうか?

ご存知の方がいましたら、アドバイスをお願いします。

A 回答 (4件)

>ADOの処理が終わるのを待って次の処理へ進む方法はないものでしょうか?



【クエリの更新が終わるまで次の処理に移行しない】
ということであれば、

 .Refresh BackgroundQuery:=True

としている部分を、

 .Refresh BackgroundQuery:=False

とすれば良さそうに思うのですが…?

ご参考まで。
    • good
    • 0
この回答へのお礼

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

.Refresh BackgroundQuery:=False
で、クエリの更新を待つようになりました。

今後のこともあるので、ADOで作り直してみようと思います。

お礼日時:2009/07/23 08:58

こんにちは。



ソースを見る限りは、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秒間、ウェイトする

こんなコマンドもありますが……。

この回答への補足

ご指摘ありがとうございました。

WEBでADOのサンプルを見つけてそれを参考に作っていたのですが、そもそもADOではなかったのですね。すみませんでした。

まだわからないことだらけなもので、もう1度ADOのやり方を勉強してみます><
ウェイトの方法まで載せていただきありがとうございました^^

補足日時:2009/07/22 14:40
    • good
    • 0

うーん・・・肝心の処理進行のステートメント(もしくは処理中枢部分)が書かれていないような・・・^^;



・データ抽出処理
・コピー処理

この二つはステートメントを分けていますか?

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
sub 処理実行ステートメント()

Call データ抽出処理ステートメント
Call コピー処理ステートメント

end sub

sub データ抽出処理ステートメント()
~データ抽出処理~
end sub

sub コピー処理ステートメント()
~コピー処理~
end sub

のようになっていますか?
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

この回答への補足

ご指摘ありがとうございました。
データ抽出処理とコピー処理の二つにステートメントを分けていませんでした。処理中枢部分といっても先ほど載せたものしかありません。あとはコピー後に保存するとかそれくらいなのですが・・・。
ステートメントを分けて以下のようにしてみましたが、やはりデータ取り出し中の状態でコピー処理が始まってしまいました。
何度も申し訳ありませんが、見ていただければ幸いです。

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 

補足日時:2009/07/22 14:12
    • good
    • 0

通常、プログラムは並行して二つの処理、ということはしません。


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

この回答への補足

さっそくのご回答ありがとうございました。
ソースを載せますので、気づいたことがあればご指摘下さい。

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
    ・
    ・
    ・

※ここで、データ取得が完了するまで待ちたいのですが・・・。

補足日時:2009/07/22 12:58
    • good
    • 0

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

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


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