Posible saber qué libro de trabajo llamó a una función en un complemento de Excel (XLA)
-
29-10-2019 - |
Pregunta
Quiero escribir una pequeña función de registro en un complemento Excel que llamaré desde muchos libros diferentes.Me gustaría poder llamarlo, pasando solo el texto del registro, y la función de registro en sí misma podría manejar la marca de tiempo, workbookname , etc.
Sin embargo, no puedo usar este LOOKBOOK O TO ACTIVEWORKBOOK para determinar qué libro de trabajo fue responsable de realizar la llamada, ya que este Libro de trabajo devolverá una referencia al complemento en sí mismo, mientras que el código VBA se ejecuta en un libro de trabajo que no sea el libro de trabajo con enfoque activoEn Excel podría hacer la llamada, pero el libro de ActiveWorkBook devolverá el que se centra en la ventana.
Application.Caller parecía una posible solución, pero parece que esto parece funcionar solo cuando se llama la función de una celda, no de VBA.
es lo que estoy tratando de hacer imposible?
Actualización
Según> 1 persona, esto es, de hecho, es imposible.Si alguien le sucede a una solución inteligente, por favor hablan.
Solución
Bien, habiendo leído la pregunta correctamente, intentaré de nuevo ...
Entonces, para exponer el problema:
desea una rutina escrita en un complemento, que cuando se llame desde vba en otro libro de trabajo pueda determinar (entre otras cosas) qué libro de trabajo contiene el vba que realizó la llamada, sin tener que pasar esta información explícitamente.
Como se ha dicho, esto no es posible (esta es una pregunta similar a acceder a la pila de llamadas desde el código: algo que yo sepa no es posible)
Sin embargo, casi puedes conseguir lo que quieres así
Declare su función de registro de esta manera:
Sub MyLogger(wb as Workbook, LogText as String)
Dim CallerName as String
CallerName = wb.name
' your code...
End Sub
Entonces, donde sea que llame al subuso
MyLogger ThisWorkbook, "Log Text"
No es tan bueno como no pasar nada, pero al menos siempre es lo mismo
Otros consejos
Para obtener el nombre del libro de trabajo que realiza la llamada, use
Application.Caller.Worksheet.Parent.Name
Application.Caller devuelve información sobre cómo se llamó a Visual Basic.Si se llama desde una función personalizada ingresada en una sola celda, se devuelve un objeto Range que especifica esa celda
Habiendo obtenido una referencia a la celda, .Worksheet.Parent.Name le da el nombre del libro
Tenga en cuenta que Application.Caller devolverá otras cosas dependiendo de cómo se llame a su función (consulte la ayuda de VBA para obtener más detalles)
En una función de complemento llamado por una conjunta de la hoja de trabajo de Excel, la llamada entró en la función, encuentro que "aplicar.caller.parent.name" le da el nombre de la hoja (nombre de la pestaña, no el número de hoja).
Tuve el mismo problema al codificar una función personalizada.La función funciona bien, pero en cualquier momento se calcula o se activa otro libro de trabajo, todas las celdas usando esa función vuelven a #Value.Puede ser muy frustrante cuando se trabaja con múltiples archivos usando esta fórmula.
Para obtener el libro de trabajo que utilicé:
Dim CallingWb As Workbook
Set CallingWb = Application.Caller.Parent.Parent
Esto debería funcionar si su función está en una celda.
demasiado tarde para la publicación original, pero podría ayudar a otros!