【Excel】ユーザ定義関数はワークシートの値を変更できない【VBA】

昔はまったことがあるので、自分用にメモしておきます。

鏑川と上信電鉄

ユーザ定義関数の制約

Excel のユーザー定義関数の制限について

公式が↑に書いてあるとおりです。

でも実際に使ってみるまで気が付きませんでした。

はまった事例

Option Explicit
Dim P1 As String
Dim P2 As String
Function GetD(Rng As Range) As Double
P1 = "高"
P2 = "○"
Call test
GetD = WorksheetFunction.DCountA(Rng, 1, Range("A1:B2"))
End Function
Public Sub test()
With ActiveSheet
    .Range("A1").Value = "優先度"
    .Range("B1").Value = "判定"
    .Range("A2").Value = P1
    .Range("B2").Value = P2
End With
End Sub

上記のような、何の変哲もないワークシートの値を書き換えるtest()があったとします。

test()単体ではうまくいくけど、ユーザ定義関数GetDから呼び出すと、testは機能しません。

Excelのユーザ定義関数の制約によるものなんですが、気が付くまでしばらく時間がかかりました。

このほかにもフォントの色を変えるとか、ワークシートの名前を変えるとかもできません。