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.

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top