2011-08-02 23 views
6

Algunos antecedentes: Para un proyecto en el que estoy trabajando (construir un DOM XML a partir de una hoja de cálculo de Excel dada de datos de clientes), necesito poder leer el contenido de celda con una fecha y hora en ella. La celda en cuestión contiene "7/22/2011 0:00" y cuando hago clic con el botón derecho en-> formatear las celdas, me dice que la categoría es "Personalizada" (no en la categoría de fecha estándar), y de tipo "m"/d/aaaa h: mm ". Sin embargo, cuando selecciono la celda, el panel de fórmula lo muestra como "7/22/2011 12:00:00 AM". Por lo tanto, estos tres intentos de categorizar los tipos de datos no coinciden.Problema al leer celdas de Excel que contienen fecha y hora en VBA

El problema: Cuando mostrar el contenido de la celda utilizando ActiveWorkbook.ActiveSheet.Cells (x, y) en un MsgBox para propósitos de depuración, que sólo muestra 7/22/2011 (cortando el tiempo). No puede ser el espacio entre la fecha y la hora que lo arroja, ya que estoy leyendo correctamente las celdas con espacios en ellas en otra parte de la hoja de cálculo.

¿Alguien puede decirme por qué sucede esto, o apuntarme en la dirección correcta para un método VBA/Excel que no haga este corte extraño que Sheet.Cells (x, y) está haciendo? Gracias. Si solo tuviera un centavo por cada fecha, los tipos de datos me causaron problemas ...

+1

Puede haber una diferencia entre el valor de una celda y lo que se muestra. Si el valor de la celda se ingresó solo el 22/7/2011 (sin componente de tiempo) pero la celda está formateada para mostrar la hora, entonces esto tendría sentido. En el caso del cuadro de mensaje, no está haciendo ningún formato, solo mira el valor "en bruto", por lo que solo obtiene la fecha ... Si desea el valor mostrado, utilice ActiveSheet.Cells (x, y) .Text –

Respuesta

11

Internamente, las fechas Excel almacena como números. No implementa un tipo de fecha. El número es el número de días desde algún punto en el pasado (1900 o 1904, dependiendo del sistema de operación, con algunos errores incorporados con respecto a los años bisiestos). El tiempo se representa como la parte fraccional del número.

Para que parezca una fecha para el usuario, debe asignarle a la celda un formato de fecha. Luego, el número se muestra como una fecha en la celda. (Excel asigna un formato de fecha automática al introducir tantos que se parece a una fecha a Excel.)

Cuando se utiliza ActiveWorkbook.ActiveSheet.Cells(x,y), se crea un objeto Range y llamar a su propiedad por defecto, que es Value. Value tiene mucha magia incorporada. En su caso, mira el formato de la celda y, al ver un formato de fecha, convierte el número almacenado internamente en Variant de la fecha del subtipo. Cuando lo muestra usando un cuadro de mensaje, el siguiente truco sucede. Si la hora es 0:00, la fecha se convierte en una cadena sin tiempo. Si el tiempo fuera diferente de 0:00, se convertiría a una cadena con fecha y hora. El formato de fecha se toma de la configuración de su usuario. Es independiente del formato de fecha que ha asignado a la celda de Excel.

Si utiliza Value2 en lugar de Value (por ejemplo, mediante el uso de una caja messag para mostrar ActiveWorkbook.ActiveSheet.Cells(x,y).Value2), entonces usted verá la representación interna de la fecha, es decir un número.

Cuando edita una celda, Excel usa otro formato de fecha para que pueda ver y editar todas las partes de la fecha: año, mes, día y posiblemente hora, minutos y segundos. Esto se debe a que el formato de fecha de su celda podría estar restringido solo al nombre del mes.

Otra complejidad se agrega por la internacionalización. Ciertos formatos de fecha no se aplican directamente, pero son una sugerencia para usar un formato de fecha de la configuración actual del usuario.Entonces el formato primero se reemplaza con otro formato de fecha y luego se aplica. Además, ciertas partes de los formatos de fecha y hora se ven afectadas por la configuración del usuario. Y finalmente, los patrones del formato de fecha están traducidos (en inglés, yyyy significa el año, en alemán es jjjj). Cuando se guarda la hoja de cálculo de Excel, estos formatos se almacenan en el formato en inglés para que la hoja pueda abrirse mediante instalaciones de usuario y de Excel con cualquier idioma. En su caso, la internacionalización probablemente afecte el formato de fecha utilizado cuando edita la celda (poner el mes anterior al día y usar la visualización de 12 horas con AM/PM se parece a América del Norte).

No entiendo por qué Excel muestra "7/22/2011 12:00:00 AM" (en lugar de "22/07/2011 0:00:00 AM"). Estoy bastante seguro de que su fecha/hora tiene una parte de tiempo de "0:00". Pero el número interno (como lo revela el Value2) le dirá con seguridad.

+1

+ 1 para la explicación clara. –

+0

Gran explicación y exactamente lo que estaba buscando, probé esto al ingresar otra fecha y hora con un componente de tiempo y terminó mostrándose bien, así que no hubo ningún problema después de todo jaja. Solo estaba truncando la hora de la medianoche porque supongo que son todos ceros para sobresalir. ¡Gracias! –

3

Es como una fórmula, en la celda se mostrará el resultado, en la barra de fórmulas se mostrará la fórmula. La celda que puede formatear, la barra de fórmulas no puede. Así que puedes cambiar el formato de la celda a como quieras que se vea.

lo tanto, si desea dar formato al MsgBox entonces usted tendría que hacer lo siguiente:

MsgBox (Format(ActiveWorkbook.ActiveSheet.Cells(x,y), "m/d/yyyy h:mm")