2013-08-22 13 views
7

Viene inviato un foglio di calcolo ogni settimana, e per vari motivi fuori dal mio controllo alcune colonne escono come testo memorizzato come numeri anziché come numeri. Ho bisogno di convertirli in numeri per cose che succedono con loro più avanti nel codice.Conversione di un certo intervallo di colonne dal testo al formato numerico con VBA

li sto convertendo ai numeri, al momento in questo modo:

Dim rng As Range 

For Each rng In Range("A:D").Columns 
    rng.TextToColumns 
Next rng 

Esiste un migliore (vale a dire più efficiente) modo di fare questo?

Ho giocato con NumberFormat e non sembra funzionare.

Grazie in anticipo (e mi scuso se ho perso una soluzione già qui - ho fatto una ricerca e non l'ho trovato).

+5

vorrei fare in questo modo: rng.Value = rng.Value. Dovrebbe convertire il testo in numeri. Solo un piccolo problema, tuttavia, se hai una formula nell'intervallo, converte anche la formula in valore normale. Ci sono soluzioni facili per questo problema. Ma quello dovrebbe fare il trucco. – Vikas

+1

Nota che il metodo di @Vikas non funziona con tutte le versioni locali, a seconda del rispettivo separatore decimale. Ad esempio, nelle impostazioni locali tedesche, se si applica ".Value = .Value" a un intervallo, solo i numeri interi verranno convertiti in numeri. Questo è un intervallo con il contenuto del testo: 1 | 2 | 0,5 diventa * 1 * | * 2 * | ** 0,5 ** dove le parti in corsivo vengono convertite in numeri ma la parte in grassetto è ancora solo testo. –

risposta

10

Excel:

  • copia una cella vuota
  • Selezionare l'intervallo in cui è necessario cambiare il formato
  • Select PasteSpecial, e sotto Operation selezionare Add

VBA

(cambiate Sheet1 Di conseguenza, assumendo che A100000 è vuota):

Sheet1.Range("A100000").Copy 
Sheet1.UsedRange.PasteSpecial , xlPasteSpecialOperationAdd 

Se si posiziona il sopra in caso Workbook_Open, eseguirà la conversione automaticamente ogni volta che si apre la cartella di lavoro.

Con questo metodo, le formule vengono mantenute.


Spero che questo aiuti!

+0

Vikas e loannis: grandi tecniche per questa situazione - grazie. Ho testato entrambi i suggerimenti e funzionano molto bene per i miei bisogni. – EndlessLoop

+0

Il grande vantaggio di questa tecnica è che le celle vuote rimangono vuote. –

7

Da questo sito http://www.access-programmers.co.uk/forums/showthread.php?t=219316 Ho avuto questa idea:

Range("D1:D400") = Range("D1:D400").Value 

e funziona perfettamente!

+0

È lo stesso di [@Vikas] (http://stackoverflow.com/users/723914/vikas) suggerimento nei commenti sotto la domanda: 'rng.Value = rng.Value'. Tuttavia, questo non funziona per me mentre 'TextToColumns' e' PasteSpecial' funzionano. – ZygD

1

questo è più facile:

With Selection 
    .NumberFormat = "0" 
    .Value = .Value 
End With 
Problemi correlati