2017-11-27 14 views
2

は、ここで私はそれが正常に動作して所望の結果を生成するオート()のサブを使用して、それを実行すると、私はExcel VBA:式として呼び出されるVBA関数の実行方法が異なりますか?

Option Explicit 

Function AutoFormula(blocks As Range, target As Range) 
    Dim blockedArr() As String 
    Dim cellValue As String 
    Dim ret As String 
    Dim i As Integer 

    'sprawdzenie zakresu 
    If (blocks.Cells.Count > 1) Then 
     AutoFormula = "Tylko 1 komórka jako parametr!" 
     Exit Function 
    End If 

    'wczytanie komorki 
    cellValue = blocks.Cells(1, 1).Value 

    'split 
    blockedArr = Split(cellValue, ",") 

    ret = "=WYSZUKAJ.PIONOWO(E7;$E$2:$G$5;3;FAŁSZ)" 

    For i = LBound(blockedArr, 1) To UBound(blockedArr, 1) 
     ret = ret + "+SUMA.JEŻELI(A7:A1000;" + blockedArr(i) + ";G7:G1000)" 
    Next i 

    target.Cells(1, 1).FormulaLocal = ret 

    AutoFormula = 1 
End Function 

Sub auto() 
    Call AutoFormula(Worksheets("reorganizacja").Range("D7"), Worksheets("reorganizacja").Range("G7")) 
End Sub 

を持っているマクロです。しかし、私が=AutoFormula(D7;G7)のような優れたセルで式と呼ぶと、それはうまくいきません。 Excellセルで#ARGエラーが発生します。私はマクロをデバッグするとき、それはtarget.Cells(1, 1).FormulaLocal = ret行まで正しく行き、私がそれを踏むと、それを完了せずにすぐに機能が壊れます。 アイデア

+0

エラーの前に 'debug.print ret'を書いて、直接ウィンドウに結果を共有してください。 – Vityata

+1

これは結果です: '= WYSZUKAJ.PIONOWO(E7; $ E $ 2:$ G $ 5; 3;FAŁSZ)+SUMA.JEŻELI(A7:A1000; 135; G7:G1000)'。数式は大丈夫です(サブを実行するとうまくいきます)。問題のある行を単純な文字列 'target.Cells(1,1).FormulaLocal =" john "'に置き換えてみました。結果は同じですので、 'ret'という値の問題のようには見えません。 – ilozen

答えて

5

UDFは、呼び出されたセルに値を返すだけで、セルの内容や書式を変更してはいけません。Excelの動作環境を変更してはいけません。何かを変更しようとすると、関数は直ちに終了し、#VALUEエラーを呼び出し元のセルに返します。 Source - Cpearson.com

あなたの場合、Excelの範囲引数の値を変更しようとしています。 targetが引数であり、target.Cells(1, 1).FormulaLocal = retによって、Excelに変更を依頼しています。他の言葉で


、あなたはUDFを通じてA1の価値を倍増することを想像してください。それを達成する方法は、この経由です:

Option Explicit 

Public Function DoubleArgument(a As Range) As Double 
    a = a * 2 
    DoubleArgument = a 
End Function 

Public Sub TestMe() 
    Debug.Print DoubleArgument(Range("A1")) 
End Sub 

しかし、上述したように、あなたはExcelで=DoubleArgument(A1)を実行するようならば、それはエラーとなり、UDFを通じてExcelの値を変更することはできません。あなたはパラメータを排除し、例を簡素化したい場合は


は、次のことを試してください。

Public Function Put5InA1() 
    Range("A1") = 5 
End Function 

Public Sub TestMe() 
    Debug.Print Put5InA1 
End Sub 

TestMe()がエラーを返しますA1とUDF =Put5InA1()5が生成されます。

+0

(マクロ自体のセルをハードコーディングせずに)与えられたセルの数式を変更するマクロを作成できますか? – ilozen

関連する問題