2016-06-16 14 views
2

私は、Eval()を使ってMainに保存されている関数をいくつか取得し、それらをSheet2の値で評価しようとしています。これまでのMainと純粋なテキストの静的な参照は機能しますが、相対的なセルを参照する際に問題があります。別のシートから現在のシートとして式を評価する

理想的には、メインワークシートは静的参照と相対参照を結合し、その列の下の関数を表の行に適用します(この例ではA7、A8、...)。一重引用符はSQLを形成するためのものです。ここで実装しようとしている関数の1つです。

=CONCATENATE(Main!$B$30, "'", A7, "', '", B7, "', '", C7, "', '", D7, "', '", E7, "', '",F7, "', '",G7, "', '",H7, "', '",I7, "', '",J7, "', '", K7, "', ",$B$4,Main!$B$35) 

問題は自分のEval関数にあると思います。アクティブシートのセル値としてA7を評価していません。私は、CurrentSheet!A7のような機能に変更する方法を検討していましたが、適切な構文を見つけることができませんでした。

Function Eval(Ref As Range) 
    Dim shCurrent As Worksheet: Set shCurrent = ActiveSheet 
    Application.Volatile 
    Application.ThisCell.Parent.Activate 
    Eval = Application.ThisCell.Parent.Evaluate(Ref.Formula) 
    shCurrent.Activate 
End Function 

は私がメイン!$ E $ 5はそれでExcel上記の機能を有する細胞であるところの私のテーブルの列を下にコピーし、このようにSheet2の中に、この評価関数を参照しています。

=EVAL(Main!$E$5) 

ANSWER

私はbwynの例を取っ​​て、私の使用のためにそれを修正。これは、上記のExcel機能がVB関数のように見えるようになったことです。行番号をパラメータとして送信すると、呼び出し関数が最も一般的になり、スプレッドシートのマスターは必要に応じて1つの場所で「A」と「K」の値を拡張できます。

Function EvalInsert(rowNum As Integer) 
    Dim shCurrent As Worksheet: Set shCurrent = ActiveSheet 
    Dim shMain As Worksheet: Set shMain = Sheets("Main") 
    Dim insertClose As String: insertClose = "'));" 
    Dim openParen As String: openParen = "'" 
    Dim closeParen As String: closeParen = "', " 
    Application.Volatile 

    Set insertOpen = shMain.Range("B30") 
    Set tableId = shMain.Range("B33") 
    Set TableName = shCurrent.Range("B1") 
    Set insertValues = shCurrent.Range(Cells(rowNum, "A"), Cells(rowNum, "K")) 

    EvalInsert = insertOpen.Value 

    For Each c In insertValues.Cells 
    EvalInsert = EvalInsert & openParen & c.Value & closeParen 
    Next 

    EvalInsert = EvalInsert & tableId & TableName & insertClose 

End Function 

私はあなたのCONCATENATE式

=EvalInsert(ROW()) 

答えて

1

を使用して、このと呼ばれる、それだけでA7の変更と思われます。これが当てはまる場合は、Eval関数を次のように書き直すことができます。

Function Eval(currShRelRefStr As Range) 
    Dim shCurrent As Worksheet, shMain As Worksheet 
    Dim mainRng As Range, currShRelRef As Range, currShStaticRef As Range 
    Dim aStr As String 

    Set shCurrent = ActiveSheet 
    Set shMain = Sheets("Main") 

    Set mainRng = shMain.Range("B30") 
    Set currShRelRef = shCurrent.Range(currShRelRefStr.Value) 
    Set currShStaticRef = shCurrent.Range("B3") 
    aStr = "a string" 

    Eval = mainRng.Value & aStr & currShRelRef.Value & currShStaticRef.Value 

End Function 
+0

フィードバックありがとうございました!私は実際にCONCATENATEをかなり単純化しました。それは約10の変化する細胞を有する。私のオリジナルのCONCATENATEは "= CONCATENATE(Main!$ B $ 30、" '"、A7、"'、 ""、B7、 "'、" "、C7、"'、 ""、D7、 "'、'"、 「I7」、「I7」、「J7」、「 '」、「K7」、「K7」、「K7」、「K7」、 "、"、$ B $ 4、Main!$ B $ 35) "と表示されます。私は複数の数式を持っていますが、必要に応じてすべての関数を作成しています。私はこれを反映するために私のメインポストを更新しました、混乱のために申し訳ありません。 – Danielle

+1

長い方の式では、行のみが変更されます。行番号を入力し、関心のある範囲(A7:K7)を選択し、セルをループして連結文字列を構築することができます。 – bwyn

+0

これを試してみます。 :)私はExcelのVB式にはかなり新しいです、私は成功した場合私は戻って報告します。 – Danielle

関連する問題