計算に使用するXLAがあり、それらの計算で使用する変数をNameManagerで作成したいと思います。rangedという名前の値がすでに存在するかどうかを確認し、存在しない場合は、ユーザーに値を割り当てさせたいと思います。Name Managerの設定に使用しているSub()があります-以下の例-:
Public Sub SetNames()
On Error Resume Next
IsRangeName = CheckName("test")
If IsRangeName = Empty Then
Application.ThisWorkbook.Names.Add Name:="test", RefersTo:=0
End If
End Sub
「マクロ」メニューに移動してSetNamesルーチンを実行すると、それが機能し、名前マネージャーでtest = 0に設定されます。
しかし、私がやりたいのは、これを関数で実行し、関数が名前マネージャーで変数を使用できるようにすることです。変数が存在しない場合、それらの値は名前マネージャーで初期値に設定されます。サブルーチン。
次のコードを実行しようとすると、名前マネージャーに値が設定されません。
Sub Function1()
Call SetNames()
-Do Other Things-
End Function
すべての名前はグローバル変数として宣言されています。
その目的は、ユーザーにアドインをインストールさせ、アドインを使用した最初の関数呼び出しで、名前を初期化するか、ユーザーが初期値を設定できるようにするために、NameManagerが設定されるようにすることです。ユーザーがマクロリボンオプションを実行し、サブルーチンを実行して名前マネージャー名を初期化することを望まない。
これに関するどんな助けもいただければ幸いです。
これは私のクイックテストでは機能するようですが、最終的なユースケースが何であれ、確実に機能するはずです。これは、UDFがブックを更新できるという制限を回避するためのハックであるため、「通常の」使用法の範囲外です。
Sub SetNameIfMissing(swb As String)
Dim r As Name, wb As Workbook
Set wb = Workbooks(swb)
On Error Resume Next
Set r = wb.Names("test")
On Error GoTo 0
If r Is Nothing Then
Debug.Print "adding name..."
wb.Names.Add "test", 99
Else
Debug.Print "already added"
End If
End Sub
Function SetIt(v)
Dim wb
wb = Application.Caller.Parent.Parent.Name
'using Evaluate gets around the UDF restriction
Application.Caller.Parent.Evaluate "SetNameIfMissing(""" & wb & """)"
SetIt = "OK" 'or whatever return value is useful...
End Function
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加