Come importre un text specifico da file in Excel?

Ho trovato questo codice da @Scott Holtzman e ho bisogno di tweek un po 'per soddisfare le mie esigenze. Questo codice prende each row in un file di text e lo mette in colonne separate in un foglio Excel (A1, B1, C1 e così via), each file di text viene memorizzato in una row separata (1,2,3 e così via). Innanzitutto vorrei che metta solo il text nel foglio excel se la row inizia con un text specifico, in secondo luogo voglio solo copiare un po 'del text da each row nel foglio excel.

Sub ReadFilesIntoActiveSheet() Dim fso As FileSystemObject Dim folder As folder, file As file, FileText As TextStream Dim TextLine As String, Items() As String Dim i As Long, cl As Range ' Get a FileSystem object Set fso = New FileSystemObject ' get the directory you want Set folder = fso.GetFolder("D:\YourDirectory\") Dim x As Long x = 1 'to offset rows for each file ' Loop thru all files in the folder For Each file In folder.Files ' set the starting point to write the data to Set cl = ActiveSheet.Cells(x, 1) ' Open the file Set FileText = file.OpenAsTextStream(ForReading) Dim j As Long j = 0 'to offset columsn for each line ' Read the file one line at a time Do While Not FileText.AtEndOfStream TextLine = FileText.ReadLine 'read line cl.Offset(, j).Value = TextLine 'fill cell j = j + 1 Loop ' Clean up FileText.Close x = x + 1 Next file Set FileText = Nothing Set file = Nothing Set folder = Nothing Set fso = Nothing End Sub 

Ecco come sono i miei file di text:

 From:NameName 'want all text except the "FROM:" Date:yyyy.mm.dd 'want all text except the "Date:" Type: XXXXXXXXX ' I don't want this line into excel To: namename ' I don't want this line into excel ----------------------------- xxxxxxx --------------------- A1: Tnr xxxxxxxxxxxxx 'want all text except the "A1: Tnr" only next 13char A2: texttext 'want all text except the "A2:" An: 'A1 and up to A14 A14: texttext 'want all text except the "A14:" ------------------------------ xxxxxx ---------------------- 

Quindi, in totale ci sono 22 righe nel file di text.

E se è ansible utilizzare FROM :, DATE :, A1: A14: come intestazioni nella prima row che sarebbero epiche.

ho cercato di andare verso di me, e ho provato un po 'con questo:

 TextLine = FileText.ReadLine 'read line If InStr(TextLine, "A1:") 

ma funziona solo per una linea e non posso farlo funzionare con diverse righe. Inoltre mette l'output nella cella F1 invece di A1. pensate che questo sia perché each row nel documento di text riceve una sola cella – anche se niente è scritto.

Ecco una soluzione che riempie una row nel foglio di Excel per file, a partire dalla row 2. È necessario riempire manualmente i titoli in quella prima row come segue:

 From | Date | A1 | A2 | ... | A14 

Le righe a cui non sei interessato vengono ignorate ei valori vengono inseriti nelle colonne corrette:

 Sub ReadFilesIntoActiveSheet() Dim fso As FileSystemObject Dim folder As folder, file As file, FileText As TextStream Dim TextLine As String Dim cl As Range Dim num As Long ' numberscal part of key, as in "Ann:" Dim col As Long ' target column in Excel sheet Dim key As String ' Part before ":" Dim value As String ' Part after ":" ' Get a FileSystem object Set fso = New FileSystemObject ' Get the directory you want Set folder = fso.GetFolder("D:\YourDirectory\") ' Set the starting point to write the data to ' Don't write in first row where titles are Set cl = ActiveSheet.Cells(2, 1) ' Loop thru all files in the folder For Each file In folder.Files ' Open the file Set FileText = file.OpenAsTextStream(ForReading) ' Read the file one line at a time Do While Not FileText.AtEndOfStream TextLine = FileText.ReadLine 'read line key = Split(TextLine & ":", ":")(0) value = Trim(Mid(TextLine, Len(key)+2)) num = Val(Mid(key,2)) If num Then key = Replace(key, num, "") ' Remove number from key col = 0 If key = "From" Then col = 1 If key = "Date" Then col = 2 If key = "A" Then col = 2 + num If col Then cl.Offset(, col-1).Value = value ' Fill cell End If Loop ' Clean up FileText.Close ' Next row Set cl = cl.Offset(1) Next file End Sub 

Il codice di cui sopra funziona bene anche se mancano gli elementi nel file, come se la linea con "A12:" non fosse presente, questo lascerà la cella corrispondente nel foglio vuoto, invece di indicare il valore di "A13:" lì, causando uno spostamento.

Anche se l'ordine delle linee cambierebbe e "From:" apparirà dopo "Date:", questo non avrà un effetto negativo nell'output. I valori "From" verranno sempre nella prima colonna, i valori "Data" nel secondo, ecc.

Inoltre, se il tuo file contenere molte altre righe con formati diversi, tutti saranno ignorati.

Sostituite il corpo "Do While's" con le seguenti righe

 TextLine = FileText.ReadLine 'read line If Not (Left(TextLine, 1) = "T" Or Left(TextLine, 1) = "-") Then TextLine = Trim(Mid(TextLine, InStr(TextLine, ":") + 1)) If (TextLine <> "") Then cl.Offset(, j).Value = TextLine 'fill cell j = j + 1 End If End If