20

セルの内容は次A1のとおりです。関数は次のとおりです。=test(2)test

Function test(ByRef x As Double) As Double
  Range("A2") = x
  test = x * x
End Function

なぜこれが細胞に与えられ#VALUE!、細胞A1に何も与えられないのか説明できますA2か?A2私は含む2A1含むことを期待してい4ました。行がないとRange("A2") = x、関数は期待どおりに機能します(セルの値を2乗します)

本当に紛らわしいのはtest、サブルーチンでラップすると、calltestそれが機能することです。

Sub calltest()
  t = test(2)
  Range("A1") = t
End Sub

Function test(ByRef x As Double) As Double
  Range("A2") = x
  test = x * x
End Function

しかし、これはしません

Function test(ByRef x As Double) As Double
  Range("A2") = x
End Function
4

4 に答える 4

11

Functionシートセルを変更または設定できないという基本事項が原因です。次の行を削除する必要がありますRange("A2") = x

編集いくつかの追加のリンク(UDFトピックを分析したい人のために提供するのに常に役立つと私は信じています):Microsoftによるカスタム関数の作成

于 2013-03-27T13:19:32.700 に答える
9

はい、数式に入力したセルだけでなく、任意のセルに値を書き込む独自のユーザー定義関数を使用できます。

これが簡単な例です。UDF関数は、2つの引数AとBを取り、それらの積A*Bを返します。しかし、興味深いことに、数式を入力したセルのすぐ右側にある隣接するセルに結果が返されます。

このコードを標準のVBAモジュールに入れます。

Function UDF_RectangleArea(A As Integer, B As Integer)
    Dim MagicSpell As String
    MagicSpell = "Adjacent(" & Application.Caller.Offset(0, 1).Address(False, False) & "," & A & "," & B & ")"
    Evaluate MagicSpell
    UDF_RectangleArea = "Hello world"
End Function

Private Sub Adjacent(CellToChange As Range, A As Integer, B As Integer)
    CellToChange = A * B
End Sub

B2次に、数式を入力します。=UDF_RectangleArea(3,4)

ここに画像の説明を入力してください

この関数は、結果を2つのセルに返します。「Helloworld」B2(これは驚くことではありません)との長方形の領域C2(これは帽子をかぶったウサギです)です。結果と「ウサギ」の外観の場所の両方を簡単にカスタマイズできます。このジョブは、VBAEVALUALTEコマンドによって実行されます。MagicSpellこの場合、変数の値はAdjacent(C2,3,4)、UDFの結果が返される前にUDF内から起動されるようになります。楽しむ!

于 2019-03-19T09:54:53.130 に答える
7

ワークシートのセルから関数を呼び出すと、その関数をユーザー定義関数として効果的に使用できます。これには、次のような制限があります。

http://support.microsoft.com/kb/170787

本文には次の行があります。

環境の変更は、VisualBasicサブルーチンを使用して行う必要があります。

彼らが「しなければならない」ではなく「すべき」という言葉をどのように使用するかは興味深い。KBの作成者は、環境の変更がVBA関数から発生する可能性があることを知っていたのでしょうか。

これで、別のVBAサブ/関数から関数を呼び出すと、処理が異なります。ヘルプドキュメントから(申し訳ありませんが、Webページの参照が見つかりませんでした-基本的に、VBEでは、関数という単語を強調表示してF1キーを押します):

Subプロシージャと同様に、Functionプロシージャは、引数を取り、一連のステートメントを実行し、その引数の値を変更できる別個のプロシージャです。ただし、Subプロシージャとは異なり、関数によって返される値を使用する場合は、Sqr、Cos、Chrなどの組み込み関数を使用するのと同じ方法で式の右側にあるFunctionプロシージャを使用できます。 。

したがって、関数が呼び出し元の関数/サブに値を返すことができることを除いて、Subと関数はVBAでのみ使用された場合に同じことを実行できるように聞こえます。

実際、Excelは、Excelの環境に対してある種の「読み取り専用」制限のある関数を呼び出すことができるため、これは非常に興味深いものです。

結局、ExcelはVBAとは異なる方法でワークシートセルから関数を呼び出すことができると思います。セルから呼び出すと、ユーザー定義関数と見なされます。これには、Excelの環境の変更に関する制限が含まれます。VBA内から呼び出された場合(一連の呼び出しからの元の呼び出し元がVBAからである場合)、Subが持つすべての機能に加えて、値を返すことができます。

于 2013-03-27T14:30:00.943 に答える
0

私はあなたのコードを文字列や関数、そして私が望む間にある他のもの(まだテスト中)で機能するように調整しました。

テストの結果として多くの質問がありますが、最初に2つ頭に浮かびます。

パラメータを実行/処理し、目的の結果を返すために他にどのような方法を使用できますか。

a。私がやったようにb。私がやったようにではありません(つまり、違ったやり方で)。

これを可能にし、これを実現するのを支援してくれたRick RothsteinMrExcelMVPおよびSOに関する他の多くの人々に感謝します。

Function MOVEME27(a As Variant, b As Variant, Optional CELLR As Variant, Optional cellq As Variant) '21/05/2018 works copied to ar4' 03/06/2019 23:30 was cellr as range , cellq as range - changed to variants
 Dim WTVR1 As Variant '' ''20/05/2019'' '09/06/2019 Code by S Tzortzis/David Wooley
 Dim WTVR2 As Variant
 Dim P As String
 Dim P1 As String
 Dim bb As String
 Dim bb1 As String
 Dim A1 As Long
 Dim A2 As Long

 Dim c As String

 'x' a = Evaluate(a)
P = Chr(34) & a & Chr(34)
P2 = Chr(34) & [P] & Chr(34)

bb = Chr(34) & b & Chr(34)
bb1 = Chr(34) & [bb] & Chr(34)

c = Chr(34) & CELLR & Chr(34)
f = Chr(34) & callq & Chr(34)


'P2 = Chr(34) & "'''" & [P] & "'''" & Chr(34)
'p1 = Chr(34) & p & Chr(34)

''WTVR1 = "MOVEUS1(" & Application.Caller.Offset(0, 2).Address(False, False) & "," & Chr(34) & P2 & Chr(34) & "," & b & ")"
   WTVR1 = "MOVEUS11h(" & Application.Caller.Offset(0, 2).Address(False, False) & "," & [P2] & "," & [bb1] & ")"
Evaluate WTVR1


WTVR2 = "MOVEUS22h(" & Application.Caller.Offset(0, 1).Address(False, False) & "," & [P2] & "," & [bb1] & ")" ' used or be adjacent - maybe redo rhat pr put a GO TO sub. '' ''20/05/2019''

Evaluate WTVR2

A1 = cellq.Row
A2 = cellq.Column

CELLRR = Chr(34) & CELLR & Chr(34)
CELLRR1 = Chr(34) & [CELLRR] & Chr(34)
cellqq = Chr(34) & cellq & Chr(34)
cellqq1 = Chr(34) & [cellqq] & Chr(34)


''wtvr3 = "CopyFrom.Parent.Evaluate CopyOver234h(" & c & "," & f & ")" ''''20190531 1929
wtvr31 = "MOVEUS33h(" & Application.Caller.Offset(A1 - ActiveCell.Row + 1, A2 - ActiveCell.Column).Address(False, False) & "," & [CELLRR] & "," & [cellqq] & ")"

    Evaluate wtvr31

MOVEME27 = "Hello world       " & " / " & WTVR1 & " / " & WTVR2 & "\\\\\/////" & wtvr31 & "\\\\\/////---" & ActiveCell.Row - A1 & "//////---" & ActiveCell.Column - A2

' DO AS WHATVER = "MOVEUS3(" APPLICATION.CALLER.OFFSET(THE ROW & COLUMN IE CELL         YOU REFERENCES IN a as variant (copy from)'
    'with ="" in sub 30052019 19:28

    'CopyFrom.Parent.Evaluate "CopyOver2(" & CELLR.Address(False, 1) & "," &              CELLR.Address(False, False) & ")"  ''''2019050 1929



    End Function

    Private Sub MOVEUS11h(CELL1 As Range, G1 As Variant, G2 As Variant)

        '[ak333] = a


        CELL1 = Chr(34) & G1 & Chr(34) & "B" & "//" & G2


    End Sub


    Private Sub MOVEUS22h(CELL2 As Range, G3 As Variant, G4 As Variant)

        CELL2 = Chr(34) & G3 & Chr(34) & "<>" & G4

    End Sub

    '' with chr(34) arond the p's and a's in sub or fucntion changes behavior. thinking of doing if a is string, then a=x , x as string, if not kep as variant
    ''27/05/2019 :(

    '''''30/05/2019 .....'''''''


    '------------------------------------------------------------------------------- ADD THIS 30052019 -------------------------------
    'private sub Movus3(cellfrom as range, cellto as range)
    'End Sub

    Private Sub moveus33h(cell3 As Range, CopyFrom As Variant, copyTo As Variant) ''''2019050 1929 ''' 03062019 change ema back to as Range here. :)
       '' copyTo.Value = CopyFrom.Value ''''2019050 1929

       ''CopyFrom.Value = ""

       cell3 =  CopyFrom  'Chr(34) & CopyFrom & Chr(34)

    End Sub ''''2019050 1929
于 2019-06-09T13:37:48.720 に答える