8

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

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

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

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

アップデート

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

4

4 に答える 4

4

さて、質問を正しく読んだら、もう一度やり直します...

したがって、問題を述べるには:

アドインで記述されたルーチンが必要です。このルーチンは、別のブックの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"

何も渡さないほど良くはありませんが、少なくとも常に同じです

于 2011-02-07T07:05:52.303 に答える
2

呼び出し元のブックの名前を取得するには、次を使用します

Application.Caller.Worksheet.Parent.Name

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

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

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

于 2011-02-06T06:58:45.513 に答える
0

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

于 2016-04-24T21:14:20.127 に答える
0

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

使用したワークブックを入手するには:

Dim CallingWb As Workbook
Set CallingWb = Application.Caller.Parent.Parent

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

元の投稿には遅すぎますが、他の人を助けるかもしれません!

于 2017-07-21T12:54:30.003 に答える