質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

5128閲覧

【Access VBA】あるAccessでVBAを起動させると、別のAccess自体をコピペなどの操作ができるようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

1クリップ

投稿2017/08/14 10:00

業務の一環として毎日、決まった時間に処理が走るような仕組みをAccessで作っています。
今回やりたい事としてはタイトル通り、AAAというAccessでVBAを起動させると
別フォルダに格納されているBBBというAccess自体をコピーし、
同フォルダ内にあるCCCというAccess自体にペーストして上書きするという処理を構築したいと
思っています。

正確に言えば、既にその処理自体はあるのですが、そのAccessはAccess 2010(32bit)と古い為
Access2016(64bit)として作り直しています。
※以前まではofficeソフトが32bitだったのが現在、64bitのOfficeソフトにリプレースされています。

上記を踏まえた上で下記コードを実行すると、Accessが停止してしまい、閉じてしまいます。

以下は標準モジュールとして作成

VBA

1Option Compare Database 2 3Public Type SHFILEOPSTRUCT 4 hwnd As Long 5 wFunc As Long 6 pFrom As String 7 pTo As String 8 fFlags As Integer 9 fAnyOperationsAborted As Long 10 hNameMappings As Long 11 lpszProgressTitle As String 12End Type 13 14Public Declare PtrSafe Function SHFileOperation Lib "SHELL32.DLL" Alias _ 15 "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long 16 17Public Const FO_COPY = &H2 18Public Const FO_MOVE = &H1 19Public Const FOF_NOCONFIRMATION = &H10 20Public Const FOF_RENAMEONCOLLISION = &H8

以下はMicrosoft Access クラス オブジェクトとして作成

VBA

1Option Compare Database 2 3Private Sub Form_Open(Cancel As Integer) 4 5DoCmd.SetWarnings False 6 7'BBBというAccess自体をCCCというAccessにコピペ 8Dim stShellOp As SHFILEOPSTRUCT 9 With stShellOp 10 .hwnd = Application.hWndAccessApp 'Accessのハンドルをセット 11 .wFunc = FO_COPY 'コピーモードを指定'移動時は FO_MOVE 12 .pFrom = "C:\夜間バッチ処理\BBB.accdb" 'コピー元ファイルのフルパスをセット 13 .pTo = "C:\夜間バッチ処理\CCC.accdb" 'コピー先ファイルのフルパスをセット 14 .fFlags = FOF_NOCONFIRMATION '強制的に上書きコピーします 15 End With 16 If SHFileOperation(stShellOp) = 0 Then 17End If 18 19End Sub

結果
上記VBAを実行すると下記画像が表示され、Accessが閉じてしまいます。
イメージ説明

移行前の環境(Access2010 32bit)で実行すると問題はないのですが・・・・。

こちらは前担当者が構築したもので、今はその担当者がいない為
どうしたら良いか分からない状態です。
出来る限り同じ仕組みのまま新しい環境に移行したいと思っていますので
解決方法をご教示頂けますと幸いです。

何卒、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

64bit と32bit ではlong型のデータサイズが異なるため、それに応じた対応が必要です。
こちら(VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法 – Office 2010,2013)や、こちら(64 ビット Visual Basic for Applications の概要)が参考になるでしょう。

修正する内容は、dojikkoさんが提示されていますので。

投稿2017/08/14 12:10

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/15 01:45

ご回答ありがとうございます! 標準モジュールの方で宣言されている変数の型をLongからLongPtrに 変えてみましたら、正常に動きました!
guest

0

ベストアンサー

手元に残っているメモ書きをコピペしただけですけど..
詳しいところを突っ込まれてもわかりません
まぁ参考になれば...

#If VBA7 Then Type SHFILEOPSTRUCT hWnd As LongPtr wFunc As Long pFrom As String pTo As String fFlags As Integer fAborted As Boolean hNameMaps As Longptr sProgress As String End Type Declare PtrSafe Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As LongPtr #Else Type SHFILEOPSTRUCT hWnd As Long wFunc As Long pFrom As String pTo As String fFlags As Integer fAborted As Boolean hNameMaps As Long sProgress As String End Type Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long #End If

投稿2017/08/14 11:00

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/15 01:46

ご回答ありがとうございます! 上記スクリプトに書いてある通り、LongをPtrLongに変えましたら解決できました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問