Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


933 / 2272 ツリー ←次へ | 前へ→

【9445】RunMacro""が実行できません。 吉村 07/5/24(木) 12:39 質問[未読]
【9446】Re:RunMacro""が実行できません。 クロ 07/5/24(木) 13:16 発言[未読]
【9447】Re:RunMacro""が実行できません。 吉村 07/5/24(木) 13:45 質問[未読]
【9448】Re:RunMacro""が実行できません。 クロ 07/5/24(木) 13:58 発言[未読]
【9449】Re:RunMacro""が実行できません。 クロ 07/5/24(木) 14:19 発言[未読]
【9453】Re:RunMacro""が実行できません。 吉村 07/5/24(木) 19:19 お礼[未読]
【9454】Re:RunMacro""が実行できません。 クロ 07/5/25(金) 8:34 発言[未読]
【9455】Re:RunMacro""が実行できません。 吉村 07/5/25(金) 9:48 発言[未読]
【9456】Re:RunMacro""が実行できません。 クロ 07/5/25(金) 10:07 発言[未読]
【9457】Re:RunMacro""が実行できません。 吉村 07/5/25(金) 10:16 発言[未読]
【9458】Re:RunMacro""が実行できません。 吉村 07/5/25(金) 12:54 お礼[未読]
【9460】Re:RunMacro""が実行できません。 hatena 07/5/26(土) 7:50 発言[未読]
【9461】Re:RunMacro""が実行できません。 吉村 07/5/26(土) 15:38 質問[未読]
【9462】Re:RunMacro""が実行できません。 hatena 07/5/26(土) 17:28 回答[未読]
【9463】Re:RunMacro""が実行できません。 吉村 07/5/26(土) 19:27 質問[未読]
【9464】Re:RunMacro""が実行できません。 hatena 07/5/26(土) 19:48 回答[未読]
【9465】Re:RunMacro""が実行できません。 吉村 07/5/26(土) 20:51 お礼[未読]
【9466】Re: 閉じる時最適化はしない方が たん 07/5/28(月) 11:53 発言[未読]
【9467】Re: 閉じる時最適化はしない方が 吉村 07/5/28(月) 18:11 お礼[未読]

【9445】RunMacro""が実行できません。
質問  吉村  - 07/5/24(木) 12:39 -

引用なし
パスワード
   よろしくお願いします。

以下のようなプライベートサブを作成しましたが、
7.番のマクロが実行できない時があります。
 (確立50%くらいでしか動きません)

Private Sub export_Click()
1.  Call SaveRec
   *フォームから入力したデータをテーブルに更新しています。
2.  DoCmd.RunMacro "cif_export"
   *更新したテーブルをテキストファイルに変換しています。
3.  MsgBox " 抽出条件を作成しました。 "
   *メッセージを表示しました。
4.  Call Shell("C:\sinsystem_mdb\object\fs8e290a.exe")
   *COBOLのexeを起動しています。
   (2.のファイルを参照して7.で使用するファイルを作成します)
5.  MsgBox " 抽出処理を終了しました。 "
   *メッセージを表示しました。
6.  DoCmd.RunMacro "tacifimport_delete"
   *7.で使用するテーブルを初期化しています。
7.  DoCmd.RunMacro "cif_import"
   *4.(COBOL)で作成したテキストファイルから
    Accessテーブルへインポートします。
8.  MsgBox " データベースを作成しました。 "
   *メッセージを表示しました。
End Sub

以上ですが、
7.のインポート処理が実行できる時と出来ない時があります。
(マクロの単独実行では確実に成功しています。)

イベントの組み立てに問題があるのでしょうか?

よろしくお願いします。



【9446】Re:RunMacro""が実行できません...
発言  クロ  - 07/5/24(木) 13:16 -

引用なし
パスワード
   >4.  Call Shell("C:\sinsystem_mdb\object\fs8e290a.exe")
>   *COBOLのexeを起動しています。
>   (2.のファイルを参照して7.で使用するファイルを作成します)

こちらが終了する前に

>7.  DoCmd.RunMacro "cif_import"
>   *4.(COBOL)で作成したテキストファイルから
>    Accessテーブルへインポートします。

これが動いているのでは?

【9447】Re:RunMacro""が実行できません...
質問  吉村  - 07/5/24(木) 13:45 -

引用なし
パスワード
   クロ さん こんにちは。
ご助言ありがとうございます。

という事は、イベント定義の順番(時系列)で動くこと
を前提にしていることがそもそも誤りという事ですね。

【私の再認識】ですが
イベントは、マクロ・関数・コマンド等を起動すると、
どんどんと次のアクションへ遷移すると理解してよろし
いのでしょうか?

※丸投げの質問をお許し下さい。
確かに、4.の処理は多少時間が掛かります。
タイムラグというか、何か手段はないのでしょうか?
1.〜6.それぞれの復帰コードを参照して、次のアクション
へ進むとかですが・・

よろしくお願いします。


▼クロ さん:
>>4.  Call Shell("C:\sinsystem_mdb\object\fs8e290a.exe")
>>   *COBOLのexeを起動しています。
>>   (2.のファイルを参照して7.で使用するファイルを作成します)
>
>こちらが終了する前に
>
>>7.  DoCmd.RunMacro "cif_import"
>>   *4.(COBOL)で作成したテキストファイルから
>>    Accessテーブルへインポートします。
>
>これが動いているのでは?

【9448】Re:RunMacro""が実行できません...
発言  クロ  - 07/5/24(木) 13:58 -

引用なし
パスワード
   Accessから外部処理の終了を判定できればいいとは思いますが…
それが出来るかは分かりませんm(_ _)m

>確かに、4.の処理は多少時間が掛かります。
>タイムラグというか、何か手段はないのでしょうか?

この4の処理をCOBOLでしなければならないのでしょうか?

【9449】Re:RunMacro""が実行できません...
発言  クロ  - 07/5/24(木) 14:19 -

引用なし
パスワード
   >Accessから外部処理の終了を判定できればいいとは思いますが…
>それが出来るかは分かりませんm(_ _)m

外部プログラムを実行しそのプログラムが
終了するまで待つ方法
http://miyabi.la.coocan.jp/technic/index.php?ID=1&Category=1&Topic=10

が参考になるかも…

【9453】Re:RunMacro""が実行できません...
お礼  吉村  - 07/5/24(木) 19:19 -

引用なし
パスワード
   ありがとうございます。

COBOL側は基幹システムのため、その資源を
活用する制約があります。

【9454】Re:RunMacro""が実行できません...
発言  クロ  - 07/5/25(金) 8:34 -

引用なし
パスワード
   えっと...終わりってことですか?

でしたら、最終的にどのように解決したかを書いていただければ
後々同様の疑問を持った方の参考になるので…是非ヨロシク!

【9455】Re:RunMacro""が実行できません...
発言  吉村  - 07/5/25(金) 9:48 -

引用なし
パスワード
   クロ さん おはようございます。
まだ、解決していません。
紹介していただいたURLを参考にただいま挑戦中です。


▼クロ さん:
>えっと...終わりってことですか?
>
>でしたら、最終的にどのように解決したかを書いていただければ
>後々同様の疑問を持った方の参考になるので…是非ヨロシク!

【9456】Re:RunMacro""が実行できません...
発言  クロ  - 07/5/25(金) 10:07 -

引用なし
パスワード
   >まだ、解決していません。

あっ、なるほど「礼」となってたから終わったものかと...スミマセン。

【9457】Re:RunMacro""が実行できません...
発言  吉村  - 07/5/25(金) 10:16 -

引用なし
パスワード
   解決次第、結果を報告します。
API・
未知の領域なので、理解しながら進捗しています。


▼クロ さん:
>>まだ、解決していません。
>
>あっ、なるほど「礼」となってたから終わったものかと...スミマセン。

【9458】Re:RunMacro""が実行できません...
お礼  吉村  - 07/5/25(金) 12:54 -

引用なし
パスワード
   クロさん こんにちは。 ありがとうございました。

やっと解決しましたが、まだまだ詳細部分については理解できていません。
特に、As Long = &H400,As Long = &H103 の記述はチンプンカンプンです。


以下のURLを参考にさせて頂きました。

http://miyabi.la.coocan.jp/technic/index.php?ID=1&Category=1&Topic=10
http://homepage1.nifty.com/rucio/main/tyukyu/tyukyu4.htm

1. フォームモジュールレベルで文字列データの比較条件を定義しました。
  ・Option Compare {Binary | Text | Database}
   ここではAccess内でのみ使用しますので以下のように記述しました。
   Option Compare Database

  ・Option Explicit
   ここで、定数を記述しました。
   Private Const PROCESS_STATUS     As Long = &H400  'プロセスの状態を取得する
   Private Const PROCESS_ACTIVE     As Long = &H103  'プロセスは実行中
   * As Long = &H400,As Long = &H103 の記述はまだ理解できていません。

   ここでは、WinAPI宣言(APIのハンドル) を記述しました。
   Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
   * プロセスハンドルの情報を取得する。
   Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
   * プロセスの状態を取得する。
   Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
   * プロセス終了時にプロセスハンドルを閉じる。

※General定義は以上です。 整理すると以下のようになりました。

   Option Compare Database
   Option Explicit
     Private Const PROCESS_STATUS     As Long = &H400
     Private Const PROCESS_ACTIVE     As Long = &H103
     Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
     Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
     Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


2.  次は、Private Subの記述です。

Private Sub export_Click()

'  変数宣言
  Dim ProcessID                  As Long
  Dim ProcessHandle                As Long
  Dim ExitCode                  As Long

  Call SaveRec
'  テーブルの更新

  DoCmd.RunMacro "cif_export"
'  テキストファイルの作成

  MsgBox " 抽出条件を作成しました。 "

'  Call Shell("C:\sinsystem_mdb\object\fs8e290a.exe")
'  このCall文を以下のように変更しました。

  ProcessID = Shell("C:\sinsystem_mdb\object\fs8e290a.exe")

  ProcessHandle = OpenProcess(PROCESS_STATUS, False, ProcessID)
'  プロセスハンドル情報の取得

  Do
    GetExitCodeProcess ProcessHandle, ExitCode
'    プロセス状態の取得

    DoEvents
  Loop While ExitCode = PROCESS_ACTIVE
'  プロセスが終了するまでループさせる(或いは、待っているのでしょうか)

  Call CloseHandle(ProcessHandle)
'  プロセスハンドルを閉じる

  MsgBox " 抽出処理を終了しました。 "

  DoCmd.RunMacro "tacifimport_delete"
'  テーブルの初期化

  DoCmd.RunMacro "cif_import"
'  テーブルの作成(インポートです)

  MsgBox " データベースを作成しました。 "

End Sub


※Private Sub定義は以上です。 整理すると以下のようになりました。

Private Sub export_Click()

'  変数宣言
  Dim ProcessID                  As Long
  Dim ProcessHandle                As Long
  Dim ExitCode                  As Long

  Call SaveRec

  DoCmd.RunMacro "cif_export"

  MsgBox " 抽出条件を作成しました。 "

  ProcessID = Shell("C:\sinsystem_mdb\object\fs8e290a.exe")

  ProcessHandle = OpenProcess(PROCESS_STATUS, False, ProcessID)

  Do
    GetExitCodeProcess ProcessHandle, ExitCode

    DoEvents
  Loop While ExitCode = PROCESS_ACTIVE

  Call CloseHandle(ProcessHandle)

  MsgBox " 抽出処理を終了しました。 "

  DoCmd.RunMacro "tacifimport_delete"

  DoCmd.RunMacro "cif_import"

  MsgBox " データベースを作成しました。 "

End Sub

以上です、ありがとうございました。

【9460】Re:RunMacro""が実行できません...
発言  hatena  - 07/5/26(土) 7:50 -

引用なし
パスワード
   解決したということですが、
念のために、

>   Private Const PROCESS_STATUS     As Long = &H400  'プロセスの状態を取得する
>   Private Const PROCESS_ACTIVE     As Long = &H103  'プロセスは実行中
>   * As Long = &H400,As Long = &H103 の記述はまだ理解できていません。

これは定数の定義で、その数値にコメント部分の意味を割り当てた
ということです。あとで使うときに、&H400 と指定するより、
PROCESS_STATUS と指定した方がコードが読みやすいですよね。

例えば、

>  ProcessHandle = OpenProcess(PROCESS_STATUS, False, ProcessID)
>'  プロセスハンドル情報の取得

ProcessHandle = OpenProcess(&H400, False, ProcessID)

とするより意味を理解しやすいですよね。

>  Do
>    GetExitCodeProcess ProcessHandle, ExitCode
>'    プロセス状態の取得
>
>    DoEvents
>  Loop While ExitCode = PROCESS_ACTIVE
>'  プロセスが終了するまでループさせる(或いは、待っているのでしょうか)

状態が PROCESS_ACTIVE(プロセスは実行中)の間はループさせるということですね。


>  DoCmd.RunMacro "tacifimport_delete"
>'  テーブルの初期化
>
>  DoCmd.RunMacro "cif_import"
>'  テーブルの作成(インポートです)

RunMacro(マクロ)でクエリを実行する場合非同期ですので、
実行終了を待たずに、次のコードが実行されます。
ですので、テーブルの初期化が終わる前に、
次のインポートが実行される可能性があります。

ここは、

CurrentDB.Excute "削除クエリ名"

Docmd.TransferText acLinkDelim, "インポート定義","テーブル名","ファイル名"

というようにVBAで記述した方が安全でしょう。

【9461】Re:RunMacro""が実行できません...
質問  吉村  - 07/5/26(土) 15:38 -

引用なし
パスワード
   hatena さん、こんにちは。

解説とご指摘ありがとうございます。
早速、ご指摘の箇所を修正しましたが、どうもうまくいきません。

4点、質問をさせてください。

私は、
OS:Microsoft WindowsXP Home Edition
バージョン:5.1.2600 Service Pack2
Office 2003:Access2003
を使用しています。

ご指摘の箇所ですが、
>
>>  DoCmd.RunMacro "tacifimport_delete"
>>'  テーブルの初期化
>>
>>  DoCmd.RunMacro "cif_import"
>>'  テーブルの作成(インポートです)
>
>RunMacro(マクロ)でクエリを実行する場合非同期ですので、
>実行終了を待たずに、次のコードが実行されます。
>ですので、テーブルの初期化が終わる前に、
>次のインポートが実行される可能性があります。
>
>ここは、
>
>CurrentDB.Excute "削除クエリ名"
を参考にして
CurrentDb.Excute "qutacifimport_delete"としました。
結果は、
「コンパイルエラー:メソッドまたはデータメンバが見つかりません。」
となります。(クエリ名は確認しました)
VBEditorの画面へ遷移して、CurrentDb.Excuteの「.Excute」の文字列
が反転している状態になります。
尚、クエリの単独実行は正常に動きました。

試しに、
CurrentDb.Excute "Delete * From tacifimport"としましたが、
結果は同じでした。

【質問1】
Accessの環境定義みたいなもに問題があるのでしょうか?
例えば、ODBCソースみたいのものですが?
(ODBCの意味も分からずに質問して申し訳ありません。)

【質問2】
CurrentDb.Excuteの代わりに
DoCmd.RunSQL "Delete * From tacifimport"を試みて、成功はしましたが、
どうしても、「CurrentDb.Excute」を克服したいと思っています。
ご指摘をお願いします。

【質問3】
>Docmd.TransferText acLinkDelim, "インポート定義","テーブル名","ファイル名"
>
>というようにVBAで記述した方が安全でしょう。

  DoCmd.TransferText acLinkDelim, "select_import", "tacifimport", "c:\sinsystem_mdb\data\select_import.txt"
は成功しましたが、"tacifimport"のテーブルテキストリンク"tacifimport1"
が作成されてしまいます。
本当は"tacifimport"へ上書きしたいのですが。
「作成されてしまいます・・」というよりは、私が未熟でそういう仕組みになっているのですが。

【質問4】

テーブルの初期化にDeleteを使っていますが、本当は「ModifyTable」のようなものを使いたいのですが、
関数?,コマンド?が分かりません。

>

以上ですが、なにとぞよろしくお願いします。

【9462】Re:RunMacro""が実行できません...
回答  hatena  - 07/5/26(土) 17:28 -

引用なし
パスワード
   >>CurrentDB.Excute "削除クエリ名"
> を参考にして
> CurrentDb.Excute "qutacifimport_delete"としました。
> 結果は、
>「コンパイルエラー:メソッドまたはデータメンバが見つかりません。」
> となります。(クエリ名は確認しました)
> VBEditorの画面へ遷移して、CurrentDb.Excuteの「.Excute」の文字列
> が反転している状態になります。

ごめんなさい。タイプミスです(汗)
CurrentDb.Execute が正しいです。

>【質問2】
> CurrentDb.Excuteの代わりに
> DoCmd.RunSQL "Delete * From tacifimport"を試みて、成功はしましたが、

RunSQL もやはり非同期ですので、Executeを使った方がいいです。

>【質問3】
>>Docmd.TransferText acLinkDelim, "インポート定義","テーブル名","ファイル名"
>>
>>というようにVBAで記述した方が安全でしょう。
>
>  DoCmd.TransferText acLinkDelim, "select_import", "tacifimport", "c:\sinsystem_mdb\data\select_import.txt"
> は成功しましたが、"tacifimport"のテーブルテキストリンク"tacifimport1"
> が作成されてしまいます。
> 本当は"tacifimport"へ上書きしたいのですが。
> 「作成されてしまいます・・」というよりは、私が未熟でそういう仕組みになっているのですが。

ごめんなさい。これも私のミスです(滝汗)
インポートは、第一引数が acImportDelim でした。

>【質問4】
>
> テーブルの初期化にDeleteを使っていますが、本当は「ModifyTable」のようなものを使いたいのですが、
> 関数?,コマンド?が分かりません。

具体的には何がしたいのでしょうか。

【9463】Re:RunMacro""が実行できません...
質問  吉村  - 07/5/26(土) 19:27 -

引用なし
パスワード
   ありがとうございます。
出来ました。

  MsgBox " 抽出処理を終了しました。 "
  CurrentDb.Execute "qutacifimport_delete"
  DoCmd.TransferText acImportDelim, "select_import", "tacifimport", "c:\sinsystem_mdb\data\select_import.txt"
  MsgBox " データベースを作成しました。 "


>
>>【質問4】
>>
>> テーブルの初期化にDeleteを使っていますが、本当は「ModifyTable」のようなものを使いたいのですが、
>> 関数?,コマンド?が分かりません。
>
>具体的には何がしたいのでしょうか。

Deleteは1レコードづつ削除していくというイメージ
が私の中にありまして、テーブルを一気に初期化する
コマンドがあればそれを使いたいという事なんですが。

【9464】Re:RunMacro""が実行できません...
回答  hatena  - 07/5/26(土) 19:48 -

引用なし
パスワード
   >Deleteは1レコードづつ削除していくというイメージ
>が私の中にありまして、テーブルを一気に初期化する
>コマンドがあればそれを使いたいという事なんですが。

データベースにおけるレコード削除は、実際にデータを消去
するわけでなく、削除マークを付けていくだけです。
ですので、それほど時間がかかるわけではありません。

大量のレコードを削除してもMDBファイルサイズは減らないことから
分かると思います。
そのため定期的に、最適化をして削除して無駄になった領域を
実際に削除するという処理が必要になります。

【9465】Re:RunMacro""が実行できません...
お礼  吉村  - 07/5/26(土) 20:51 -

引用なし
パスワード
   hatena さんへ
>
>データベースにおけるレコード削除は、実際にデータを消去
>するわけでなく、削除マークを付けていくだけです。
>ですので、それほど時間がかかるわけではありません。
>
>大量のレコードを削除してもMDBファイルサイズは減らないことから
>分かると思います。
>そのため定期的に、最適化をして削除して無駄になった領域を
>実際に削除するという処理が必要になります。

こんな設定をしてみました。
「ツール」→「オプション」→「全般」→「閉じる時に最適化する(C)」
を「チェック」しました。
COBOLの領域でいう「索引ファイルの再構築」と同様かな・・
と認識させてもらいました。
※すみません。
 ここはAccess広場ですので他言語に言及するのは禁止ですね。

私、54歳になります。
今年3月からこの業界、この仕事を担当になりました。
COBOLと簡単なSQLはひと月くらいで何とかマスターできましたが、
AccessとAccessVbaは私にとってかなり手強い存在です。

今後も幼稚な投稿(質問)をさせていただく事になりますが、
よろしくお願い致します。

クロさん,そしてhatenaさん ありがとうございました。
とても勉強になりました。

【9466】Re: 閉じる時最適化はしない方が
発言  たん  - 07/5/28(月) 11:53 -

引用なし
パスワード
   >「ツール」→「オプション」→「全般」→「閉じる時に最適化する(C)」

については、開発中のプログラムではやらない方が良いでしょう。
開発中というのは、さまざまな理由で、mdbが破損する可能性があります。

上記を設定していると、破損したmdbのままで最適化しようとする場合が
あるので、mdb自体を定期的にバックアップを取っていないと、

mdb破損の際に、どうしようもなくなります。

最適化が必要であれば、定期的に手動で行なうべきです。

【9467】Re: 閉じる時最適化はしない方が
お礼  吉村  - 07/5/28(月) 18:11 -

引用なし
パスワード
   たんさん、こんにちは。
ご指摘ありがとうございました。

「最適化」を解除しました。


▼たん さん:
>>「ツール」→「オプション」→「全般」→「閉じる時に最適化する(C)」
>
>については、開発中のプログラムではやらない方が良いでしょう。
>開発中というのは、さまざまな理由で、mdbが破損する可能性があります。
>
>上記を設定していると、破損したmdbのままで最適化しようとする場合が
>あるので、mdb自体を定期的にバックアップを取っていないと、
>
>mdb破損の際に、どうしようもなくなります。
>
>最適化が必要であれば、定期的に手動で行なうべきです。

933 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free