AccessVBA・ExcelVBA ~ 別のaccdb(or mdb)ファイルの、すべてのモジュールのVBAコードの内容を、指定した語句のみを一括置換するプログラム(ラストにExcel版もあります。自xlsmのみの書き換えだけですが。)
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
●メインプログラム
他のaccdbの、すべてのモジュールのVBAコードの内容を、指定した語句のみを一括置換するプログラム。(mdbファイルも行けるかも?テストしてませんが。)
全行ではなくて、置換したい語句がヒットした行だけ書き換えています。
ただし、他のファイルのVBAコードをエラー無く書き換えるために、
ファイル
→オプション
→トラストセンター
→トラストセンターの設定
→マクロの設定
にて、
「すべてのマクロを有効にする」
にしてOKしておかないといけないです。
あとで、しかるべきセキュリティ設定に戻してください。
それと、呼び出すときに、
自ファイルを指定するとエラーになって処理できません。
自ファイルに処理したいときは、後述の「★01」や「★02」のプログラムをご利用ください。
(ただし、置換対象語句の設定を毎回書き換えないといけなくなります)
あと、もしかしたらAccessのバージョンによっては
Excelみたいに、以下のような設定が必要になるかもしれません。
https://akira55.com/module_update/
(もしかしたらExcelと違って全バージョン不要かも?でも調べてません。)
一応、置換対象の語句が見つからなくてもエラーにならないみたいです。
でも完璧に動くかどうかはわかりませんので、くれぐれも、テスト用ファイルで試してから、作り替えるなどしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
' ' Sub AllModuleReplace03(s_SearchWord01 As String, s_RepWord01 As String, s_FullPath01 As String) Dim o_mdl As Module Dim i As Integer Dim i_mdlNm As Integer Dim l_AllGyousuu As Long Dim l_CrrentGyou As Long Dim s_Text01 As String Dim i_Answ01 As Integer Dim i_Answ02 As Integer ' Dim s_SearchWord01 As String ' Dim s_RepWord01 As String '置換語句の設定 ' s_SearchWord01 = "" ' '↑検索語句(置換対象の語句) ' ' s_RepWord01 = "" ' '↑置換内容としての語句 ' Stop Dim AnoterAccApp As Access.Application Set AnoterAccApp = GetObject(s_FullPath01) AnoterAccApp.Visible = True i_mdlNm = AnoterAccApp.Modules.Count - 1 '↑モジュールの指定は「Modules(0)」がスタートなので、 ' 最後のモジュールの指定は総数から1引いておく。 For i = 0 To i_mdlNm '↑各モジュールの中で1行ずつ処理 Set o_mdl = AnoterAccApp.Modules(i) l_AllGyousuu = o_mdl.CountOfLines '↑すべての行数 For l_CrrentGyou = 1 To l_AllGyousuu ' Debug.Print o_mdl.Lines(l_CrrentGyou, 1) '↑1行分をイミディエイト表示 s_Text01 = o_mdl.Lines(l_CrrentGyou, 1) '↑現在の行の内容を取得 i_Answ01 = InStr(1, s_Text01, s_SearchWord01, vbBinaryCompare) '↑置換の目的の語句が、その現在の行に含まれているかをチェック If i_Answ01 <> 0 Then '含まれていれば以下の処理 i_Answ02 = InStr(1, s_Text01, "Call mdl.ReplaceLine(l_CrrentGyou, txtstr &", vbBinaryCompare) '「Call mdl.ReplaceLine(l_CrrentGyou, txtstr &」を含むコードは今回のプログラム全体の中では、「’◆◆◆」などを付加するコードなのでスルーする。 If i_Answ02 = 0 Then '[「"Call mdl.ReplaceLine("」の行はハジキたいので、 'それが含まれていないならOKなので、以下のように置換する。 s_Text01 = Replace(s_Text01, s_SearchWord01, s_RepWord01, , , vbBinaryCompare) Call o_mdl.ReplaceLine(l_CrrentGyou, s_Text01) Else End If Else '含まれていなければ何もしない。 End If Next Next i ' Stop ' AnoterAccApp.DoCmd Save AnoterAccApp.Quit acQuitSaveAll End Sub ' ' |
===========================
●以下、上記のコードに行きつくまでのサンプル
===========================
★01:一番のおおもと。関数化してないもの。全行上書き。
自ファイルのコードに特定の文字列を付加するものと、置換してしまうもの。
置換のコードのほうは、「ReplaceLine」する設定自体(置換対象の部分のコードの文字列)も書き換えてしまうので、問題があるにはある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
' ' Option Compare Database Option Explicit '特定の文字列の付加 'ここでは「'★★」を全行の末尾に付加している。 Sub AllModuleWordPlus01() Dim mdl As Module Dim i As Integer Dim MdlNm As Integer Dim AllGyousuu As Long Dim l_CrrentGyou As Long Dim txtstr As String MdlNm = Modules.Count - 1 '↑モジュールの指定は「Modules(0)」がスタートなので、 ' 最後のモジュールの指定は総数から1引いておく。 For i = 0 To MdlNm '↑各モジュールの中で1行ずつ処理 Set mdl = Modules(i) AllGyousuu = mdl.CountOfLines '↑すべての行数 ' l_CrrentGyou = 1 For l_CrrentGyou = 1 To AllGyousuu Debug.Print mdl.Lines(l_CrrentGyou, 1) '↑1行分をイミディエイト表示 txtstr = mdl.Lines(l_CrrentGyou, 1) Call mdl.ReplaceLine(l_CrrentGyou, txtstr & "'★★") Next Next i End Sub ’置換するコード 'ここでは「'★★」を「」に置換している=消している。 Sub AllModuleReplace01() Dim o_mdl As Module Dim i As Integer Dim i_mdlNm As Integer Dim l_AllGyousuu As Long Dim l_CrrentGyou As Long Dim s_Text01 As String Dim s_SearchWord01 As String Dim s_RepWord01 As String '置換語句の設定 s_SearchWord01 = "'★★" '↑検索語句(置換対象の語句) s_RepWord01 = "" '↑置換内容としての語句 i_mdlNm = Modules.Count - 1 '↑モジュールの指定は「Modules(0)」がスタートなので、 ' 最後のモジュールの指定は総数から1引いておく。 For i = 0 To i_mdlNm '↑各モジュールの中で1行ずつ処理 Set o_mdl = Modules(i) l_AllGyousuu = o_mdl.CountOfLines '↑すべての行数 ' l_CrrentGyou = 1 For l_CrrentGyou = 1 To l_AllGyousuu Debug.Print o_mdl.Lines(l_CrrentGyou, 1) '↑1行分をイミディエイト表示 s_Text01 = o_mdl.Lines(l_CrrentGyou, 1) s_Text01 = Replace(s_Text01, s_SearchWord01, s_RepWord01, , , vbBinaryCompare) Call o_mdl.ReplaceLine(l_CrrentGyou, s_Text01) Next Next i End Sub ' 'Sub AllModuleChk02() ' ' Dim o_mdl As Module ' Dim i As Integer ' Dim i_mdlNm As Integer ' Dim l_AllGyousuu As Long ' Dim l_CrrentGyou As Long ' Dim s_Text01 As String ' ' ' ' i_mdlNm = Modules.Count - 1 ' '↑モジュールの指定は「Modules(0)」がスタートなので、 ' ' 最後のモジュールの指定は総数から1引いておく。 ' ' For i = 0 To 0 ' '↑各モジュールの中で1行ずつ処理 ' ' Set o_mdl = Modules(i) ' ' l_AllGyousuu = o_mdl.CountOfLines ' '↑すべての行数 ' ' l_CrrentGyou = 1 ' For l_CrrentGyou = 1 To l_AllGyousuu ' ' Debug.Print o_mdl.Lines(l_CrrentGyou, 1) ' '↑1行分をイミディエイト表示 ' ' s_Text01 = o_mdl.Lines(l_CrrentGyou, 1) ' Call o_mdl.ReplaceLine(l_CrrentGyou, s_Text01 & "") ' ' Next ' ' ' Next i ' ' 'End Sub ' ' ' |
★02:自ファイルのコードの置換。関数化したもの。でもまだ全行上書き。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
' ' Sub AllModuleReplace01(s_SearchWord01 As String, s_RepWord01 As String) Dim o_mdl As Module Dim i As Integer Dim i_mdlNm As Integer Dim l_AllGyousuu As Long Dim l_CrrentGyou As Long Dim s_Text01 As String ' Dim s_SearchWord01 As String ' Dim s_RepWord01 As String '置換語句の設定 ' s_SearchWord01 = "" ' '↑検索語句(置換対象の語句) ' ' s_RepWord01 = "" ' '↑置換内容としての語句 i_mdlNm = Modules.Count - 1 '↑モジュールの指定は「Modules(0)」がスタートなので、 ' 最後のモジュールの指定は総数から1引いておく。 For i = 0 To i_mdlNm '↑各モジュールの中で1行ずつ処理 Set o_mdl = Modules(i) l_AllGyousuu = o_mdl.CountOfLines '↑すべての行数 For l_CrrentGyou = 1 To l_AllGyousuu ' Debug.Print o_mdl.Lines(l_CrrentGyou, 1) '↑1行分をイミディエイト表示 s_Text01 = o_mdl.Lines(l_CrrentGyou, 1) s_Text01 = Replace(s_Text01, s_SearchWord01, s_RepWord01, , , vbBinaryCompare) Call o_mdl.ReplaceLine(l_CrrentGyou, s_Text01) Next Next i End Sub ' ' |
★03:他のファイルを置換するかたちに修正。でもまだ全行上書きのまま。
全行上書きのままなので、少し遅い。
また、(01)~(03)のコードは、複数のaccdbを連続で処理すると、
メモリ不足エラーになるかもです。ご注意ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
' ' Sub AllModuleReplace02(s_SearchWord01 As String, s_RepWord01 As String, s_FullPath01 As String) Dim o_mdl As Module Dim i As Integer Dim i_mdlNm As Integer Dim l_AllGyousuu As Long Dim l_CrrentGyou As Long Dim s_Text01 As String ' Dim s_SearchWord01 As String ' Dim s_RepWord01 As String '置換語句の設定 ' s_SearchWord01 = "" ' '↑検索語句(置換対象の語句) ' ' s_RepWord01 = "" ' '↑置換内容としての語句 ' Stop Dim AnotherAccApp As Access.Application Set AnotherAccApp = GetObject(s_FullPath01) AnotherAccApp.Visible = True i_mdlNm = AnotherAccApp.Modules.Count - 1 '↑モジュールの指定は「Modules(0)」がスタートなので、 ' 最後のモジュールの指定は総数から1引いておく。 For i = 0 To i_mdlNm '↑各モジュールの中で1行ずつ処理 Set o_mdl = AnotherAccApp.Modules(i) l_AllGyousuu = o_mdl.CountOfLines '↑すべての行数 For l_CrrentGyou = 1 To l_AllGyousuu ' Debug.Print o_mdl.Lines(l_CrrentGyou, 1) '↑1行分をイミディエイト表示 s_Text01 = o_mdl.Lines(l_CrrentGyou, 1) s_Text01 = Replace(s_Text01, s_SearchWord01, s_RepWord01, , , vbBinaryCompare) Call o_mdl.ReplaceLine(l_CrrentGyou, s_Text01) Next Next i ' Stop ' AnotherAccApp.DoCmd Save AnotherAccApp.Quit acQuitSaveAll End Sub ' ' |
★Excelの場合
Excelの場合、同じようなことをするのは、以下のコードです。
(関数化してない場合、です。)
Accessの場合とちょっと違うのでご注意ください。
また、Accessの最初の関数のように「他のファイルの」、
ということではなく、自ファイル(xlsm)のみの書き換えです。
まだ未完成なので。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
' ' Option Explicit '特定の文字列の付加 'ここでは「'★★」を全行の末尾に付加している。 Sub ExcelAllModuleWordPlus01() Dim o_mdl As Object Dim i As Integer Dim i_mdlNum As Integer Dim l_AllGyousuu As Long Dim l_CrrentGyou As Long Dim s_txtstr As String i_mdlNum = ThisWorkbook.VBProject.VBComponents.Count '↑モジュールの指定は「Modules(0)」がスタートなので、 ' 最後のモジュールの指定は総数から1引いておく。 For i = 1 To i_mdlNum '↑各モジュールの中で1行ずつ処理 Set o_mdl = ThisWorkbook.VBProject.VBComponents(i).CodeModule l_AllGyousuu = o_mdl.CountOfLines '↑すべての行数 ' l_CrrentGyou = 1 For l_CrrentGyou = 1 To l_AllGyousuu Debug.Print o_mdl.Lines(l_CrrentGyou, 1) '↑1行分をイミディエイト表示 s_txtstr = o_mdl.Lines(l_CrrentGyou, 1) ' Stop Call o_mdl.ReplaceLine(l_CrrentGyou, s_txtstr & "'★★") ' ’★★' Next Next i End Sub '置換するコード 'ここでは「'★★」を「」に置換している=消している。 Sub ExcelAllModuleReplace01() Dim o_mdl As Object Dim i As Integer Dim i_mdlNm As Integer Dim l_AllGyousuu As Long Dim l_CrrentGyou As Long Dim s_Text01 As String Dim s_SearchWord01 As String Dim s_RepWord01 As String '置換語句の設定 s_SearchWord01 = "'★★" '↑検索語句(置換対象の語句) ’★★' s_RepWord01 = "" '↑置換内容としての語句 i_mdlNm = ThisWorkbook.VBProject.VBComponents.Count '↑モジュールの指定は「Modules(0)」がスタートなので、 ' 最後のモジュールの指定は総数から1引いておく。 For i = 1 To i_mdlNm '↑各モジュールの中で1行ずつ処理 Set o_mdl = ThisWorkbook.VBProject.VBComponents(i).CodeModule l_AllGyousuu = o_mdl.CountOfLines '↑すべての行数 ' l_CrrentGyou = 1 For l_CrrentGyou = 1 To l_AllGyousuu Debug.Print o_mdl.Lines(l_CrrentGyou, 1) '↑1行分をイミディエイト表示 s_Text01 = o_mdl.Lines(l_CrrentGyou, 1) s_Text01 = Replace(s_Text01, s_SearchWord01, s_RepWord01, , , vbBinaryCompare) Call o_mdl.ReplaceLine(l_CrrentGyou, s_Text01) Next Next i End Sub ' ' |
- 投稿タグ
- AccessVBA, Accessの独学, Access操作の基礎, ExcelVBA, Excel連携VBA, マクロ, モジュールVBA, モジュールVBEditor, 独学, 自動化