2017-02-14 12 views
2

一時ファイルにコードを書き込まずに文字列内にあるvbaコードを実行しようとしています。 exempleについてはVBAは文字列内のコードを実行します

:私は評価し、評価を試してみました

Dim code As String 
code = "n = 0 : e_i_e = 0 : For e_i_e = 0 To 100 : n+=1 : Next" 

、ファイル名を指定して実行、executeGlobalと

Set VBComp = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) 
    VBComp.Name = "NewModule" 
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("NewModule").CodeModule 
    With VBCodeMod 
     LineNum = .CountOfLines + 1 
     .InsertLines LineNum, _ 
     "Sub MyNewProcedure()" & Chr(13) & _ 
     code & Chr(13) & _ 
     "End Sub" 
    End With 
    Application.Run "MyNewProcedure" 

が、これらのすべての新しいモジュールを追加するには、( '=エラーを返している

ありがとうございます!

+1

どのようなエラー? – BruceWayne

+3

あなたのコードはC#である必要があります。 'n = n + 1'にする必要があります。 –

+1

@ Nathan_SavまたはVB.NET –

答えて

1

モジュールを作成し、文字列からサブを挿入することができます。実際、開発者がvbaコードをリポジトリに配置する方法の1つは、モジュールから文字列としてコードを抽出し、使用しているバージョン管理ソフトウェアから読み込むことです。あなたは「vbext_ct_StdModule」と入力すると、何が起こるはず

Sub make_module_sub_and_run(): 
    Dim strMacro As String 
    Dim myModule As VBComponent 

    Set myModule = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) 
    strMacro = "Public Sub exampleSub()" & vbCrLf & _ 
       " n=0" & vbCrLf & _ 
       " For e_i_e = 0 to 100:" & vbCrLf & _ 
       " n=n+1" & vbCrLf & _ 
       " Next" & vbCrLf & _ 
       " MsgBox(""Hello World. Oh and n="" & n)" & vbCrLf & _ 
       "End Sub" 

    myModule.CodeModule.AddFromString strMacro 
    Application.Run myModule.Name & ".exampleSub" 

End Sub 

注意することをことをされています。ここでは

があなたの探しているものを行うための完全な例です(新しい独立したモジュールで、あなたのサブをしたいと仮定した場合)あなたがそれをロードしたいかどうかを尋ねるでしょう - もちろん、あなたはそれを行います。

また、実行時にモジュール名に意図的に接頭辞が付いていることにも注意してください。 - それ以外の場合は、同じ名前のサブモジュールで新しいモジュールを作成し、 1つを実行する。

3

あなたのコードはC#であり、それはである必要があります

4

プロジェクトをコンパイルした後に生成されたコードを中断することはできません。そのため、有効なコンパイル可能なコードを使用して動的モジュールを構築する必要があります。

Sub MyNewProcedure() 
    n = 0 : e_i_e = 0 : For e_i_e = 0 To 100 : n+=1 : Next 
End Sub 

なぜだけではなく、そのスニペットを取り、どこかに貼り付け、VBEは文句ものを見る:あなたのコードは次のようになりしようとしていることF5ボタンを打つ前に、あなたがを知っ

Compile error: syntax error

うわー。それで、同じコード行で半ダースの命令を詰め込むのは悪い考えです。もしそれが1行につき1つの命令だったら、どちらが壊れているのか不思議ではありません。

As was already mentionedn += 1は、VBA構文ではありません(特にC#構文でもありません)。 VBAの値をインクリメントすると現在の値にアクセスする必要があるため、n = n + 1

ne_i_eがどこから来ているのかは不明です。両方が地元の人なら、あなたの手続きは本質的に何も成し遂げません。 nMyNewProcedureの外部に宣言されている場合は、ByRefパラメータとして渡すか、それを完全に残して、Functionという結果を呼び出しコードのnに割り当てます。私はあなたが達成しようとしている一体何思ってしまう

Function MyNewFunction() As Long 
    MyNewFunction = 100 
End Function 

:つまるところ

Sub MyNewProcedure(ByRef n As Long) 
    Dim i As Long 
    For i = 0 To 100 
     n = i 
    Next 
End Sub 

生成されたコードにバグがある場合は、VBEのデバッガが生成されたコードをブレークさせないため、文字列でデバッグする必要があります。これはコードを生成することが非常に重要であることを意味します読み取り可能で維持可能な方法で現時点ではコード内に実際に生成された完全なコードが明確な文字列で表示されていません。InsertLinesコール内でインラインで連結されています。

は考えてみましょう:

Dim code As String 
code = "'Option Explicit" & vbNewLine & _ 
     "Public Sub MyNewProcedure()" & vbNewLine & _ 
     " n = 0" & vbNewLine & _ 
     " e_i_e = 0" & vbNewLine & _ 
     " For e_i_e = 0 To 100" & vbNewLine & _ 
     "  n = n + 1 ' fixed from n += 1" & vbNewLine & _ 
     " Next" & vbNewLine & _ 
     "End Sub" & vbNewLine 
'... 
'Debug.Print code 
.InsertLines LineNum, code 

それが戻ってデバッグ中に完全なコードを取得するためにはるかに簡単だし、検討し、同様に修正する方がはるかに簡単。連鎖できる線の数には限界があることに注意してください。

0

エンfaitがレコード

n+=1 

C'étaitがらJE NE peux PASルdivulguerルコードリールEST賢明、L'exempleを注ぎます。私はあなたの恋人の恋人です。

J'ai doncessayéラproposée:

Sub make_module_sub_and_run(): 
    Dim strMacro As String 
    Dim myModule As VBComponent 

    Set myModule = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule) 
    strMacro = "Public Sub exampleSub()" & vbCrLf & _ 
       " n=0" & vbCrLf & _ 
       " For e_i_e = 0 to 100:" & vbCrLf & _ 
       " n=n+1" & vbCrLf & _ 
       " Next" & vbCrLf & _ 
       " MsgBox(""Hello World. Oh and n="" & n)" & vbCrLf & _ 
       "End Sub" 

    myModule.CodeModule.AddFromString strMacro 
    Application.Run myModule.Name & ".exampleSub" 

End Sub 

のCa fonctionneのメルシー! "Microsoft Visual Basic for Extensibility Library"を参照してください。 dans outils - >Référence

merci!

関連する問題