Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : その他)
複数ACCDBのソースに書かれた文字列を一括置換したい
投稿日時: 20/01/22 19:05:34
投稿者: かきまろ

Accessのバージョンは、2019です。
 
1つのフォルダの中にACCDBが約200本あります。
 
そのACCDBのソースコードに書かれた文字列を一括変換できないか考えています。
 
もちろん全て1つ1つ手で開いて書き換える事はできるのですが
さすがに本数が多いのでどうにかならないものかと。
 
今は1フォルダ内のACCDBの名称を全て取得する所までは出来ているのですが
そもそもソースを参照するなんていう事ができるのでしょうか。
 
やりたい事は
「T_部門別管理情報TBL」と書かれている箇所を「T_管理情報TBL」に置換して書き込みたいのです
 
DoCmd.RunSQL "Delete From T_部門別管理情報TBL;"を
こうしたい↓
DoCmd.RunSQL "Delete From T_管理情報TBL;"
 
何か手段があるようでしたらごご教示願います
これは不可能というご意見でも頂きたいです

回答
投稿日時: 20/01/23 13:32:04
投稿者: sk

引用:
1つのフォルダの中にACCDBが約200本あります。
 
そのACCDBのソースコードに書かれた文字列を一括変換できないか考えています。

引用:
そもそもソースを参照するなんていう事ができるのでしょうか。

出来る/出来ないの話で言えば
「プロジェクトにロックがかかっていない限りは一応は出来る」
という回答にはなります。
 
但し「実際にその方法を推奨できるか」という話となれば
(少なくとも私個人の意見としては)推奨は致しかねます。
 
・その置換処理を実行した結果、かえって何らかの不具合が
 発生する可能性はゼロではない。
 (意図しない箇所まで置換される恐れがある)
 
・具体的にどのファイルのどのモジュールのどの部分が
 修正されたかを把握しづらくなる。
 
・仮に「全ての accdb ファイルには共通して使用されているモジュールがあり、
 それらのモジュールだけが更新対象となる」ということなのであれば、
 「コードを直接書き換えるコード」を実行するより、
 「修正済みの(正常に動作する)モジュール」を
 それぞれの accdb ファイルにエクスポートする
 (オブジェクトごと上書きする)処理を流した方が
 効率的かつ安全である。
 
・どの道 200 個全ての accdb ファイルについて
 プログラムの動作検証は必要である。
 
いずれにせよ、そういった処理を実行する前に
全ファイルのバックアップを残しておくべきでしょう。

回答
投稿日時: 20/01/23 20:47:02
投稿者: よろずや

Option Explicit
Const bftxt = "T_部門別管理情報TBL"
Const aftxt = "T_管理情報TBL"
 
Sub Sample()
    Dim Path As String
    Path = CodeProject.Path
    If Right(Path, 1) <> "\" Then
        Path = Path & "\"
    End If
    Dim fnm As String
    fnm = Dir(Path & "*.accdb", vbNormal)
    Do While Len(fnm) > 0
        If fnm <> CodeProject.Name Then
            Dim acc As Access.Application
            If acc Is Nothing Then
                Set acc = New Access.Application
            End If
            acc.OpenCurrentDatabase Path & fnm
            Dim obj As Object, Saveflg As AcCloseSave
            With acc.CurrentProject
                For Each obj In .AllForms
                    acc.DoCmd.OpenForm obj.Name, acDesign
                    Saveflg = ReplaceText(acc.Forms(obj.Name).Module)
                    acc.DoCmd.Close acForm, obj.Name, Saveflg
                Next obj
                For Each obj In .AllReports
                    acc.DoCmd.OpenReport obj.Name, acDesign
                    Saveflg = ReplaceText(acc.Reports(obj.Name).Module)
                    acc.DoCmd.Close acReport, obj.Name, Saveflg
                Next obj
                For Each obj In .AllModules
                    acc.DoCmd.OpenModule obj.Name
                    Saveflg = ReplaceText(acc.Modules(obj.Name))
                    acc.DoCmd.Close acModule, obj.Name, Saveflg
                Next obj
            End With
            acc.CloseCurrentDatabase
        End If
        fnm = Dir()
    Loop
    If Not acc Is Nothing Then
        acc.Quit
        Set acc = Nothing
    End If
    MsgBox "置換終了"
End Sub
 
Function ReplaceText(ByVal mdl As Module) As AcCloseSave
    Dim SttLin As Long: SttLin = 0
    Dim SttCol As Long: SttCol = 0
    Dim EndLin As Long: EndLin = 0
    Dim EndCol As Long: EndCol = 0
    ReplaceText = acSaveNo
    If mdl.Find(bftxt, SttLin, SttCol, EndLin, EndCol) Then
        Dim i As Long
        For i = SttLin To mdl.CountOfLines
            Dim txt1 As String, txt2 As String
            txt1 = mdl.Lines(i, 1)
            txt2 = Replace(txt1, bftxt, aftxt)
            If txt1 <> txt2 Then
                mdl.ReplaceLine i, txt2
                ReplaceText = acSaveYes
            End If
        Next i
    End If
End Function
 
ってな感じかな。

投稿日時: 20/01/25 07:47:19
投稿者: かきまろ

skさん、よろずやさん丁寧にありがとうございます。
 
確かにエクセルなどの一括変換でも思わぬ箇所が変更されてしまったという事もありますし、一括変換できたとしても目検で確認した上での動作確認は十分やる必要がありますね。
 
結局、労力としては手作業と変わらないかも知れませんがスキルアップとして
よろずやさんに書いて頂いたソースを参考に、これからテスト環境にて動作確認テストさせて頂こうと思います。

投稿日時: 20/01/25 09:55:12
投稿者: かきまろ

よろずやさんに書いて頂いたコードを使わせて頂きテストしてみました。
 
手作業でのソースの書き換えは早くても2〜3日は見込んでいたのですが
なんと処理時間はわずか3分少々でした。
 
ソースを見たところうまく変換されていたので
テスト環境で動作確認をやっている最中でまだ2本しかテストしていませんが
しっかり思った通りの動作をしています。
 
ほぼ無理だろうと思っていた事だけに驚きです。
 
まだ残りは多いですがこれからテストします。
 
ありがとうございました。
 
 
 

投稿日時: 20/01/30 09:09:55
投稿者: かきまろ

skさん、よろずやさん
 
昨日テスト環境にてユーザーテストが無事に終わり、
今朝から業務運用して今のところですが何事もなく運用できています。
 
手作業により力作業しか無いとあきらめていた事だけに助かりました。
 
本当にありがとうございました。