kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

kaz_javaSpringBootプログラム作成ツールのエクセルVBAをVBに変えてエクセルの外に出す。

エクセルVBAがNGな会社が多いし、マイクロソフトVBAに対するアナウンスがあるので、
kaz_javaSpringBootプログラム作成ツールのエクセルVBAを、VBに変えてエクセルの外に出すための調査を始めた。
■2日目
やっと、「javaSpringBootテーブル項目一覧などの定義.xlsm」にあるマクロの一つを、なんとなくエラーが出ない程度にVB.netで作った。VBAVB.netコンバートどうだろう。そこそこいいとこまで作れそう。
マクロ1つというのは、「コード一覧表」シートを書き換えて、ほかのシートに移動する時起きるエクセルのVBAイベントで行っている。「コード一覧表」シート内容のチェックと「★TOOL用コンスタント★」のL列(コードID一覧)への反映ロジック。VBAマクロのイベントを取得できないのでユーザーの当ツールの使い勝手はよくなくなるのだけど、時代の流れなので、しかたない。
①作っている画面

VBAからVBへの置換の主なもの

-----------------------------------------------------------------------------------------------------------------
String(増加タブ数, vbTab)
↓
New String(vbTab, 増加タブ数)
----------------------------------------------------------------------------------------------------------------
Open(MyPath & MyName) For Input As #FileNumber
↓
FileOpen(FileNumber, (MyPath & MyName), OpenMode.Input)
----------------------------------------------------------------------------------------------------------------
Line Input #FileNumber, lineData
↓
lineData = LineInput(FileNumber)
----------------------------------------------------------------------------------------------------------------
Close #FileNumber
↓
FileClose(FileNumber)
----------------------------------------------------------------------------------------------------------------
IsNull
↓
IsDBNull
-----------------------------------------------------------------------------------------------------------------
Round
↓
Math.Round
-----------------------------------------------------------------------------------------------------------------
Set FSO = CreateObject("Scripting.FileSystemObject")
↓
プロジェクト→COM参照の追加→“Microsoft Scripting Runtime”を参照に追加追加して、
Dim fs As Scripting.FileSystemObject
Dim rfile As Scripting.TextStream, wfile As Scripting.TextStream
fs = New Scripting.FileSystemObject()
-----------------------------------------------------------------------------------------------------------------
Set テーブルID達マップ = CreateObject("Scripting.Dictionary")
↓
Dim テーブルID達マップ As New Dictionary(Of String, String)()
または、プロジェクト→COM参照の追加→“Microsoft Scripting Runtime”を参照に追加して、
Dim Join親テーブル達マップ As Scripting.Dictionary
Join親テーブル達マップ = New Scripting.Dictionary
Join親テーブル達マップ.Add("a", "aaa")
If Join親テーブル達マップ.exists("a") Then
    MsgBox(Join親テーブル達マップ.item("a"))
End If
-----------------------------------------------------------------------------------------------------------------
テーブルID達マップ.Add Trim(LCase(Dst2.Cells(constコード一覧表開始行 + i, constコード一覧表コードテーブルID列))), _
                Trim(LCase(Dst2.Cells(constコード一覧表開始行 + i, constコード一覧表コードテーブルID列)))
↓
If Not テーブルID達マップ.ContainsKey(Trim(LCase(コード一覧表コードKEY項目ID列Val))) Then
    テーブルID達マップ.Add(Strings.Trim(LCase(コード一覧表コードテーブルID列Val)),
                            Strings.Trim(LCase(コード一覧表コードテーブルID列Val)))
End If
-----------------------------------------------------------------------------------------------------------------
If テーブルID達マップ.exists(Trim(LCase(Dst2.Cells(constコード一覧表開始行 + i, constコード一覧表コードKEY項目ID列)))) Then
↓
If テーブルID達マップ.ContainsKey(Trim(LCase(コード一覧表コードKEY項目ID列Val))) Then
---------------------------------------------------------------
№
↓
NO
---------------------------------------------------------------
 i = i + 1
↓
 i += 1
---------------------------------------------------------------
Dst2.Cells(\([^)]*)\)
↓
DirectCast(Dst2.Cells$1), Excel.Range).Text.ToString
---------------------------------------------------------------
Dst1.Cells(\([^)]*)\)
↓
DirectCast(Dst1.Cells$1), Excel.Range).Value
---------------------------------------------------------------
Left
↓
Strings.Left
---------------------------------------------------------------
Set テーブルID達マップ = CreateObject("Scripting.Dictionary")
↓
Dim テーブルID達マップ As New Dictionary(Of String, String)()
---------------------------------------------------------------
・・・
↓
Dim DoXL As Excel.Application
---------------------------------------------------------------
・・・
↓
Dim DoWB As Excel.Workbook
---------------------------------------------------------------
・・・
↓
Dim DoSheets As Excel.Sheets
---------------------------------------------------------------
Dim Dst1 As Worksheet
↓
Dim Dst1 As Excel.Worksheet
---------------------------------------------------------------
Dim Rng As Range
↓
Dim Rng As Excel.Range
---------------------------------------------------------------
On Error GoTo コードID一覧定義更新ErrorHandler
・・・
コードID一覧定義更新ErrorHandler:
    ・・・
    Error Err.Number
↓
Try
・・・
Catch ex As Exception
    ・・・
    Throw
Finally
    ・・・
End Try
---------------------------------------------------------------

③エクセルの COM オブジェクトは開放しないといけないらしい。
例:

コード一覧表コード値列Val = DirectCast(Dst2.Cells(constコード一覧表開始行 + i, constコード一覧表コード値列),Excel.Range).Text.ToString

なんていうのはダメ(直接見てるとCOM オブジェクトを解放できない)で、

Dim xlCells As Excel.Range = xlSheet.Cells
Dim xlRange As Excel.Range
xlRange = DirectCast(xlCells(constコード一覧表開始行 + i, constコード一覧表コード値列), Excel.Range)
コード一覧表コード値列Val = xlRange .Text.ToString
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells )

のようにCOM オブジェクトを設定した都度解放しないといけないってネットに出ている。
・・・面倒だな~。 Excel.Application、 Excel.Workbook、Excel.Sheets、xcel.WorksheetはCOM オブジェクトを設定した都度解放するようにする。しかし、Excel.Rangeはこのままのコーディングにしておいて、メモリーの負荷を見てから考えよう・・・

■2021/06/21から、『kaz_javaSpringBootプログラム自動作成◎自動生成ツール』をVectorに載せています。2022年にZenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
Vector
www.vector.co.jp
・Zenn本(SpringBoot、Thymeleaf プログラム自動作成(マクロ使用版))
zenn.dev