Converti testo in numero



  • Converti testo in numero
    di ilFonta (utente non iscritto) data: 22/09/2013 10:32:50

    Salve
    Ho scritto una macro che mi importa un file di testo, nella colonna B ho dei numeri che però continuano ad essere formattati come testo. Il modo più efficiente che ho trovato per converili in numeri è moltiplicarli per 1 nella colonna accanto. Ho provato anche ad effettuare la conversione utilizzando la funzione .Value, ma non funziona.
    I numeri in questione sono tutti <1 (esempio 0,65 0,54 etc).

    Qualche idea più elegante?

    Grazie



  • di Vecchio Frac data: 22/09/2013 14:50:55

    Per quanto ne so io, l'accorgimento che hai utilizzato (moltiplicare per 1) è il più semplice e facile da implementare.
    In alternativa, sempre in una colonna a fianco vuota, Incolla speciale > Valori > Addiziona (la colonna di destinazione deve essere vuota perchè questo metodo addiziona i valori da incollare a quelli eventualmente presenti). E in pratica è lo stesso metodo tuo.





  • di paolomath data: 23/09/2013 08:23:37

    Se i valori sono formattati come testo ma sono numeri, non puoi semplicemente cambiare il formato in "Generale"?

    Se importi sempre gli stessi dati e il problema è su più colonne puoi scrivere due righe di codice, tipo:

    ActiveSheet.Columns(NUMERO_COLONNA).NumberFormat = "General", ecc.

    Bye



  • di Grograman data: 23/09/2013 09:30:26

    Cit: "Ho scritto una macro che mi importa un file di testo"

    E dove sta?


  • Grafici con VBA
    di ilFonta data: 23/09/2013 13:06:50

    Ciao Grogranam

    hai ragione, non ho inserito la macro perchè piuttosto lunga, se vuoi non ho problemi però a inserire il codice.
    Vi dico (a tutto il forum) che alla fine ho deciso per la conversione del testo in numeri tramite la moltiplicazione per 1 della colonna, dopodichè converto questa in numero (non più una formula) e poi elimino le due colonne (che a questo punto sono doppioni) dove si trovano i dati sottoforma di testo e di formula (è l'ultima parte del codice che ho inserito).

    Allego la prima parte della mia macro relativa al codice che mi creava problemi codice.
    Grazie a tutti
     
    Sub estrazione ()
    
    '-----------------------ribattezzo i fogli'------------------------------------------------------------
            Sheets("Foglio2").Select
            Sheets("Foglio2").Name = "istogrammi"
            Sheets("Foglio1").Select
            Sheets("Foglio1").Name = "statistiche"
    
    '-----------------------apertura del fileDialog che ci chiede di inserire il file----------------------
            Dim inputFile As String
            Dim dlgOpen As FileDialog
    
            Set dlgOpen = Application.FileDialog(msoFileDialogOpen)
                    dlgOpen.Filters.Clear
        
            With dlgOpen.Filters.Add("File di testo", "*.txt", 1) 'nel fileDialog viene scritto"File di Testo" e ci si aspetta che sia un ".txt"
            End With
        
            If dlgOpen.Show <> -1 Then
            MsgBox "Non hai selezionato nessun file", vbInformation 'questo è un controllo per essere sicuri che si sia inserito un file
    
            Else
            
    '-----------------------inizia l'importazione sempre dalla casella A1-----------------------------------
            Sheets("istogrammi").Select
            inputFile = dlgOpen.SelectedItems(1)
            With ActiveSheet.QueryTables.Add(Connection:= _
                            "TEXT;" & inputFile, Destination _
                            :=Range("$A$1"))
                            .Name = inputFile
                            .FieldNames = True
                            .RowNumbers = False
                            .FillAdjacentFormulas = False
                            .PreserveFormatting = True
                            .RefreshOnFileOpen = False
                            .RefreshStyle = xlInsertDeleteCells
                            .SavePassword = False
                            .SaveData = True
                            .AdjustColumnWidth = True
                            .RefreshPeriod = 0
                            .TextFilePromptOnRefresh = False
                            .TextFilePlatform = 850
                            .TextFileStartRow = 1
                            .TextFileParseType = xlDelimited
                            .TextFileTextQualifier = xlTextQualifierDoubleQuote
                            .TextFileConsecutiveDelimiter = True
                            .TextFileTabDelimiter = True
                            .TextFileSemicolonDelimiter = False
                            .TextFileCommaDelimiter = False
                            .TextFileSpaceDelimiter = True
                            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
                            .TextFileTrailingMinusNumbers = True
                            .Refresh BackgroundQuery:=False
        End With
    End If
    
    '----------------------trattamento dati-----------------------------------------
            
    ' sostituisce i punti con le virgole
            Cells.Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder _
            :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
                    
    ' eliminazione delle colonne inutili
            Columns("J:K").Select
            Selection.Delete Shift:=xlToLeft
    
            Columns("A:H").Select
            Selection.Delete Shift:=xlToLeft
    
    ' cancella il contenuto di A1
            Cells(1, 1).Select
            Selection.ClearContents
    
    ' elimina le righe vuote in alto
            Do
                    If (IsEmpty(Cells(1, 1))) Then
                            Cells(1, 1).EntireRow.Delete
                    End If
            Loop While IsEmpty(Cells(1, 1))
    
    ' sposta colonna A in B
            Columns("A:A").Select
            Selection.Cut Destination:=Columns("B:B")
        
    ' calcola l'ultima riga
            Dim ultimariga As Integer
            ultimariga = Cells(Rows.Count, 2).End(xlUp).Row
    
    ' converte sigma da testo anumero
            Range("C2").Select
            ActiveCell.FormulaR1C1 = "=RC[-1]*1" 'converte in numeri moltiplicando per 1
            Selection.AutoFill Destination:=Range(Cells(2, 3), Cells(ultimariga, 3)), Type:=xlFillDefault
            
            Range(Cells(2, 3), Cells(ultimariga, 3)).Select
            Selection.Copy 'copi e incollo in valori
            Range("D2").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    
            Columns("B:C").Select 'tolgo le colonne in eccesso
            Application.CutCopyMode = False
            Selection.Delete Shift:=xlToLeft
    
    'etc
    
    End sub



  • di Grograman (utente non iscritto) data: 23/09/2013 13:21:46

    Ok mi correggo, sarebbe meglio vedere il txt che importi ^_^
    A naso direi che quella sostituzione di punti con virgole è omettibile, e conseguentemente la trasformazione in numeri.

    Intanto prova questa versione, ho tagliato qualche riga di codice, ma senza intaccare l'originale.
     
    Option Explicit
    
    Sub estrazione()
    
    '-----------------------ribattezzo i fogli'------------------------------------------------------------
            Sheets("Foglio2").Select
            Sheets("Foglio2").Name = "istogrammi"
            Sheets("Foglio1").Select
            Sheets("Foglio1").Name = "statistiche"
    
    '-----------------------apertura del fileDialog che ci chiede di inserire il file----------------------
        Dim inputFile As String
        Dim dlgOpen As FileDialog
    
        Set dlgOpen = Application.FileDialog(msoFileDialogOpen)
                dlgOpen.Filters.Clear
    
        With dlgOpen.Filters.Add("File di testo", "*.txt", 1) 'nel fileDialog viene scritto"File di Testo" e ci si aspetta che sia un ".txt"
        End With
    
        If dlgOpen.Show <> -1 Then
        MsgBox "Non hai selezionato nessun file", vbInformation 'questo è un controllo per essere sicuri che si sia inserito un file
    
        Else
            
    '-----------------------inizia l'importazione sempre dalla casella A1-----------------------------------
        Sheets("istogrammi").Select
        inputFile = dlgOpen.SelectedItems(1)
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & inputFile, Destination:=Range("$A$1"))
          .Name = inputFile
          .FieldNames = True
          .RowNumbers = False
          .FillAdjacentFormulas = False
          .PreserveFormatting = True
          .RefreshOnFileOpen = False
          .RefreshStyle = xlInsertDeleteCells
          .SavePassword = False
          .SaveData = True
          .AdjustColumnWidth = True
          .RefreshPeriod = 0
          .TextFilePromptOnRefresh = False
          .TextFilePlatform = 850
          .TextFileStartRow = 1
          .TextFileParseType = xlDelimited
          .TextFileTextQualifier = xlTextQualifierDoubleQuote
          .TextFileConsecutiveDelimiter = True
          .TextFileTabDelimiter = True
          .TextFileSemicolonDelimiter = False
          .TextFileCommaDelimiter = False
          .TextFileSpaceDelimiter = True
          .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
          .TextFileTrailingMinusNumbers = True
          .Refresh BackgroundQuery:=False
        End With
    End If
    
    '----------------------trattamento dati-----------------------------------------
            
    ' sostituisce i punti con le virgole
        Cells.Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
                
      ' eliminazione delle colonne inutili
        Columns("J:K").Delete
        Columns("A:H").Delete
      
      ' cancella il contenuto di A1
        Cells(1, 1).ClearContents
      
      ' elimina le righe vuote in alto
        Do
          If (IsEmpty(Cells(1, 1))) Then
            Cells(1, 1).EntireRow.Delete
          End If
        Loop While IsEmpty(Cells(1, 1))
      
      ' sposta colonna A in B
        Columns("A:A").Select
        Selection.Cut Destination:=Columns("B:B")
      
      ' calcola l'ultima riga
        Dim ultimariga As Long
        ultimariga = Cells(Rows.Count, 2).End(xlUp).Row
        Range("D2:D" & ultimariga) = Evaluate(Range("B2:B" & ultimariga).Address & "*1")
      
        Columns("B:C").Delete
    
    'etc
    
    End Sub