Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Macro per selezionare dati da un TXT

Ultimo Aggiornamento: 16/03/2019 13:55
Post: 1
Registrato il: 20/02/2019
Città: CAGLIARI
Età: 50
Utente Junior
2016
OFFLINE
21/02/2019 13:37

Salve a tutti! Sono un nuovo iscritto e avrei bisogno di una mano per una macro.

La macro di cui avrei bisogno in un file excel, dovrebbe fare:

1. Aprire un finestra per selezionare uno specifico file TXT
2. Una volta selezionato il TXT, dovrebbe leggerlo per cercare delle coincidenze di testo. Per esempio trovare il testo "Prodotto-A:" (il testo e' sempre all'inizio di una riga)
3. Una volta trovata la coincidenza dovrebbe copiare il numero dopo i due punti (:) in una casella del file Execl che ha lo stesso testo.
4. Dovrebbe fare questo per un totale di circa 26 coincidenze.

Purtroppo il testo non e' sempre nella stessa sequenza, ma il nome del prodotto e' sempre all'inizio della riga.

Spero di essere stato chiaro nella mia spiegazione.

Allego un esempio del file Excel e TXT.

Grazie mille
Post: 2.146
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
21/02/2019 16:16

ciao
che conoscenze hai di programmazione in excel ?

saluti



Domenico
Win 10 - Excel 2016
Post: 1
Registrato il: 20/02/2019
Città: CAGLIARI
Età: 50
Utente Junior
2016
OFFLINE
21/02/2019 17:06

Macro per selezionare dati da un TXT
Ciao Domenico, non posso dire di essere un genio, ma non me la cavo male soprattutto con le formule.
Le macro pero' sono un punto debole.
A dire il vero ho quasi risolto il problema, ma ho un piccolo problema, la seguente macro fa quasi tutto quello che mi serve:

Sub GetData()
Dim myFile As String, text As String, textline As String, prodA As Integer, prodD As Integer, prodF As Integer, prodG As Integer, prodL As Integer, prodM As Integer, prodQ As Integer
myFile = Application.GetOpenFilename()
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
text = text & textline
Loop
Close #1
prodA = InStr(text, "Prodotto-A:")
prodD = InStr(text, "Prodotto-D:")
prodF = InStr(text, "Prodotto-F:")
prodG = InStr(text, "Prodotto-G:")
prodL = InStr(text, "Prodotto-L:")
prodM = InStr(text, "Prodotto-M:")
prodQ = InStr(text, "Prodotto-Q:")
Range("B2").Value = Mid(text, prodA + 12)
Range("B3").Value = Mid(text, prodD + 12)
Range("B4").Value = Mid(text, prodF + 12)
Range("B5").Value = Mid(text, prodG + 12)
Range("B6").Value = Mid(text, prodL + 12)
Range("B7").Value = Mid(text, prodM + 12)
Range("B8").Value = Mid(text, prodQ + 12)
End Sub

L'unico problema che mi resta da risolvere e' che io non so mai quanto sara' lungo il numero dopo i due punti, quindi se metto il parametro di lunghezza nel comando MID rishcio di tagliare fuori un parte del numero, pero' se non lo metto mi prende l'intero file da quel punto sino alla fine!!!

C'e' un modo per prendere il valore dopo i due punti e sino alla fine della riga?

Allego gli ultimi due file che ho modificato e a cui facico riferimento.

Grazie
Post: 2.147
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
21/02/2019 17:37

Ciao
bene per la tua conoscenza del vb.....

Però se ti tiri dentro tutto il txt, poi incorri nel problema che hai evidenziato.

Tanto vale, leggere riga per riga il file di testo, effettuare uno "split" della riga letta dando come separatore i ":" (almeno spero che i dati siano tutti così);

a questo punto nell'array che si genera con lo split, avrai in:
arr(0) il prodotto e in
arr(1) il numero

Pertanto non ti resta che cercare nella col. A il prodotto e trascrivere il relativo valore.

Sub LeggiTxt()
Filename = Application.GetOpenFilename(FileFilter:="Text File (*.txt),*.txt")
Open Filename For Input As #1
Do While Not EOF(1)
    Line Input #1, mText
    mTesto = Split(mText, ":")
    With Range("A:A")
        Set c = .Find(mTesto(0), LookIn:=xlValues, lookat:=xlWhole)
        If Not c Is Nothing Then
            Cells(c.Row, 2) = mTesto(1)
        End If
    End With
Loop
Close #1
End Sub


Se hai necessità di chiarimenti, facci sapere.

saluti





Domenico
Win 10 - Excel 2016
Post: 2
Registrato il: 20/02/2019
Città: CAGLIARI
Età: 50
Utente Junior
2016
OFFLINE
21/02/2019 19:15

Grazie mille Domenico, ma c'e' qualcosina che non va.
E' colpa mia perche' ti ho mandato un esempio che non era proprio preciso, infatti i file che ho allegato erano degli esempi troppo generici, quando applico la tua macro ad un esempio piu' concreto non funziona.
Ti allego due nuovi file, nel file excel ho messo la tua macro e come vedrai non copia i valori. Forse dipende dal fatto che gli effettivi nomi dei prodotti sono molto diversi tra di loro, non come nel mio primo esempio.

Noterai che ho fatto una piccola alla fine della macro perche', a scopo di verifica, vorrei che anche il testo prime dei : fosse copiato, cosi' sono sicuro che i valori si riferiscono al prodotto esatto.

Grazie di nuovo per la tua pazienza.
Post: 2.148
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
21/02/2019 19:28

ciao

prova a sostituire:

Set c = .Find(mTesto(0), LookIn:=xlValues, lookat:=xlWhole)

con

Set c = .Find(mTesto(0), LookIn:=xlValues, lookat:=xlPart)


saluti




Domenico
Win 10 - Excel 2016
Post: 3
Registrato il: 20/02/2019
Città: CAGLIARI
Età: 50
Utente Junior
2016
OFFLINE
21/02/2019 20:40

Perfetto!! Adesso funziona!

Grazie per il tuo geniale aiuto.

Saluti,
Max
Post: 2.149
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
21/02/2019 21:53

Ok.... Bene, MA.....ipotizza di avere nel tuo elenco excel, in questo ordine, BANCONE e BANCO, quindi due o più parole che iniziano con le stesse lettere. Se nel txt hai BANCO, quella procedura troverà sempre il valore corrispondente a BANCONE (cioè il primo) . Questo perché XlPart cerca una "parte" della parola..... Saluti
[Modificato da dodo47 21/02/2019 21:57]
Domenico
Win 10 - Excel 2016
Post: 8
Registrato il: 20/02/2019
Città: CAGLIARI
Età: 50
Utente Junior
2016
OFFLINE
09/03/2019 22:09

Dodo47, grazie per il tuo ultimo consiglio.
Vorrei riaprire questo thread per risolvere due piccoli dettagli che sono emerso usando la tua macro.

1. Quando si apre la finestra per scegliere il file TXT, se scelgo annulla o chiudo la finestra mi esce il seguente errore:

Run-time error '53':
File not Found

2. Alla fine del file di testo (quello da cui la macro prende i valori) c'e' sempre "/*", che sta nell'ultima riga (il file TXT e' generato da un programma diverso), quando la macro arriva li va in errore. Essendo che e' alla fine del file la macro ha comunque eseguito tutto il suo compito e i dati sono stati copiati dal file TXT al file Excel, ma comunque e' fastidioso dover sempre chiudere la finestra di errore di VBA.

L'errore che mi da e':

Run-time error '9':
Subscript out of range

Mi piacerebbe risolvere questi due punti ma non ci sono ancora riuscito.

Post: 2.174
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
10/03/2019 13:31

ciao
1) magari con una piccola ricerca in internet trovi il modo di gestire quell'errore testando se il filename è false

2) invia un file di testo perchè nonostante i tentativi fatti aggiungendo /* non rilevo l'errore.

saluti



Domenico
Win 10 - Excel 2016
Post: 9
Registrato il: 20/02/2019
Città: CAGLIARI
Età: 50
Utente Junior
2016
OFFLINE
10/03/2019 15:10

Grazie della risposta domenico,
Ti allego il file che a me da errore.
Ho anche notato (non so se puo' essere pertinente) che il file ha degli spazi alla fine dopo /* quindi a due righe aggiuntive vuote.

Max
Post: 2.175
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
10/03/2019 15:45

ma tutte le righe iniziano con "/" ???



Domenico
Win 10 - Excel 2016
Post: 10
Registrato il: 20/02/2019
Città: CAGLIARI
Età: 50
Utente Junior
2016
OFFLINE
10/03/2019 16:04

Si Domenico, perche' il file TXT e' generato da un software e non ho idea del perche'.
Ad ogni modo la tua macro funziona benissimo a parte il piccolo errore alla fine, che quasi sicuramente e' dovuto degli spazi (righe vuote) alla fine fel file.
Ho provato a cancellare manualmente le righe vuote e funziona.

Max
Post: 2.176
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
10/03/2019 16:27

prova:

....
....
Do While Not EOF(1)
    Line Input #1, mText
    If mText <> "" Then '(OPPURE: if mText="/*" then )
        mTesto = Split(mText, ":")
        With Range("A:A")
            Set c = .Find(mTesto(0), LookIn:=xlValues, lookat:=xlPart)
            If Not c Is Nothing Then
                Cells(c.Row, 2) = mTesto(0)
                Cells(c.Row, 3) = mTesto(1)
            End If
        End With
    End If
Loop
....
....


Saluti


[Modificato da dodo47 10/03/2019 18:21]
Domenico
Win 10 - Excel 2016
Post: 11
Registrato il: 20/02/2019
Città: CAGLIARI
Età: 50
Utente Junior
2016
OFFLINE
10/03/2019 19:04

Si questo lavora alla grande.
Ho fatto una piccola modifica per meglio adattarlo al mio file di testo a cui la macro si riferisce. Posto il codice tanto per la cronoca:

macro Get_txt
Sub Get_txt()
Filename = Application.GetOpenFilename(FileFilter:="Text File (*.txt),*.txt")
Open Filename For Input As #1
Do While Not EOF(1)
    Line Input #1, mtext
    If mtext <> "" Then
    mTesto = Split(mtext, ":")
    With Range("P2:P16")
        Set c = .Find(mTesto(0), LookIn:=xlValues, lookat:=xlPart)
        If Not c Is Nothing Then
            Cells(c.Row, 17) = mTesto(0)
            Cells(c.Row, 18) = mTesto(1)
        End If
    End With
    End If
Loop
Close #1
End Sub
Post: 1.233
Registrato il: 27/06/2011
Utente Veteran
excel 2007
OFFLINE
16/03/2019 13:55

quindi............

Domenico ti ha risolto il questito e non sei abbastanza soddsfatto?

non potevi prosieguire con questa discussione?!?!?


vedi qui



ho imparato a conoscere Domenico,
forse hai spiegato il quesito in modo inappropriato.

Ciao

Frank
[Modificato da tanimon 16/03/2019 13:58]







Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
Vota: 15MediaObject5,00316 3
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
maschera per inserimento dati e "cancellazione" seriali (2 messaggi, agg.: 14/11/2019 15:01)
Accorpare dati da 3 tabelle per ordine cronologico (27 messaggi, agg.: 02/10/2020 15:14)
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 18:14. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com