Condividi:        

importare txt tramite common dialog

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

importare txt tramite common dialog

Postdi miko » 27/02/13 21:06

buonasera a tutti,
ho due problemi collegati con il procedimento di importazione di un file txt.
conosco per il tramite del registratore di macro e vari post sull'argomento come importare un txt;
ma mi chiedevo se è possibile scegliere il file txt aprendo la common dialog di windows,
onde evitare di cambiare la relativa linea di codice ogniqualvolta il file venga spostato in un altra posizione.
una volta scelto il file txt si avvia la macro di importazione.
l'altro quesito e come fare ad importare le righe del txt successive a quelle già importate in precedenza.
se ad esempio la prima volta sono state importate 100 righe, ed il txt successivamente cresciuto ne contiene
150, è inutile reimportare le prime 100, ma è sufficiente importare-accodare alla riga 100 le rimanenti
cioè dalla 101 alla 150.
quello che riesco a fare è cancellare tutto il foglio ed importare nuovamente tutto il txt.
grazie saluti
windows 10 - office 2013
miko
Utente Senior
 
Post: 521
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: importare txt tramite common dialog

Postdi Anthony47 » 27/02/13 23:26

Quando importi puoi scegliere da quale riga del file di text cominciare a importare, usando la Proprietà TextFileStartRow dell' oggetto QueryTable; esempio cosi' partirai da riga 10:
Codice: Seleziona tutto
        .TextFileStartRow = 10

Non so con quale processo logico determini quante righe puoi saltare... potresti usare Application.Worksheetfunction.Countif per contare quante righe sono compilate nel tuo attuale importato, oppure Cells(RowsCount,"A").End(xlUp).Row per calcolare quale e' l' ultima riga occupata di colonna A (o altra colonna chiave) e poi usare questo valore per impostare il numero di riga di partenza, ad esempio
Codice: Seleziona tutto
        .TextFileStartRow = Cells(RowsCount,"A").End(xlUp).Row+1

Ma questa logica la devi valutare tu, sapendo come e' organizzato il file txt e come puo' cambiare.

In quanto a scegliere da macro il file da importare, potresti ad esempio usare
Codice: Seleziona tutto
FullNome = Application.GetOpenFilename("(*.txt),*.txt")   '<<<Scelta del file
If FullNome = False Then Exit Sub
A questo punto avrai nome file e directory nella variabile FullNome, e lo userai nella macro attuale di importazione.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: importare txt tramite common dialog

Postdi miko » 28/02/13 12:59

salve,
seguendo le indicazioni di anthony riscontro dei problemi;
per alcuni anche se comprendo l'errore non riesco a risolverlo.
la macro che ho registrato ed uso, alla quale ho aggiunto delle linee per adattarla al mio caso,
funziona perfettamente:
Codice: Seleziona tutto
Sub Macro1()
   Sheets("Foglio1").Select
   RngIni = Range("B" & Rows.Count).End(xlUp).Row  'linea 1 <<<<<
   Range("M1").Value = "numero righe =" & RngIni
   Range("B65536").End(xlUp).Offset(1, 0).Select
  Set PRIMA_CELLA_VUOTA = Selection
 
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;K:\1 EXCEL\IMPORTARE ULTIME N RIGHE DA TXT\testo.Txt", _
        Destination:=PRIMA_CELLA_VUOTA)   'linea 2  <<<<<<<
       
        .Name = "testo" 'linea 3  <<<<<<<<<<<
        .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 = RngIni - 1 'linea 4  <<<<<<<<<<<<
       
        .TextFileParseType = xlFixedWidth
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileFixedColumnWidths = Array(5, 3, 4, 4, 11, 2, 3, 3, 3, 3, 3, 4, 3, 2)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False   'linea 5  <<<<<<<<
    End With
    Range("A1").Select
End Sub

ho aggiunto ad inizio macro queste due linee:
Codice: Seleziona tutto
Sub Macro1()
   FullNome = Application.GetOpenFilename("(*.txt),*.txt")   '<<<Scelta del file
  If FullNome = False Then Exit Sub
  Sheets("Foglio1").Select
....

e fin qui funziona perchè si apre la commondialog per la scelta del file txt.
come posso modificare queste due linee im modo che la commndialog
si apra sempre in corrispondenza di un hard disk senza dover ogni volta
partire dalla finestra generica che mostra excel?
variante al quesito precedente:
aprire la commondialog con hard disk e cartella precisa:
ad esempio "K:\1 EXCEL\"?
dopo l'apertura della commondialog e la scelta del file txt la macro continua
ma ho errore in varie linee:
se alla linea 1 sostituisco una delle seguenti:
Application.Worksheetfunction.Countif
oppure
Cells(RowsCount,"B").End(xlUp).Row
ricevo errore, e nonostante le modifiche che apporto la macro si blocca.
elimino queste due righe e ritorno ad usare la macro originale,
modificando le linee 2 e 3, in questo modo:
Codice: Seleziona tutto
ub Macro1()
   FullNome = Application.GetOpenFilename("(*.txt),*.txt")   '<<<Scelta del file
  If FullNome = False Then Exit Sub
  Sheets("Foglio1").Select
.......
.......
With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;FullNome", _
        Destination:=PRIMA_CELLA_VUOTA)   ' linea 2  <<<<<<<
       
        .Name = FullNome  ' linea 3  <<<<<<<<<<<
.......
......
 .Refresh BackgroundQuery:=False   'linea 5  <<<<<<<<
.....

ora ricevo errore alla linea 5 perche la macro non riesce a trovare il file txt da importare;
questo è dovuto, secondo la mia interpretazione,
al fatto che la variabile FullNome contiene l'estensione .txt,
mentre la linea .Name= FullNome deve essere priva di estensione;
perciò come faccio ad eliminare l'estensione dalla variabile FullNome
in moche che poi si abbia .Name= FullNome senza estensione?
saluti e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 521
Iscritto il: 29/12/09 10:44

Re: importare txt tramite common dialog

Postdi Anthony47 » 28/02/13 15:25

Alcuni spunti in disordine

a) Puoi inserire specificare Drive e path prima di FullNome = Application.GetOpenFilename, tipo:
Codice: Seleziona tutto
ChDrive "K"
ChDir " K:\1 EXCEL\"
FullNome = Application.GetOpenFilename(etc etc)


b) Questa istruzione e' sbagliata
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;FullNome", _
Destination:=PRIMA_CELLA_VUOTA) ' linea 2 <<<<<<<


Dovrebbe essere cosi':
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & FullNome , _
Destination:=PRIMA_CELLA_VUOTA) ' linea 2 <<<<<<<


c) La riga .Name = FullNome ' linea 3 <<<<<<<<<<< e' ininfluente; cambiala in
Codice: Seleziona tutto
        .Name = "pippo"
e ti troverai bene

Non ho capito quale altro errore hai.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: importare txt tramite common dialog

Postdi miko » 28/02/13 21:28

salve,
alla luce delle tue ultime righe di codice tutto funziona perfettamente.
nonostante la mia confusa descrizione sei riuscito a risolvere i problemi.
devo solo precisare alcuni punti, anche per correttezza nei confronti degli altri utenti
che possono utilizzare la macro:
per il punto a) del post di Anthony la riga di codice:
Codice: Seleziona tutto
ChDir " K:\1 EXCEL\"

fornisce errore in quanto vi è lo spazio tra gli apici e K:\1 EXCEL\,
quindi deve essere scritta:
Codice: Seleziona tutto
ChDir "K:\1 EXCEL\"

per il punto c), avendo registrato varie macro per l'inserimento dei dati avevo notato che la linea
.Name riportava il nome del file di testo;
per cui pensavo che era necessario inserire il corretto nome del file;
ma stando alle tue indicazioni ed alle prove che ho effettuato sembra che alla linea
.Name si puo mettere un qualunque nome tipo "pippo" , "miko" , "anthony"...
diverso dall' effettivo nome del file che si vuole importare;
la macro funziona ugualmente.
per quanto riguarda
...Non ho capito quale altro errore hai...

ho errore se introduco le linee:
Application.Worksheetfunction.Countif
oppure
Cells(RowsCount,"A").End(xlUp).Row
credo dipenda dalla sintassi non corretta che uso per queste due linee
e che non so come modificare.
a parte questo errore tutto funziona perfettamente.
grazie ciao
windows 10 - office 2013
miko
Utente Senior
 
Post: 521
Iscritto il: 29/12/09 10:44

Re: importare txt tramite common dialog

Postdi Anthony47 » 28/02/13 23:07

In merito as (a)Application.Worksheetfunction.Countif e (b)Cells(RowsCount,"A").End(xlUp).Row
Si tratta di due "spunti" relativamente a come potresti calcolare quante righe sono gia' state importate e di conseguenza da dove iniziale una nuova importazione (usando la proprieta' TextFileStartRow dell' oggetto QueryTable).
Mentre la (a) (cioe' Cells(RowsCount,"A").End(xlUp).Row) ti da' direttamente l' ultima riga di col A occupata e quindi puo' essere usata subito nell' esempio che ti diedi (.TextFileStartRow = Cells(RowsCount,"A").End(xlUp).Row+1) la Countif deve essere tutta impostata (la sintassi e' simile a Conta.se), quindi forse ti conviene partire dalla (a).
TUTTAVIA io non so se ti basta contare quale e' l' ultima riga occupata per essere certo che in quel modo sai esattamente dove cominciare a importare i dati dal nuovo file sorgente; dipende da cose che solo tu e chi genera i file sorgente puo' conoscere...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "importare txt tramite common dialog":


Chi c’è in linea

Visitano il forum: Nessuno e 75 ospiti