2022年8月10日水曜日

【VBA】定数でオブジェクト名を指定して使う

シート名だと不安要素しかないのでオブジェクト名で出来るように解決したい。

定数としてオブジェクト名を無理やり実装した。

どうしてもシートモジュールに定数を書く必要があった。


その定数は文字列で別のシートモジュールのオブジェクト名を表している。

挙動はSheetType1Inputシートでボタンを押すとSheetType1Logに出力される。

要するに、SheetType1InputとSheetType1Logを関連づける必要があるが、グローバル変数で関連性を定義したくない。

文字列をVBAコードとして実行する必要がある。

下記を参考にしたが、モジュールの追加削除でウィンドウフォーカスが外れて使いにくい。

https://tooljp.com/language/VBScript/faq/E8380BA06EBCCF4E492582E700517660.html


ので改良した。

空のモジュール(ModuleTemp)を先に追加しておく事。


<Excelのセキュリティ設定>

エラー400または以下が出るとき

実行時エラー 1004「プログラミングによる Visual Basic プロジェクトへのアクセスは信頼性欠けます」


ファイル>オプション>トラストセンター(またはセキュリティ)>トラストセンターの設定>マクロの設定

・すべてのマクロ にチェック

・VBAプロジェクト オブジェクト モデルへのアクセスの信頼 にチェック




<SheetType1Input シートモジュール内>

Const LOG_SHEET = "SheetType1Log"

Function asdasd()
    code = "Set target_sheet = " & LOG_SHEET        'target_sheetはグローバル変数
    Call ExecuteStringAsCode_kai(code)
    target_sheet.Cells(2, 2).Value = "ASD"
End Function



<標準モジュール内>

Public target_sheet '定数代入用

'===== 文字列変数の内容をコードとして評価して実行する関数です。

Public Sub ExecuteStringAsCode_kai(code As String)

    Dim vbComp As Object

    Set vbComp = ThisWorkbook.VBProject.VBComponents("ModuleTemp")

    '===== 関数を定義 =====

    vbComp.Codemodule.AddFromString "Sub tempFunc" & vbCrLf & code & vbCrLf & "End Sub"

    '===== コードを実行 =====

    Application.Run vbComp.name & ".tempFunc"

    Dim line_head, line_foot

    line_head = vbComp.Codemodule.ProcStartLine("tempFunc", 0)

    line_foot = vbComp.Codemodule.ProcCountLines("tempFunc", 0)

    vbComp.Codemodule.DeleteLines line_head, line_foot

End Sub


0 件のコメント:

コメントを投稿