jueves, 21 de septiembre de 2017

VBA: Los Separadores del Sistema en nuestras macros

Vamos a repasar unas propiedades de la aplicación, de Excel, que nos pueden ser útiles en diferentes ocasiones.
Por ejemplo, cuando trabajamos con nuestras macros en entornos internacionales y nuestros compañeros de trabajo emplean una configuración decimal-miles de sistema distinto al nuestro.


Veremos en concreto, y entre otras, las propiedades:
Application.UseSystemSeparators
Application.DecimalSeparator
Application.ThousandsSeparator


La propiedad Application.UseSystemSeparators activa o desactiva el uso de los separadores del sistema.
Mientras que los otros dos:
Application.DecimalSeparator
Application.ThousandsSeparator

permiten personalizar los caracteres a emplear tanto para el separador de miles como para el decimal...


Otra propiedad interesante es la que nos permite cambiar el estio de referencia de celdas entre A1 y F1C1, la propiedad en cuestión es:
Application.ReferenceStyle


En un módulo estándar de nuestro explorador de proyecto VBA insertamos el siguiente código:

Sub SeparadoresDelSistema()
'vemos en un mesnaje el estilo de referencia en este momento
Dim strEstilo As String
If Application.ReferenceStyle = xlA1 Then
    MsgBox "El estilo de referencia actual es A1"
Else
    MsgBox "El estilo de referencia actual es F1C1"
End If
'cambio de estilo de referencia a F1C1
Application.ReferenceStyle = xlR1C1

'componemos texto informativo con los separadores actuales de nuestro equipo
Dim strDecimal As String, strMiles As String
strDecimal = Application.International(xlDecimalSeparator)
strMiles = Application.International(xlThousandsSeparator)

MsgBox "Antes del cambio " & vbCrLf & _
    "El separador decimal actual es: " & strDecimal & vbCrLf & _
    "El separdor de miles actual es: " & strMiles

'Cambiamos los separadores del sistema
With Application
    'deshabilitamos los separadores
    .UseSystemSeparators = False
    'marcamos cuálkes son los separadores deseados
    .DecimalSeparator = "."
    .ThousandsSeparator = ","
End With

'componemos texto informativo con los separadores actuales
'tras el cambio en nuestro equipo
strDecimal = Application.International(xlDecimalSeparator)
strMiles = Application.International(xlThousandsSeparator)

MsgBox "Después del cambio " & vbCrLf & _
    "El separador decimal actual es: " & strDecimal & vbCrLf & _
    "El separdor de miles actual es: " & strMiles & vbCrLf & _
    "El estilo de referencia es: F1C1"

'para activar de nuevo los separadores del Sistema
Application.UseSystemSeparators = True

'retornamos al estilo de referencia a A1
Application.ReferenceStyle = xlA1
End Sub



En mi caso parto de una configuración con:
Separador de miles un punto .
Separador decimal una coma ,

Vemos en dos imágenes el cambio producido al ejecutar nuestra macro:

VBA: Los Separadores del Sistema en nuestras macros



Y en un otro paso:

VBA: Los Separadores del Sistema en nuestras macros

5 comentarios:

  1. Hola Ismael,
    Paso a saludarte y felicitarte por el trabajo que realizar.
    Quisiera saber en este caso, porque en los dos mensajes msgbox que haz lanzado, el separador decimal es "," y el separador de miles es "," ; No debería cambiar esto al ejecutar el procedimiento sub tanto en el mensaje como en la celda (6,3). Saludos desde Perú.

    ResponderEliminar
  2. Perdón quise decir :
    Separador decimal es "," y el separador de miles es "." .
    y en la celda (3,6)

    ResponderEliminar
  3. Hola! Existiría lo mismo para el formato de la fecha?? Gracias a este post he descubierto que tenia un problema en el codigo al pasarselo a otros usuarios de mi excel, que era por culpa de los separadores decimales, pero ahora tengo otro que es del formato de la fecha, ya que yo uso "dd-MMM-yy" y ellos "dd/mm/yy". Hay alguna forma para que el excel use siempre "dd/mm/yy"?

    ResponderEliminar
    Respuestas
    1. Hola!
      en realidad la configuración de las fechas es solo un tema de formato que se ajusta desde la configuración regional de tu sistema operativo (supongo Windows)...
      Si quieres tratar las fechas en 'igualdad de condiciones' puedes emplear CDate(celda_fecha), o incluso Clng(celda_fecha)

      Un saludo

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.