2012-10-12 126 views
7

Actualmente estoy enfrentando un problema que me preocupa mucho. Espero que alguien pueda ayudarme. Trabajo para una gran empresa donde se usan Office 2007 (32 bits) y Office 2010 (64 bits). Escribir macros para ser compatible a través de toda la empresa fue una tarea difícil para mí (nunca antes había programado en VBA, en realidad este foro me ayudó mucho). Mi tarea es mantener una gran tabla en una hoja compartida de Excel. Hay varias macros y varias formas de usuario. Ahora voy a descartar el problema brevemente: La hoja contiene dos columnas con formato de fecha (fecha de inicio y fecha de cierre). Ambos valores se importan a la columna de los cuadros de texto del formulario del usuario (commandbutton almuerzos MsCal -exportado a la clase- que llena esos cuadros de texto con la fecha). Lo que simplemente necesito es tener el formato de fecha como mm/dd/aaaa en ambas columnas para realizar el filtrado y otras operaciones. Cuando el trabajador actualiza estos valores y utiliza una localización diferente a la inglesa, la fecha de los EE. UU. Se ingresa como dd.mm.aaaa. Eso hace que el filtrado apropiado basado en la fecha sea imposible. Traté de alterar el formateo por:Mismo formato de fecha en varias localizaciones

UserForm1.TextBox10.Value = Format(Calendar1.Value, "mm/dd/yyyy") 

pero este código se porta mal de alguna manera. En algunas máquinas funciona, en algunas de ellas no funciona. Y eso es lo que me está dando dolor de cabeza. ¿Cómo debo proceder ahora? ¿Hay alguna manera de forzar a Excel a usar el mismo formato de fecha en la hoja e ignorar la configuración de localización en Windows? Los empleados no desean cambiar la localización al inglés de los EE. UU. Porque están acostumbrados a su formato o lo necesitan para otras aplicaciones. ¿Hay alguna manera de cambiar temporalmente la localización solo cuando se abre esta hoja? Cualquier consejo será apreciado. Gracias de antemano Peter

+0

Una fecha en una celda de Excel debe ser una fecha y no una cadena. Si establece el formato de la celda en un formato de fecha precedido por un asterisco * (que suele ser las 2 primeras opciones en la opción Formato de celdas/fecha), la fecha cambiará al formato de fecha local del usuario. Sin embargo, la celda subyacente sigue siendo un número de serie que debe ser utilizable independientemente del formato. Si necesita ingresar fechas en un cuadro de texto o convertir cadenas a fechas, entonces ese es un asunto diferente y se requiere manejo adicional. Consulte http://stackoverflow.com/questions/12495504/how-to-convert-a-string-into-date/12497237#12497237 – user3357963

+0

@PeterT. En la tabla, la columna de fechas se formatea como texto o como fechas? – CaBieberach

+0

Formateado como Fecha – PeterT

Respuesta

1

Lo mejor que puede hacer NUNCA es transformar una variable de fecha en Texto.

Internamente para sobresalir, una fecha es solo un número consecutivo (a la izquierda del separador decimal están los días ya la derecha del separador decimal son las horas). Entonces, por ejemplo, el 10 de junio de 2012, para Excel es . Este valor de fecha es independiente del formato de fecha configurado en su computadora.

Ahora, cuando se trata de representar fechas (para que los humanos las visualicen) Excel formateará este valor interno en una cadena con el formato establecido en su computadora. Entonces, por ejemplo, si tiene el formato de fecha de los EE. UU. En su computadora, la fecha 41188 se formateará como 6/10/2012.

El gran desafío con las fechas es ingresar la fecha en el formato correcto.Cuando ingresa una Fecha como una cadena ("6/10/2012"), Excel lo interpretará según el formato de fecha configurado en su computadora. Si tiene el formato de EE. UU., Tendrá el primer cifrado como mes, el segundo como día y el último como el año. Si tiene un formato alemán, leerá el primero como día, el siguiente como mes y el último como año. Por lo tanto, la misma entrada ("6/10/2012") para un formato Excel de Estados Unidos leerá el 10 de junio, en cuanto a un formato alemán Excel leerá el 6 de octubre.

En su caso, NO debe formatear la fecha dentro del Textbox10. Para un formato de Excel en EE. UU. No hay problema, pero si tiene otro formato de fecha, donde la primera cifra es el día en lugar del mes, obtendrá los valores incorrectos: Verifique este ejemplo. Las entradas del usuario décimo de Junio ​​en un formato Excel alemán (dd.mm.aaaa)

  1. Calendar1.Value recupera un valor de fecha()
  2. Format(Calendar1.Value, "mm/dd/yyyy") transforma el valor de fecha en una cadena "06/10/2012 "
  3. Al usar la fecha formateada (STRING), Excel tendrá que interpretar qué fecha es. Como el formato de fecha de la computadora es alemán, se leerá Día: 06, Mes: 10, Año: 2012. Usted va a utilizar el día en lugar de

Si Calendar1.Value recupera una variable de fecha y le da a este variable de fecha en una columna de fecha formateada, se Allways conseguir el valle correcto en su columna y usted será ser capaz de filtrar y ordenar las fechas correctamente independientemente del formato de fecha establecido dentro de las celdas de columna o del formato establecido en la computadora de los usuarios.


Ahora, en su caso, lo mejor sería asignar directamente la Calendar1.Value a la celda requerida. Algo así como:

ThisworkBook.WorkSheets("Sheet1").Range("C3").Value= Calendar1.Value 

Todavía puede asign Calendar1.Value en el TextBox10 para el usuario para ver su selección, pero desactivar la TextBox10 por lo que la única opción de edición es el control de calendario. Y cuando se trabaja con la fecha, en lugar de hacerlo desde el TextBox10, tomándolo directamente del Calendar1.Value.

Si aún necesita mostrar el valor seleccionado de Calendar1 en un cuadro de texto, entonces NO formatee la fecha en el cuadro de texto. En su lugar, utilice:

UserForm1.TextBox10.Value = Cstr(Calendar1.Value) 

De esta manera, el usuario verá la fecha en el dateformat que él ha establecido en su ordenador y al que está acostumbrado.

+0

Muchas gracias. Este tipo de respuesta que he estado buscando. – PeterT

0

Una solución es no utilizar el formato de número de fecha, sino más bien sólo utilizan el formato personalizado para todas las fechas de su celda en la que se especifiquen "mm/dd/yyyy" como la cadena de formato. Sin embargo, en mi experiencia, si la configuración regional de su computadora está configurada para usar "mm/dd/yyyy", entonces, si intenta hacer un formato de celda personalizado con esta misma cadena, Excel se mantendrá como un dater vinculado a la configuración de la computadora para que no lo ayude. La forma en que trabajé en esto fue cambiar el formato de fecha en mi computadora, luego formatear las celdas como personalizadas "mm/dd/aaaa" y guardar (y luego volver las configuraciones de su computadora a como estaban). Ahora, aunque todavía sobresalga afirma que son celdas de fecha, verá que cambiar la configuración en su computadora no cambia el valor en la celda.

Supongo que otra forma es tener siempre una celda al lado de su celda de fecha que llama a la función de TEXTO. Entonces, si tiene una fecha en A1, entonces en otra celda =TEXT(A1, "mm/dd/yyyy") y solo se refiere a esta nueva celda. Pero eso podría hacer que su hoja de cálculo sea muy desordenada.

Supongo que la mejor solución es conseguir que el departamento de TI configure cada uno de los ajustes de fecha de la empresa para usar los mismos formatos.

+0

Dan, gracias por su respuesta. La cosa es que cambiar el formato de celda a personalizado provocaría el mal funcionamiento de otra macro que se usa para calcular métricas, pivotes, etc. Esta macro requiere que el formato de celda se configure en la fecha. Esta macro se lleva a cabo en otro sitio.Además, todo el archivo se actualiza de forma remota en base débil por programa, que establece el formato de las celdas a su estado predeterminado (establecido por programa). Si nada ayuda, supongo que tendré que contactar al departamento de TI como mencionas. Pero para ser honesto, me gustaría evitar ese escenario. – PeterT

+0

Por lo tanto, en conclusión, no puedo modificar la tabla (agregar/eliminar columnas/filas, cambiar el formato, etc.). Solo puedo alterar el código VBA que escribe datos en la tabla. – PeterT

+0

qué tal esto: UserForm1.TextBox10.Value = Worksheetfunction.Text (Calendar1.Value, "mm/dd/aaaa") – Dan