View Full Version : [Excel] Imposrtare dati da txt
qwerty86
09-06-2009, 20:13
SAlve ragazzi ho un file txt formattato in questo modo
1,2,3,4,5
6,7,8,9,10
vorrei importarlo in excel mettendo i numeri per colonna e non per riga.
Ps. per riga ci sono riuscito tramite la funzione di importazione dati.
john_revelator
10-06-2009, 12:39
Fammi capire. In pratica vorresti nella colonna a
1
2
3
4
5
nella b
6
7
8
9
10
e così via
oppure tutti nella stessa colonna?
Puoi provare ad usare la Workbooks.OpenText(), che penso sia l'equivalente VBA della procedura che hai già provato. Un metodo che richiede poco codice ( anche se una nutrita serie di parametri ), ma che non mi convince troppo quanto a flessibilità di utilizzo.
Personalmente la risolverei così ( metto ogni riga trovata nel .txt, in una colonna, iniziando dalla "A" ) :
1. Anzitutto è necessaria questa Function :
Private Function LetteraColonna(indiceColonna As Long) As String
LetteraColonna = Left(Cells(1, indiceColonna).Address(1, 0), InStr(1, Cells(1, indiceColonna).Address(1, 0), "$") - 1)
End Function
2. Codice che fa il lavoro :
Dim FF As Integer
FF = FreeFile
Dim numRigaTxt As Long
numRigaTxt = 0
Dim rigaTxt As String
Dim arrayValRiga() As String
Open percorso & nomeFileTxt For Input As FF
Do While Not EOF(FF)
Line Input #FF, rigaTxt
numRigaTxt = numRigaTxt + 1
arrayValRiga = Split(rigaTxt, ",")
Range(LetteraColonna(numRigaTxt) & "1:" & LetteraColonna(numRigaTxt) & (UBound(arrayValRiga) + 1)) = WorksheetFunction.Transpose(arrayValRiga)
Loop
Close FF
Chiaramente qui posso fare quello che voglio, impostare la colonna e la riga da cui partire, e personalizzarmela a piacere... Prova... ;)
qwerty86
10-06-2009, 14:10
Fammi capire. In pratica vorresti nella colonna a
1
2
3
4
5
nella b
6
7
8
9
10
e così via
oppure tutti nella stessa colonna?
Tutti nella stessa colonna.
qwerty86
10-06-2009, 14:11
Puoi provare ad usare la Workbooks.OpenText(), che penso sia l'equivalente VBA della procedura che hai già provato. Un metodo che richiede poco codice ( anche se una nutrita serie di parametri ), ma che non mi convince troppo quanto a flessibilità di utilizzo.
Personalmente la risolverei così ( metto ogni riga trovata nel .txt, in una colonna, iniziando dalla "A" ) :
1. Anzitutto è necessaria questa Function :
Private Function LetteraColonna(indiceColonna As Long) As String
LetteraColonna = Left(Cells(1, indiceColonna).Address(1, 0), InStr(1, Cells(1, indiceColonna).Address(1, 0), "$") - 1)
End Function
2. Codice che fa il lavoro :
Dim FF As Integer
FF = FreeFile
Dim numRigaTxt As Long
numRigaTxt = 0
Dim rigaTxt As String
Dim arrayValRiga() As String
Open percorso & nomeFileTxt For Input As FF
Do While Not EOF(FF)
Line Input #FF, rigaTxt
numRigaTxt = numRigaTxt + 1
arrayValRiga = Split(rigaTxt, ",")
Range(LetteraColonna(numRigaTxt) & "1:" & LetteraColonna(numRigaTxt) & (UBound(arrayValRiga) + 1)) = WorksheetFunction.Transpose(arrayValRiga)
Loop
Close FF
Chiaramente qui posso fare quello che voglio, impostare la colonna e la riga da cui partire, e personalizzarmela a piacere... Prova... ;)
Ehmmm... non ho mai avuto a che fare con macro e programmazione su excel :)
Potresti darmi qualche diritta ? :) Grazie
john_revelator
10-06-2009, 14:29
Tutti nella stessa colonna.
Se li devi mettere tutti in una colonna io risolverei con la powershell.
Ad esempio a questo link
http://www.hwupgrade.it/forum/showthread.php?t=1987466&highlight=powershell
trovi spiegato come installarla.
Una volta installata sarebbe sufficiente accedervi digitando powershell da esegui, raggiungere come col classico prompt dei comandi la cartella contenente il file di testo e digitare mezza riga di codice
gc tuo_file.txt | % {$_.split(",")} | out-File incolonnati.txt
Avresti così il tuo file pronto per l'importazione.
Comunque il mitico MarcoGG ti risolverà il problema senza installare alcunchè. :)
Beh, se vanno tutti nella stessa colonna ( ad es. A ) è ancora più semplice :
Dim FF As Integer
FF = FreeFile
Dim rigaTxt As String
Dim strValori As String
Dim arrayValori() As String
Open percorso & nomeFileTxt For Input As FF
Do While Not EOF(FF)
Line Input #FF, rigaTxt
If strValori = "" Then
strValori = rigaTxt
Else
strValori = strValori & "," & rigaTxt
End If
Loop
arrayValori = Split(strValori, ",")
Range("A1:A" & (UBound(arrayValori) + 1)) = WorksheetFunction.Transpose(arrayValori)
Close FF
In questo caso si può anche omettere la Function LetteraColonna() dell'esempio precedente. ;)
qwerty86
10-06-2009, 15:38
Beh, se vanno tutti nella stessa colonna ( ad es. A ) è ancora più semplice :
Dim FF As Integer
FF = FreeFile
Dim rigaTxt As String
Dim strValori As String
Dim arrayValori() As String
Open percorso & nomeFileTxt For Input As FF
Do While Not EOF(FF)
Line Input #FF, rigaTxt
If strValori = "" Then
strValori = rigaTxt
Else
strValori = strValori & "," & rigaTxt
End If
Loop
arrayValori = Split(strValori, ",")
Range("A1:A" & (UBound(arrayValori) + 1)) = WorksheetFunction.Transpose(arrayValori)
Close FF
In questo caso si può anche omettere la Function LetteraColonna() dell'esempio precedente. ;)
Grazie mille , ma non ho conoscenze in vba , sono riuscito a capire dove inserire codice in excel ma vorrei capire a cosa deve essere legat questo codice e come fare poi per scegliere il file....
qwerty86
10-06-2009, 15:48
OK ci sono riuscito :) Ho creato una macro e vi ho associato il tuo codice. Ora dato che non devo usarlo io ma un amico che non capisce nulla di programmazione, volevo chiederti :
- c'è un modo per fargli scegliere il file a da una finestra? e non inserirlo nel codice?
- come dovrà fare lui per eseguire la macro ?
Grazie.
qwerty86
10-06-2009, 16:42
Function BrowseForFolder(Optional OpenAt As Variant) As Variant
'Function purpose: To Browser for a user selected folder.
'If the "OpenAt" path is provided, open the browser at that directory
'NOTE: If invalid, it will open at the Desktop level
Dim ShellApp As Object
'Create a file browser window at the default folder
Set ShellApp = CreateObject("Shell.Application"). _
BrowseForFolder(0, "Please choose a folder", 0, OpenAt)
'Set the folder to that selected. (On error in case cancelled)
On Error Resume Next
BrowseForFolder = ShellApp.self.Path
On Error Goto 0
'Destroy the Shell Application
Set ShellApp = Nothing
'Check for invalid or non-entries and send to the Invalid error
'handler if found
'Valid selections can begin L: (where L is a letter) or
'\\ (as in \\servername\sharename. All others are invalid
Select Case Mid(BrowseForFolder, 2, 1)
Case Is = ":"
If Left(BrowseForFolder, 1) = ":" Then Goto Invalid
Case Is = "\"
If Not Left(BrowseForFolder, 1) = "\" Then Goto Invalid
Case Else
Goto Invalid
End Select
Exit Function
Invalid:
'If it was determined that the selection was invalid, set to False
BrowseForFolder = False
End Function
Ho trovato questa funzione che visualizza un explorer ma solo per directory , come posso modificarlo per vedere i file e quindi ottenere il path del file da aprire?
qwerty86
10-06-2009, 17:16
Grazie a tutti , soprattutto a te MarcoGG , ho risolto. Ecco il codice, magari serve a qualcuno...
Option Explicit
Function RetrieveFileName()
Dim sFileName As String
RetrieveFileName = Application.GetOpenFilename
'They have cancelled.
If RetrieveFileName = "False" Then Exit Function
End Function
Sub txtToExcel()
Dim result As String
result = RetrieveFileName
Select Case result
Case Is = False
result = "an invalid file"
Case Else
'don't change anything
End Select
Dim FF As Integer
FF = FreeFile
Dim rigaTxt As String
Dim strValori As String
Dim arrayValori() As String
Open result For Input As FF
Do While Not EOF(FF)
Line Input #FF, rigaTxt
If strValori = "" Then
strValori = rigaTxt
Else
strValori = strValori & "," & rigaTxt
End If
Loop
arrayValori = Split(strValori, ",")
Range("A1:A" & (UBound(arrayValori) + 1)) = WorksheetFunction.Transpose(arrayValori)
Close FF
End Sub
Option Explicit
Function RetrieveFileName()
Dim sFileName As String
RetrieveFileName = Application.GetOpenFilename
'They have cancelled.
If RetrieveFileName = "False" Then Exit Function
End Function
Non mi è molto simpatica quella Function...
sFileName viene dichiarato e mai usato.
Inoltre è buona regola aggiungere un filtro, in questo caso per restringere il campo di scelta ai soli files di testo .txt :
Dim nomeFileTxt As Variant
Dim filtroFiles As String
filtroFiles = "File di testo (*.txt),*.txt"
nomeFileTxt = Application.GetOpenFilename(filtroFiles, 1, "Scegli un file di testo", "Apri File", False)
If nomeFileTxt = False Then
MsgBox "Nessun file valido"
Else
'Continua l'elaborazione...
'...
End If
;)
qwerty86
10-06-2009, 20:39
Non mi è molto simpatica quella Function...
sFileName viene dichiarato e mai usato.
Inoltre è buona regola aggiungere un filtro, in questo caso per restringere il campo di scelta ai soli files di testo .txt :
Dim nomeFileTxt As Variant
Dim filtroFiles As String
filtroFiles = "File di testo (*.txt),*.txt"
nomeFileTxt = Application.GetOpenFilename(filtroFiles, 1, "Scegli un file di testo", "Apri File", False)
If nomeFileTxt = False Then
MsgBox "Nessun file valido"
Else
'Continua l'elaborazione...
'...
End If
;)
Sei semplicemente un grande :) oserei un amico :) Grazie mille
SAlve ragazzi ho un file txt formattato in questo modo
1,2,3,4,5
6,7,8,9,10
vorrei importarlo in excel mettendo i numeri per colonna e non per riga.
Ps. per riga ci sono riuscito tramite la funzione di importazione dati.
In alternativa potresti importarlo normalmente, poi dopo aver copiato l'intero intervallo, potresti fare un incolla speciale>valori>trasponi in un nuovo foglio.
Ciao
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.