2012-04-04 21 views
8

In Excel VBA, Range("A1").Value deve restituire il valore sottostante dell'intervallo A1 sul foglio di lavoro. Ma sto ottenendo un valore diverso se la cella è formattata come Contabilità.VBA di Excel: valore della cella, indipendente dalla formattazione della cella

Come ottengo il valore reale sottostante della cella?

Foglio

Fai un nuovo documento, immettere i seguenti valori nelle celle:

  • A1: 0.00001
  • A2: = A1
  • A3: = A1 = A2

Come ci si aspetterebbe, A3 risulta in TRUE. Ora modifica la formattazione di A2 in Contabilità, utilizzando 2 posizioni decimali. A2 ora legge $ 0.00, ma il valore sottostante è ancora 0.00001, quindi A3 è ancora TRUE.

VBA

Fai un nuovo modulo e aggiungere la seguente funzione:

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

Come si può vedere, questo appena ottiene il valore di un intervallo utilizzando il metodo dell'oggetto RangeValue .

Foglio

Torna al foglio di lavoro. Immettere i seguenti valori:

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

A1 e A2 avere lo stesso valore sottostante, ma non lo sono B1 e B2, anche se sono entrambi calcolati utilizzando il metodo Value di A1 e A2.

L'espressione in A3 (=A1=A2) sta accedendo al valore sottostante effettivo di A1 e A2. Come posso accedere a questi valori in VBA?

+0

Sto usando Excel 2010 e 'B3' è sicuramente in arrivo' FALSE'. – Joe

+0

Indovina che non si ricalcola se si modifica solo la formattazione ... –

risposta

12

Inizialmente è arrivato VERO anche per me perché ho aggiunto la formattazione dopo aver inserito le formule.

Per ripetere la modifica B2.

per ottenere il valore sottostante è necessario utilizzare la proprietà VALORE2 che sembra ignorare la formattazione:

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

Oh questo è subdolo. – uotonyh

+0

+1 buona intuizione – brettdj

4

Il problema con l'utilizzo di VBA e valore con le cellule di valuta formattato al di là di 4 punti decimali è coperto bene da this post at Dick's blog

Se si digita un numero in una cella non formattata in Excel, tale numero è memorizzato nel tipo di dati Double. Quando si formatta quel numero, si mostra in un modo specifico, ma non si modifica il numero. Ad esempio, se si formatta il numero 1 come stile virgola, si ottiene 1.00. I dati sottostanti di sono ancora a 1, lo stai solo mostrando in modo diverso. Il formato data e il formato valuta sono due eccezioni a questa regola.

Quando si formatta qualcosa come Data o Valuta, si modifica in realtà il tipo di dati sottostante (del valore memorizzato nella proprietà Value). Quando si tratta del formato Data, questa è semantica perché è possibile passare da tra i tipi di dati Data e Double senza modificare i dati in . Non tanto con il tipo di dati Valuta. Valuta solo supporta quattro cifre decimali, in modo da bloccare un doppio con, ad esempio, cinque decimali in un tipo di dati Valuta restituirà un numero diverso.

+0

Nice link ...... –

+1

Grazie per aver trovato la spiegazione – JMax

Problemi correlati