Excel UDF: 配列を返さずにセルを変更する
Excel では、ユーザー定義関数 (UDF) は通常、値または配列を返します。ただし、UDF が配列を返さずに他のセルを変更する必要があるシナリオもあります。これは、Windows タイマーと Application.OnTime イベントを含む複雑な手法によって実現できます。
問題:
入力として 2 年かかる New_years という名前の UDF を考えてみましょう。そして、それらの年の間の元旦の日付の配列を返します。ただし、Excel で配列に値を設定するには、ユーザーが手動でセルを選択し、数式を入力して、Ctrl Shift Enter を押す必要があります。この制限により、UDF は日付を自動的に入力できなくなります。
解決策:
セルを直接変更する UDF に対する Excel の制限にもかかわらず、Windows タイマーとアプリケーションを使用する回避策です。 OnTime イベントがそれを可能にします。 UDF 内から Windows タイマーを開始することで、後続の Application.OnTime タイマーをスケジュールして、UDF で禁止されるアクションを実行できます。
コード例:
次のコードは、UDF が呼び出されるセルの参照を保存するコレクションを使用してこの手法を実装する方法を示しています。 2 つのタイマー ルーチン、AfterUDFRoutine1 と AfterUDFRoutine2 は、タイマー イベントの処理に使用されます。
Public Sub AfterUDFRoutine1() ' Stop the Windows timer If mWindowsTimerID <> 0 Then KillTimer 0&, mWindowsTimerID ' Cancel any previous OnTime timers If mApplicationTimerTime <> 0 Then Application.OnTime mApplicationTimerTime, "AfterUDFRoutine2", , False End If ' Schedule timer mApplicationTimerTime = Now Application.OnTime mApplicationTimerTime, "AfterUDFRoutine2" End Sub Public Sub AfterUDFRoutine2() Dim Cell As Range ' ... Do tasks not allowed in a UDF ... End Sub
使用法:
この手法を適用するには、UDF (例: AddTwoNumbers) ) は通常のモジュール内で作成できます。 UDF 内でタイマー ルーチンが開始され、呼び出し元のセルのセル参照がコレクションに格納されます。その後、タイマー ルーチンは、UDF のスコープ外で必要なセルを変更します。
Windows タイマーと Application.OnTime イベントを活用することで、配列を返さずにセルを変更する UDF を作成することが可能になります。この手法により、自動化の向上が可能になり、ユーザーが手動で配列を埋める必要がなくなりました。
以上が配列を返さずに Excel UDF のセルを変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。