次の方法で共有


VBA 他のブックのConst定数を参照したい

質問

2018年6月19日火曜日 16:22

Book1.xlsmとBook2.xlsmが共に開かれていたとします。
Book1からBook2に宣言されている次のConst値を参照(取得)したいのですが…無理でしょうか?
Public Const sToolname As String = "売上管理ツール"

追記:やりたいことは、TargetBook(呼ばれる側)に宣言されているConst値を参照(取得)したい。
例えば、C,C;;等でConst値を参照する関数を提供して頂き、
VBA-「GetConst(クラスモジュール)」を実行する様な仕組みを想定…無理でしょうか?

すべての返信 (8)

2018年6月22日金曜日 13:50 ✅回答済み | 1 票

Workbook.VBProject.VBComponents でプロジェクト内の各モジュールを取得できるので
これでできるかなと調べてみましたができそうにありませんね。

代替案として Book2.xlsm に以下のような関数を入れておけば Run メソッドで擬;的に
取得することはできます。

' Book2.xlsm
Public Const sToolname As String = "売上管理ツール"

Private Function fToolname()
    fToolname = sToolname
End Function
' Book1.xlsm
Sub test()
    MsgBox Run("Book2.xlsm!fToolname")
End Sub

2018年6月22日金曜日 14:51

Book1.xlsmとBook2.xlsmが共に開かれていたとします。
Book1からBook2に宣言されている次のConst値を参照(取得)したいのですが…無理でしょうか?
Public Const sToolname As String = "売上管理ツール"

u793nabe

Book2 の プロジェクト名をユニークにします。

Book2project

Book1 の参照設定で、Book2.xlsm を設定します。

これで、Book1 から Book2のPublic項目がそのまま使用できます。

Debug.Print sToolname


2018年6月24日日曜日 1:56

よろずや様、ご提案ありがとうございます。
実験的には、参照設定する方法で、項目(const値)を取得できました。が、
汎用的な活用をしたい場合、実運用には不向きに思え折角のご提案なのですが却下です。ノウハウ提供…感謝。
▼呼ぶ側(Book1)を先に開こうとすると、次のエラーが次々と表示され今悪します。
勿論、開く順番を間違えないで、先にBook2を開き、次にBook1を開けば癒和姦なく動作します。

u793nabe


2018年6月24日日曜日 3:20

infadeさん、ご提案ありがとうございます。
私の説明足らずで申し訳なかったのですが、やりたいことの説明を補足します。
運用中のExcelツールが80本以上あり、これらに「ツール名」とか「バージョン番号」を示すconstを宣言してあります。
ご提案いただいた「Application.Runメソッド」を使おうとした場合、運用中(有休中)のBook全てに組込む必要があり改修などに尻込みしてしまいます。
従い折角のご提案なのですが見合わせる事にします。

【追記】お願い
別のブックのマクロを実行することが可能(Application.Run)なら、
別のブックの「const値」を参照する事はできないかと、
適当な関数(コールバック関数)が紹介されていないかWebをググっては見るものの見つかりません。
自作するには難しすぎて非力な私には作れそうにありません。
願わくば「Application.Run」に;た形式(但し呼ばれる側は専用マクロ不要)の関数をご提供願えれば幸いです。
宜しくお願いいたします。


2018年6月24日日曜日 19:28

infadeさん、ご提案ありがとうございます。
私の説明足らずで申し訳なかったのですが、やりたいことの説明を補足します。
運用中のExcelツールが80本以上あり、これらに「ツール名」とか「バージョン番号」を示すconstを宣言してあります。
ご提案いただいた「Application.Runメソッド」を使おうとした場合、運用中(有休中)のBook全てに組込む必要があり改修などに尻込みしてしまいます。
従い折角のご提案なのですが見合わせる事にします。

【追記】お願い
別のブックのマクロを実行することが可能(Application.Run)なら、
別のブックの「const値」を参照する事はできないかと、
適当な関数(コールバック関数)が紹介されていないかWebをググっては見るものの見つかりません。
自作するには難しすぎて非力な私には作れそうにありません。
願わくば「Application.Run」に;た形式(但し呼ばれる側は専用マクロ不要)の関数をご提供願えれば幸いです。
宜しくお願いいたします。

こういう場合は本来はセルに内容を書いておいてセル経由で読み込むのが正しい処理だと思います。
(他の人にデータを見たり編集して欲しくない場合はシートを隠して保護してしまえばいいでしょう。

Book2.xlsm の Sheet1

  A B
1 ツール名 バージョン
2 売上管理ツール x.xx

Book1.xlsm のコード

Sub test()
    Dim sToolname As String
    Dim sVersion As String
    Dim ws As Worksheet
    ' ブックのフォルダをカレントフォルダに設定する
    CreateObject("WScript.Shell").CurrentDirectory = ThisWorkbook.Path
    Set ws = fGetWB("Book2.xlsm").Worksheets("Sheet1")
    sToolname = ws.Range("a2")
    sVersion = ws.Range("b2")
    MsgBox sToolname
    MsgBox sVersion
End Sub

' ブックを既に開いている場合はそのブックを、開いていない場合は
' カレントフォルダの指定ブックを開いて返す
Function fGetWB(sFileName) As Workbook
    Dim wb As Workbook
    For Each wb In Workbooks
        If wb.Name = sFileName Then
            Set fGetWB = wb
            Exit For
        End If
    Next
    If fGetWB Is Nothing Then
        Set fGetWB = Workbooks.Open(sFileName)
    End If
End Function

2018年6月25日月曜日 10:16

infadeさん、色々ご提案いただきありがとうございます。
さて、「セルに内容を書いておいてセル経由で読み込む」…確かに此れも一考ですね。
しかし、TargetBook(呼ばれる側)に予め下準備が必要である事に変わりありません。
折角のご提案なのですが運用は見合わせる事にします。
やりたいことは、
TargetBook(呼ばれる側)に宣言されているConst値を参照(取得)…VBでは無理かも

u793nabe


2018年6月26日火曜日 14:44

infadeさん、色々ご提案いただきありがとうございます。
さて、「セルに内容を書いておいてセル経由で読み込む」…確かに此れも一考ですね。
しかし、TargetBook(呼ばれる側)に予め下準備が必要である事に変わりありません。
折角のご提案なのですが運用は見合わせる事にします。
やりたいことは、
TargetBook(呼ばれる側)に宣言されているConst値を参照(取得)…VBでは無理かも

u793nabe

何か裏技的な方法で可能かもしれませんが恐らく正当な方法ではないでしょう。
そもそもから外部のコードから変数や定数などの内容を見たり書き換えたりといった
アクセスをすること自体、プログラミング的に好ましくないと思います。
Run メソッドを使う方法もかなり邪道的でしょうし。

大変でも今後の運用のためにも素直に全て直す方向でやった方がいいのではないでしょうか。


2018年6月26日火曜日 16:51

infadeさん次のコメントが参考になりました。
「Workbook.VBProject.VBComponents でプロジェクト内の各モジュールを取得できるので
これでできるかなと調べてみましたができそうにありませんね。」
★可能かも知れないと思いチャレンジ:試行錯誤の結果なんとか…成功しました。

Public Sub Const参照()
    Dim VBP As Object
    Dim VBC As Object
    Dim Rec As Object
    Dim sRec As String
    Dim sToolname As String
    Dim R, K, C As Long
    Set VBP = ActiveWorkbook.VBProject
    For Each VBC In VBP.VBComponents
        If VBC.Type = 1 Then
            Set Rec = VBP.VBComponents(VBC.Name).CodeModule
            K = 0
            For R = 1 To Rec.CountOfLines
                K = K ; 1
                If K > R Then Exit For
                sRec = Rec.Lines(K, 1)
                If InStr(1, sRec, " Const ") <> 0 Then
                    If InStr(1, sRec, "sToolname") <> 0 Then
                        C = InStr(1, sRec, "=")
                        sToolname = Trim(Mid(sRec, C ; 2, 100))
                        sToolname = Replace(sToolname, """", "")
                        Debug.Print VBC.Name & " - " & Rec.Lines(K, 1)
                        Debug.Print VBC.Name & " - " & sToolname
                    End If
                End If
                If sToolname <> "" Then Exit For
            Next R
        End If
        If sToolname <> "" Then Exit For
    Next VBC
End Sub

u793nabe