2012-04-04 38 views
8

En Excel VBA, Range("A1").Value debe devolver el valor subyacente del rango A1 en la hoja de trabajo. Pero obtengo un valor diferente si la celda tiene el formato de Contabilidad.Excel VBA: obtener el valor de la celda, independientemente del formato de la celda

¿Cómo obtengo el valor subyacente real de la celda?

Hoja de trabajo

hacer un nuevo documento, introduzca los siguientes valores en las células:

  • A1: 0,00001
  • A2: = A1
  • A3: = A1 = A2

Como era de esperar, A3 resulta en TRUE. Ahora cambie el formato de A2 a Contabilidad, usando 2 decimales. A2 ahora lee $ 0.00, pero el valor subyacente sigue siendo 0.00001, por lo que A3 sigue siendo TRUE.

VBA

Haga un nuevo módulo y añadir en la siguiente función:

Function f(addr As String) 
    f = Range(addr).Value 
End Function 

Como se puede ver, esto sólo se pone el valor de un rango utilizando el método del objeto RangeValue .

Hoja de

Volver a la hoja de trabajo. Introduzca los valores siguientes:

  • B1: = f ("A1")
  • B2: = f ("A2")
  • B3: = B1 = B2

A1 y A2 tienen el mismo valor subyacente, pero B1 y B2 no, aunque ambos se calculan utilizando el método Value de A1 y A2.

La expresión en A3() está accediendo al valor subyacente real de A1 y A2. ¿Cómo accedo a estos valores en VBA?

+0

Estoy usando Excel 2010, y 'B3' definitivamente está apareciendo' FALSE'. – Joe

+0

Supongo que no recalca si solo cambia el formato ... –

Respuesta

12

Inicialmente, también apareció TRUE para mí porque agregué el formato después de ingresar las fórmulas.

Para repro - editar B2.

para obtener el valor subyacente es necesario utilizar la propiedad Value2 que parece ignorar el formato:

Function f(addr As String) 
    f = Range(addr).Value2 
End Function 
+2

Oh eso es astuto. – uotonyh

+0

+1 buena idea – brettdj

4

El problema con el uso de VBA y valor con células de divisas formato más allá de 4 puntos decimales se contempla bien this post at Dick's blog

Si escribe un número en una celda sin formato en Excel, ese número es almacenado en el tipo de datos Double. Cuando formatea ese número, muestra de una manera específica, pero no cambia el número. Por ejemplo, si formatea el número 1 como estilo Comma, obtiene 1.00. Los datos subyacentes de siguen siendo un 1, solo lo muestra de forma diferente. El formato de fecha y el formato de moneda son dos excepciones a esta regla.

Cuando formatea algo como una fecha o una moneda, realmente cambia el tipo de datos subyacente (del valor almacenado en la propiedad Value). Cuando se trata del formato de fecha, esto es semántica porque puede cambiar entre los tipos de datos Fecha y Doble sin ningún cambio a los datos. No tanto con el tipo de datos de moneda. Moneda solo admite cuatro decimales, por lo que bloquear un doble con, digamos, cinco decimales en un tipo de datos de Moneda dará como resultado un número diferente.

+0

Buen enlace ...... –

+1

Gracias por encontrar la explicación – JMax

Cuestiones relacionadas