PDA

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?

MarcoGG
10-06-2009, 13:26
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è. :)

MarcoGG
10-06-2009, 15:25
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

MarcoGG
10-06-2009, 20:03
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

ses4
11-06-2009, 17:25
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