4

次の操作を行うためのボタンをリボンに追加するExcel.xlamファイルがあります。

  1. ActiveSheetをスキャンして、事前に設定されたパラメーターを確認します
  2. ソーステキスト(文字列値、VBAモジュールに直接ハードコードされている)を取得し、指定された領域を手順1で取得したパラメーターに置き換えます。
  3. 計算されたテキストを含むファイルを生成します

ソーステキストはパスワードで保護でき、.xlamファイルがある場所に別のファイルをドラッグする必要がないため、この方法で保存します。ソーステキストは、次のような「ソース」と呼ばれる別のモジュールに保存されます(ヒアドキュメントがないことをVBAに感謝します)。

'Source Module
Public Function GetSource() As String
    Dim s As String
    s = ""

    s = s & "This is the first line of my source text" & vbCrLf
    s = s & "This is a parameter {par1}" & vbCrLf
    s = s & "This is another line" & vbCrLf

    GetSource = s
End Function

関数は正常に動作します。私の問題は、ソーステキストを更新したい場合、.xlamファイルで手動で更新する必要があることです。私がやりたいのはSub ImportSource()、ファイルを解析する別のモジュールでのようなものを構築し、プログラムで「ソース」モジュールを再構築してから、そのモジュールを計算されたソースコードに置き換えることです。私が知らないのは、モジュールのソースコードを文字列変数の値に置き換えるかどうか/方法です。

それは、最悪の場合のメタプログラミングのようなものであり、哲学的には、これを自分の核心まで行うことに反対しています。しかし、実際には、それを行うかどうか、そしてその方法を知りたいと思います。

4

3 に答える 3

5

私は今、あなたが本当にやりたいことは、VBAにアクセスできる方法でドキュメントにいくつかの値を格納することですが、それはスプレッドシートのユーザーには読めないことだと気づきました。ワークシートの名前付き範囲に値を格納するというCharlesWilliamsの提案に従い、ユーザーに値へのアクセスを許可したくないという懸念に対処するには、文字列を暗号化する必要があります...

これを行うための「適切な方法」はこの記事で説明されていますが、かなりの作業です。

はるかに短いルーチンがここにあります。ハードコードされたキーを使用した単純なXOR暗号化を使用するだけですが、「ほとんどの目的」には十分なはずです。キーはマクロに「隠されている」ため、詮索好きな目にはアクセスできません(まあ、簡単ではありません)。

これで、この関数を使用してencrypt(string)、文字列をスプレッドシートの値に変換できます。

range("mySecretCell").value = encrypt("The lazy dog jumped over the fox")

そしてあなたがそれを使う必要があるとき、あなたは使う

Public Function GetSource()
    GetSource = decrypt(Range("mySecretCell").value)
End Function

XORバージョン(2番目のリンク)を使用し、同じ機能encryptdecryptなる場合...

それはあなたのニーズをよりよく満たしていますか?

于 2013-02-11T15:07:17.970 に答える
5

@brettdjがすでにcpearson.com/excel/vbe.aspxへのリンクで指摘しているように、 VBA拡張性ライブラリを使用してプログラムでVBAモジュールのコードに変更できます。これを使用するには、VBAエディターの[ツール] ->[参照]でライブラリを選択します。トラストセンターのオプションも変更して、[ Excelのオプション] - >[トラストセンター]- >[トラストセンターの設定] ->[マクロの設定] -> [ VBAプロジェクトオブジェクトモデルへのアクセスを信頼する]を選択する必要があることに注意してください。

次に、次のコードのようなものがその仕事をするはずです:

VBIDE.CodeModuleとしてのプライベートmCodeMod

サブUpdateModule()
    Const cStrModuleName As String = "Source"

    VBIDE.VBProjectとしてVBProjを暗くする
    VBIDE.VBComponentとしてVBCompを暗くする

    VBProj = Workbooks( "___ YourWorkbook __")。VBProjectを設定します

    'モジュールを削除します
    VBProj.VBComponents.Remove VBProj.VBComponents(cStrModuleName)

    'モジュールを追加
    VBComp = VBProj.VBComponents.Add(vbext_ct_StdModule)を設定します
    VBComp.Name = cStrModuleName
    mCodeMod=VBComp.CodeModuleを設定します

    'プロシージャヘッダーを追加して開始します
    InsertLine "Public Function GetSource()As String"
    InsertLine "Dim s As String"、1
    InsertLine ""

    'テキストを追加
    InsertText ThisWorkbook.Worksheets( "Sourcetext")_
        .Range( "___ YourRange___")

    '手順を完了する
    InsertLine "GetSource = s"、1
    InsertLine「EndFunction」

サブ終了

Private Sub InsertLine(strLine As String、_
    オプションのIndentationLevelAsInteger = 0)
    mCodeMod.InsertLines _
        mCodeMod.CountOfLines + 1、_
        Space(IndentationLevel * 4)&strLine
サブ終了

Private Sub InsertText(rngSource As Range)
    範囲としてのDimrng
    Dim strCell As String、strText As String
    Dim i As Integer

    Const cLineLength = 60
    rngSource.Cellsの各rngについて
        strCell = rng.Value
        i = 0の場合Len(strCell)\ cLineLength
            strText = Mid(strCell、i * cLineLength、cLineLength)
            strText = Replace(strText、 "" ""、 "" "" "")
            InsertLine "s = s&" ""&strText& "" ""、1
        次の私
    次のrng
サブ終了
于 2013-02-11T22:49:58.407 に答える
1

プログラムで.basファイルを「エクスポート」および「インポート」できます。あなたが求めていることをするためには、それがアプローチでなければなりません。メモリ内のコードを変更することは不可能だと思います。この記事を参照してください

于 2013-02-11T12:37:41.523 に答える