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

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

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

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

Access

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

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

2回答

3595閲覧

Accessマクロをテキスト出力したい

kamiyui_bidan

総合スコア47

VBA

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

Access

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

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

1クリップ

投稿2018/08/08 01:33

下記のコードを、マクロをテキスト出力したいaccdbに
書いて、そのaccdbのマクロは出力できるのですが、
ファイルが数10ファイルあるので、できれば、1つの
accdbから他のaccdbのマクロを出力できるようにしたいです。

そのような方法はありますでしょうか?
※ファイル数の分だけ繰り返す、という処理の書き方だけは分かっています

Dim Containers As DAO.Containers Dim Container As DAO.Container Dim Document As DAO.Document Set Containers = CurrentDb.Containers Set Container = Containers("Scripts") For Each Document In Container.Documents SaveAsText ObjectType:=AcObjectType.acMacro, _ ObjectName:=Document.Name, _ fileName:="C:\" & Document.Name & ".txt" Next

【環境】
Access2010のVBA、Win7
※因みに、今はPCの管理者権限があるが、近いうちに標準ユーザに
なるので、VBScriptは実行できなくなる可能性が高い

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

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

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

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

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

guest

回答2

0

Currentdbではなくて、他のDBを参照するようにすればイケると思います。
ファイル名若しくは、dbをパラメータにした関数にすれば、共通化出来るかと。

VBA

1Dim Containers As DAO.Containers 2Dim Container As DAO.Container 3Dim Document As DAO.Document 4Dim db As DAO.Databese 5 6Set db = OpenDatabase("対象ファイルのフルパス") 7Set Containers = db.Containers 8Set Container = Containers("Scripts") 9 10For Each Document In Container.Documents 11 SaveAsText ObjectType:=AcObjectType.acMacro, _ 12 ObjectName:=Document.Name, _ 13 fileName:="C:\" & Document.Name & ".txt" 14Next

OpenDatabaseメソッド : DAOリファレンス - DAO入門講座
Workspace.OpenDatabase メソッド (DAO)

投稿2018/08/08 03:17

編集2018/08/08 03:57
sazi

総合スコア25195

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

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

kamiyui_bidan

2018/08/08 04:39

迅速な回答、ありがとうございます。 教えていただいたコードを試したところ、SaveAsTextの行で "指定した名前および型のオブジェクトは、カレントデータベースには存在しません" というエラーが出てしまいましたので、下記のように変更して出力できました。 下記のように書くより、ここはこうした方がいい、 みたいな点があれば、ご指摘いただけると幸いです。 Sub ExportMacro() Dim OutDir As String Dim Containers As DAO.Containers Dim Container As DAO.Container Dim Document As DAO.Document Dim db As DAO.Database Dim appAccess As Access.Application '★ Dim strDB As String '★ strDB = "Z:\sample.accdb" '★ OutDir = "C:\Users\ユーザー\Desktop\_tmp\" Set db = OpenDatabase(strDB) Set Containers = db.Containers Set Container = Containers("Scripts") Set appAccess = CreateObject("Access.Application") '★ 'マクロの数だけ繰り返し For Each Document In Container.Documents appAccess.OpenCurrentDatabase strDB '★ appAccess.Application.SaveAsText ObjectType:=AcObjectType.acMacro, _ ObjectName:=Document.Name, _ fileName:=OutDir & Document.Name & ".txt" 'SaveAsText ObjectType:=AcObjectType.acMacro, _ ObjectName:=Document.Name, _ fileName:=OutDir & Document.Name & ".txt" Next db.Close: Set db = Nothing Set appAccess = Nothing MsgBox "処理終了" End Sub
guest

0

ベストアンサー

Set Containers = CurrentDb.ContainersCurrentDbは開いているAccdbのDataBaseという意味だから、ここを、下記のように他のAccdbファイルを開いて使用すればいいでしょう。

vba

1Dim Db As DAO.DataBase 2Set Db = OpenDatabase("accdbファイルのパス") 3Set Containers = Db.Containers 4 5'中略 6 7Db.Close: Set Db = Nothing

訂正

SaveAsTextメソッドは、Access.Applicationのメソッドなので、下記のコードになりますね。
マクロ名は、CurrentProject.AllMacrosFor Eachでループさせれば取得できますので、 OpenDatabaseは不要です。

vba

1Sub ExportMacro() 2 Dim OutDir As String 3 Dim acObj As AccessObject 4 Dim appAccess As Access.Application 5 Dim strDB As String 6 7 strDB = "C:\TEST1\Database1.accdb" 8 OutDir = "C:\TEST1\" 9 10 Set appAccess = CreateObject("Access.Application") 11 appAccess.OpenCurrentDatabase strDB 12 13 'マクロの数だけ繰り返し 14 For Each acObj In appAccess.CurrentProject.AllMacros 15 appAccess.Application.SaveAsText ObjectType:=AcObjectType.acMacro, _ 16 ObjectName:=acObj.Name, _ 17 FileName:=OutDir & acObj.Name & ".txt" 18 Next 19 appAccess.CloseCurrentDatabase 20 appAccess.Quit 21 Set appAccess = Nothing 22 23 MsgBox "処理終了" 24End Sub

投稿2018/08/08 03:21

編集2018/08/08 07:00
hatena19

総合スコア33715

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

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

kamiyui_bidan

2018/08/08 04:41

迅速な回答、ありがとうございます。 教えていただいたコードを試したところ、SaveAsText行で "指定した名前および型のオブジェクトは、カレントデータベースには存在しません"  というエラーが出てしまいましたので、下記のように変更して出力できました。 下記のように書くより、ここはこうした方がいい、 みたいな点があれば、ご指摘いただけると幸いです。 Sub ExportMacro() Dim OutDir As String Dim Containers As DAO.Containers Dim Container As DAO.Container Dim Document As DAO.Document Dim db As DAO.Database Dim appAccess As Access.Application '★ Dim strDB As String '★ strDB = "Z:\sample.accdb" '★ OutDir = "C:\Users\ユーザー\Desktop\_tmp\" Set db = OpenDatabase(strDB) Set Containers = db.Containers Set Container = Containers("Scripts") Set appAccess = CreateObject("Access.Application") '★ 'マクロの数だけ繰り返し For Each Document In Container.Documents appAccess.OpenCurrentDatabase strDB '★ appAccess.Application.SaveAsText ObjectType:=AcObjectType.acMacro, _ ObjectName:=Document.Name, _ fileName:=OutDir & Document.Name & ".txt" 'SaveAsText ObjectType:=AcObjectType.acMacro, _ ObjectName:=Document.Name, _ fileName:=OutDir & Document.Name & ".txt" Next db.Close: Set db = Nothing Set appAccess = Nothing MsgBox "処理終了" End Sub
ExcelVBAer

2018/08/08 06:33

appAccess を最後にNothingしてますが、 その前に .Quit で閉じないとプロセスが残ってるのでは??
kamiyui_bidan

2018/08/08 06:57

ご指摘、ありがとうございます。 おっしゃる通り、プロセスが残ってましたので、Nothingの前にappAccess.Quit を入れるようにしました。
hatena19

2018/08/08 07:02

冗長な部分があるので、それを排除したコードを回答に追記しましたので、参考にしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問