2

myFunction(),セルにコンテンツを書き込むVBA 関数を作成したいと思います。計算が完了すると、書き込まれたすべてのデータが消去されます。(セルから呼び出したい=myFunction())コンテンツをクリアするには、次の行を最後に追加して、終了する前にクリーンアップします。

ActiveSheet.Range("$A$1:$B$9").ClearContents

問題は、何もクリアしないことです。ただし、上記の行をサブルーチンに入れて、そのサブルーチンをボタンに割り当てると、ボタンをクリックするとコンテンツがクリアされることに気付きました。

プログラム「Microsoft Visual Basic」のウィンドウからコードを実行すると(再生ボタン付き)、コードは完全に機能します(コンテンツはクリアされます)が、セルから関数を呼び出すとクリーニング部分が機能しませんもう。コードは次のとおりです。

Function myFunction()
  ActiveSheet.Range("$A$1:$B$9").Clear
End Function

セルをクリックして と入力する=myFunction()と、範囲 $A$1:$B$9 のコンテンツがクリアされません。ただし、(関数の代わりに) サブルーチンを作成し、それをボタンで呼び出すと、コンテンツはクリアされます。

myFunction() によって呼び出されたときに機能しないのはなぜですか? どうすればこれを解決できますか?

4

2 に答える 2

6

myFunction() によって呼び出されたときに機能しないのはなぜですか?

ワークシートから呼び出された関数は、ワークシート上のオブジェクトを操作できません。関数が呼び出されたセルに値を返すことしかできません。これは、循環参照と無限ループを防ぐためだと思います。

抜け穴は、サブルーチン内から呼び出された関数がワークシート オブジェクトを操作できることですが、これはおそらく良い習慣ではありません。

ベスト プラクティスとして、サブルーチンを使用してオブジェクトを操作し、関数はシートまたはサブルーチンに値を返すためだけに使用します。

どうすればこれを解決できますか?

上記の@Santoshの答えは、うまくいくはずです。

于 2013-04-28T13:12:52.553 に答える
4

UDF の代わりにイベントを使用できます。以下のコードを任意のシート コード セクションに配置してください。

UDF の制限事項

 Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    Application.EnableEvents = False

    If Not Intersect(Target, Range("$A$1:$B$9")) Is Nothing Then

        ' your code here
        Range("$A$1:$B$9").Clear
    End If

    Application.EnableEvents = True

End Sub

上記のコードは回避策のようなものです。Range("A1:B9") の値が Excel インターフェイスから変更されたときにトリガーされます。

ワークシート セル内の数式によって呼び出されるユーザー定義関数は、Microsoft Excel の環境を変更できません。これは、そのような関数が次のいずれも実行できないことを意味します。

  • スプレッドシートでセルを挿入、削除、または書式設定します。
  • 別のセルの値を変更します。
  • ワークブックにシートを移動、名前変更、削除、または追加します。
  • 計算モードや画面ビューなどの環境オプションを変更します。
  • ブックに名前を追加します。
  • プロパティを設定するか、ほとんどのメソッドを実行します。

詳細については、以前に提供されたリンクを参照してください。 ここに画像の説明を入力

于 2013-04-28T12:52:40.920 に答える