どのワークブックがExcelアドイン(xla)で関数を呼び出したかを知ることができます

StackOverflow https://stackoverflow.com/questions/4901148

質問

さまざまなワークブックから呼び出すExcelアドインに小さなロギング関数を記述したいと思います。ログテキストのみを渡すだけで呼び出すことができ、ログ関数自体がタイムスタンプやワークブック名などを処理できるようにしたいと思います。

ただし、ThisWorkbookまたはActiveWorkbookのいずれかを使用して、呼び出しの原因となったブックを特定することはできません。Thisworkbookはアドイン自体への参照を返すのに対し、VBAコードはアクティブフォーカスのあるブック以外のブックで実行されているためです。Excelで呼び出しを行うことはできますが、ActiveWorkbookはウィンドウにフォーカスがあるものを返します。

Application.Callerは可能な解決策のように見えましたが、これは関数がVBAからではなく、セルから呼び出された場合にのみ機能するようです。

私がやろうとしていることは不可能ですか?

更新

1人以上によると、これは実際には不可能です。誰かが賢い回避策を知っている場合は、声を上げてください。

役に立ちましたか?

解決

OK、それでは正しく質問を読んでもう一度やり直してください...

だから、問題を述べる:

Addinで書かれたルーチンが欲しい、別のブックのVBAから呼び出されたときに(他のものの中で)このワークブックに表示され、この情報を明示的に渡す必要なしに、その電話番号が含まれていないVBAが含まれています。

これは不可能です(これはコードからのコールスタックにアクセスするための似た質問です。

しかし、あなたはほとんどあなたがこのようにしたいものを手に入れることができます

このようなログ機能を宣言する:

Sub MyLogger(wb as Workbook, LogText as String)
    Dim CallerName as String
    CallerName = wb.name
    ' your code...
End Sub
.

それからあなたがサブ使用を呼び出すのところならどこでも

MyLogger ThisWorkbook, "Log Text"
.

何も渡していませんが、少なくともその常に同じ

他のヒント

呼び出し元のブックの名前を取得するには、を使用します ジェネラコディセタグプレ

Application.Callerは、VisualBasicがどのように呼び出されたかに関する情報を返します。単一のセルに入力されたカスタム関数から呼び出された場合、そのセルを指定するRangeオブジェクトが返されます

セルへの参照を取得すると、.Worksheet.Parent.Nameはブックの名前を示します

Application.Callerは、関数の呼び出し方法に応じて他のものを返すことに注意してください(詳細については、VBAヘルプを参照してください)

Excelワークシート配列の入力関数呼び出しによって呼び出されたアドイン関数で、「Application.Caller.Parent.name」がシート名(シート番号ではなくタブ名)を示していることがわかりました。

カスタム関数をコーディングするときに同じ問題が発生しました。関数は正常に機能しますが、別のブックが計算またはアクティブ化されると、その関数を使用するすべてのセルが#valueに戻ります。この数式を使用して複数のファイルを操作する場合、非常にイライラする可能性があります。

使用したワークブックを入手するには: ジェネラコディセタグプレ

これは、関数がセル内にある場合に機能するはずです。

元の投稿には遅すぎますが、他の人を助ける可能性があります!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top