Jump to content
joselopezitot

Función contar sangría VBA

Recommended Posts

Hice una función que me ayude a contar la cantidad de sangría que tenga una celda o un texto, lo cual funciona, pero al colocar más sangrías no cuenta, es decir no se actualiza como cualquier formula...

Mi código actual es:

Public Function Extrae_Sangria(ByVal Rango_S As Range) As Byte
Extrae_Sangria = Rango_S.Cells(1).IndentLevel
End Function

Dejo mi archivo aquí para mejor entendimiento...Gracias de antemano.

SANGRÍA.xlsm

Edited by joselopezitot

Share this post


Link to post
Share on other sites

hay un "detalle" con ese tipo de funciones personalizadas:

NO existe (hasta la fecha) ningún evento en excel capaz de detectar un simple y solo cambio de formato en las celdas, es decir, para que el resultado de ese tipo de funciones se actualice al modificar el nivel de sangría de la celda-argumento sería necesario (RE)editar la entrada en la celda

o buscar la forma de forzar a un (RE)cálculo de la hoja incluyendo alguna función "volátil" (lo que podría resultar en "más caro el caldo que las albóndigas" ?)

saludos,
hector.

Share this post


Link to post
Share on other sites

Hola @joselopezitot tal como lo indica Héctor, excel no tiene forma de detectar un cambio en un formato, pero podemos valernos de algunos trucos como en tu caso donde insertas las sangrías con los botones de la cinta de opciones de excel.

Este truco funciona utilizando el "Custom IU Editor", lo que haremos es interceptar el evento al presionar los  botones para insertar o eliminar las sangrías para que ejecuten una macro y podamos re-calcular la hoja al presionar uno de estos 2 botones.

Adjunto el ejemplo, me comentas.

Saludos.

Copia de SANGRÍA.xlsm

Share this post


Link to post
Share on other sites

Aunque con "Application.Volatile" debería de ser suficiente... pero en mi Excel no lo REFRESCA...

Segunda opción... Presionar F9.

 

Algo "falla" a veces si se REFRESCA y a veces no, solo con "Application.Volatile" ???

Saludos.

Edited by Leopoldo Blancas

Share this post


Link to post
Share on other sites

Hola @joselopezitot, creo que no te entendí lo que querías.... yo entendi que no refrescaba la formula que contaba las sangrias de acuerdo a:

En 25/7/2018 at 21:07 , joselopezitot dijo:

Hice una función que me ayude a contar la cantidad de sangría que tenga una celda o un texto, lo cual funciona, pero al colocar más sangrías no cuenta, es decir no se actualiza como cualquier formula...

Yo no pensé que querías una forma de agregar o quitar sangría sin entrar a "Formato de Celda".

Lo bueno que para ti así esta bien.

Saludos.

Share this post


Link to post
Share on other sites
Hace 24 minutos , joselopezitot dijo:

funciona para cualquier FUNCIÓN en MACRO

por si fuera de utilidad...

1) el método SendKeys tiene sus bemoles...
a ) requiere seguridad de cual es la aplicación en primer plano
b ) el del objeto application alterna el estado de la tecla "numlock"
c ) sería mejor el del objeto createobject("wscript.shell").sendkeys

2) usar sendkeys "{f9}" tiene el mismo efecto que <...>.Calculate

3) modificar el nivel de indentación vacía la pila de niveles para un deshacer / undo / ctrl+Z

4) una alternativa menos costosa pudiera ser...
a) definir volátil la UDF (en un modulo de código estándar

Function Sangria(ByVal Ref As Range) As Byte
  Application.Volatile
  Sangria = Ref(1).IndentLevel
End Function

b) usar lo siguiente en el módulo de "esa" hoja (o adaptar a otros requerimientos)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  [a1].Calculate
End Sub

saludos,
hector.

Share this post


Link to post
Share on other sites
Hace 21 minutos , Héctor Miguel dijo:

por si fuera de utilidad...

1) el método SendKeys tiene sus bemoles...
a ) requiere seguridad de cual es la aplicación en primer plano
b ) el del objeto application alterna el estado de la tecla "numlock"
c ) sería mejor el del objeto createobject("wscript.shell").sendkeys

2) usar sendkeys "{f9}" tiene el mismo efecto que <...>.Calculate

3) modificar el nivel de indentación vacía la pila de niveles para un deshacer / undo / ctrl+Z

4) una alternativa menos costosa pudiera ser...
a) definir volátil la UDF (en un modulo de código estándar

Function Sangria(ByVal Ref As Range) As Byte
  Application.Volatile
  Sangria = Ref(1).IndentLevel
End Function

b) usar lo siguiente en el módulo de "esa" hoja (o adaptar a otros requerimientos)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  [a1].Calculate
End Sub

saludos,
hector.

@Héctor Miguel:

Con todo respeto: GRAN MAESTRO ME HAZ ILUMINADO UNA VEZ MAS...!!!

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.



×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png