Condividi:        

[Excel] Trasferire dati in file txt con VBA

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

[Excel] Trasferire dati in file txt con VBA

Postdi foreights » 30/08/06 10:04

Salve,
eccomi con una questione che credo sia nuova nel forum. O, almeno, ho provato a cercare prima, con varie parole chiave, ma non vi sono riuscito.

Dunque, la questione è la seguente.
In un foglio di lavoro excel ho dei dati di borsa che a fine serata aggiorno con un collegamento DDE. Fin qui tutto bene.

Ora, però, vorrei effettuare tale aggiornamento (anche) su un file di testo al fine di poter leggere gli stessi dati anche con altre applicazioni più specifiche per l'analisi dei dati di borsa.

Il primo problema che mi si presenta è la scelta del formato del file: .txt oppure .prn? Se fosse possibile per me andrebbe bene il primo dei due.

Secondo problema. I dati dovrebbero essere organizzati in record ognuno dei quali costituito da 5 campi: data, open, high, low, close. Attualmente sono residenti sul foglio di lavoro a cui accennavo prima ed organizzati proprio in questo modo: un determinato numero di righe, una per ogni giorno di contrattazione. Quale metodo utilizzo? C'è qualche routine tipo da poter esaminare a scopo didattico?

Grazie per l'attenzione.
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Sponsor
 

Postdi taurex » 30/08/06 10:20

provaa con questo codice:
Codice: Seleziona tutto
Public Sub mEsportaTxt()
    Dim lng As Long
    Dim nr As Long
    Dim colA, colB, colC, colD, colE As String
    Dim s As String
    Dim rec As String
    Dim FileNum As Integer

    With Worksheets("Foglio2")
        nr = .Range("A65536").End(xlUp).Row
        For lng = 1 To nr
            rec = ""
            colA = Cells(lng, 1).Value
            colB = Cells(lng, 1).Value
            colC = Cells(lng, 1).Value
            colD = Cells(lng, 1).Value
            colE = Cells(lng, 1).Value
            rec = colA & colB & colC & colD & colE
            s = s & Mid(rec, 1, Len(rec) - 1) & vbCrLf
        Next
    End With
        FileNum = FreeFile
        Open "C:\temp\taurex.txt" For Output As #FileNum
        Print #FileNum, Mid(s, 1, Len(s) - 1)
        Close FileNum
End Sub
Moderatore di
Immagine
taurex
Utente Senior
 
Post: 145
Iscritto il: 09/08/06 09:34
Località: Asti

Postdi foreights » 30/08/06 12:04

Taurex, ti ringrazio per il codice proposto. Prima di provarlo, sempre per motivi didattici, vorrei vedere se ho capito bene cosa fa il programma.

Allora, sul dimensionamento delle variabili ci siamo.

Nel ciclo with-end with:

- assegni alla variabile nr che cosa? Forse l'ultimo numero di riga disponibile?

- poi, nel ciclo for to next, fai variare la variable LNG da 1 ad nr

- assegni a rec una stringa nulla e poi concateni i contenuti delle celle della prima riga e delle prime cinque colonne; ma forse qui c'è un errore (oppure non ho capito io cosa fai): forse le assegnazioni dovrebbero essere:
colA = Cells(lng, 1).Value
colB = Cells(lng, 2).Value
colC = Cells(lng, 3).Value
colD = Cells(lng, 4).Value
colE = Cells(lng, 5).Value

giusto?

- prendi i primi n-1 caratteri della stringa rec (e non ho capito perchè i primi n-1), ci aggiungi il CRLF, e metti tutto nella variabile s

- FileNum = FreeFile
Open "C:\temp\taurex.txt" For Output As #FileNum
Print #FileNum, Mid(s, 1, Len(s) - 1)
(qui ho capito poco e niente).

Mi dai una mano?
Grazie.

- :)
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi taurex » 30/08/06 12:14

foreights ha scritto:- assegni alla variabile nr che cosa? Forse l'ultimo numero di riga disponibile?
Esatto
foreights ha scritto:- assegni a rec una stringa nulla e poi concateni i contenuti delle celle della prima riga e delle prime cinque colonne; ma forse qui c'è un errore (oppure non ho capito io cosa fai): forse le assegnazioni dovrebbero essere:
colA = Cells(lng, 1).Value
colB = Cells(lng, 2).Value
colC = Cells(lng, 3).Value
colD = Cells(lng, 4).Value
colE = Cells(lng, 5).Value
giusto?
si ho sbagliato a trascrivere
foreights ha scritto:(e non ho capito perchè i primi n-1)
questo perchè nella mia ipotesi, la riga con le intestazioni non viene presa
foreights ha scritto:- FileNum = FreeFile
Open "C:\temp\taurex.txt" For Output As #FileNum
Print #FileNum, Mid(s, 1, Len(s) - 1)
(qui ho capito poco e niente).
questo serve per scrivere quanto memorizzato sul file txt (in questo caso io ho scritto un file mio per provare)
foreights ha scritto:Mi dai una mano?
Grazie.- :)

Dimmi se hai ancora dubbi...
Moderatore di
Immagine
taurex
Utente Senior
 
Post: 145
Iscritto il: 09/08/06 09:34
Località: Asti

Postdi foreights » 30/08/06 12:33

Grazie Taurex, la nebbia comincia a diradarsi.

Allora, se ho capito bene freefile è un nome di fantasia per indicare il nome del file txt che dovrà accogliere i dati contenuti nel foglio. Giusto?

Ma perchè il nome della variabile che contiene tale nome è dimensionata come integer?

Però poi, nell'istruzione open ..., tu apri un file di nome taurex.txt. Non capisco.

Print ..., serve per scrivere nel file? Anche qui, vai a scrivere i primi n-1 caratteri di s. Ma s, ora, contiene tutti i dati. Qual'è la necessità di eliminarne l'ultimo?

Ultima domanda: il giorno dopo, quando il file già esiste, avrò necessità di fare un append. Come faccio?

Ciao e grazie.
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi taurex » 30/08/06 14:32

foreights ha scritto:Grazie Taurex, la nebbia comincia a diradarsi.
bene
foreights ha scritto:Allora, se ho capito bene freefile è un nome di fantasia per indicare il nome del file txt che dovrà accogliere i dati contenuti nel foglio. Giusto?
Sbagliato. FreeFile serve ad evitare un errore di "file gia' aperto"
foreights ha scritto:Print ..., serve per scrivere nel file? Anche qui, vai a scrivere i primi n-1 caratteri di s. Ma s, ora, contiene tutti i dati. Qual'è la necessità di eliminarne l'ultimo?
in fondo magari hai il totale e così lo elimini
foreights ha scritto:Ultima domanda: il giorno dopo, quando il file già esiste, avrò necessità di fare un append. Come faccio?
Ciao e grazie.
aspetta per questo che ci studio un attimo
Moderatore di
Immagine
taurex
Utente Senior
 
Post: 145
Iscritto il: 09/08/06 09:34
Località: Asti

Postdi taurex » 30/08/06 14:36

foreights ha scritto:Ultima domanda: il giorno dopo, quando il file già esiste, avrò necessità di fare un append. Come faccio?
sono proprio stanco oggi, è la cosa più facile....
invece di
Codice: Seleziona tutto
Open "C:\temp\taurex.txt" For Output As #FileNum
usa
Codice: Seleziona tutto
Open "C:\temp\taurex.txt" For append As #FileNum
foreights ha scritto:Ciao e grazie.
Prego ;)
Moderatore di
Immagine
taurex
Utente Senior
 
Post: 145
Iscritto il: 09/08/06 09:34
Località: Asti

Postdi foreights » 30/08/06 16:48

Ti ringrazio Taurex.
Ora mi rileggo tutto, metto assieme le varie parti di codice e ci provo.
Poi ti faccio sapere se tutto è andato a buon fine.
Grazie ancora.
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Anthony47 » 30/08/06 22:13

Non so se puo' essere utile, ma se si salva in formato txt allora "il foglio corrente" viene salvato in un file testo con le colonne separate da tab.
Ad esempio si puo' usare il seguente codice:
Codice: Seleziona tutto
Sub MacroTxt()
    ActiveWorkbook.Save
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="BORSA_YAHOO.txt", FileFormat:=xlText, CreateBackup:=False
End Sub


La macro fa prima un salvataggio del file nel formato originale, poi salva il foglio attivo in formato txt; ragionevolmente, finita l' operazione il file andrebbe chiuso.

Ovviamente il nome file puo' essere esplicito, ad esempio "C:\Documents and Settings\User_Name\Desktop\PC-FACILE\BORSA_YAHOO.txt", come pure puo' essere utile inserire uno statement di selezione del foglio desiderato.

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

Postdi foreights » 31/08/06 16:41

Premetto che la soluzione suggerita da Taurex l'ho provata e funziona. Ho anche fatto una piccola variazione: ovvero quella di aggiungere uno spazio tra un campo e l'altro del record.

Pongo ad Anthony47, che intanto ringrazio per l'ulteriore soluzione proposta, due domande:

1. se invece del tab, come separatore, volessi lo spazio?

2. e per fare esclusivamente un append dell'ultimo record registrato (quello della giornata odierna)?

Grazie ancora.
:)
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Anthony47 » 01/09/06 02:15

Ciao.
Il metodo del salvataggio in formato txt e’ una alternativa “povera” alla soluzione vba; tra i vantaggi, la semplicita’ realizzativa e la possibilita’ di personalizzare di volta in volta la quantita’ e l’ organizzazione delle informazioni da salvare; ad esempio puoi concatenare su un foglio ad-hoc le colonne che vuoi esportare nella sequenza voluta e usando il separatore preferito (esempio: =TESTO(OGGI();”aa-mm-gg ”)&A1&” - “&C1&” - “&H1&” - “&D1).

Venendo alle tue domande:
1) ufficialmente il formato .prn e’ dichiarato “space separated”; quello che si ottiene e’ un testo ben ordinato come su carta, compreso eventuali caratteri mancanti se la colonna su excel non era larga abbastanza e i caratteri allineati a dx che toccano quelli allineati a sx.
2) non so cosa intendi per “ultimo record registrato (quello della giornata odierna)”: per me un record e’ una riga di informazioni, vuoi dire che controlli un unico titolo?
Comunque, se (come mi sembra di capire dal tuo primo post del 30-8) tutte le righe (quelle storiche e quella/quelle del giorno) sono residenti sul foglio excel, piu’ che giocare sull’ append a un file esistente (lavoro di fino) io riscriverei tutto il file in toto.
Oppure
-ti organizzi su un worksheet la riga del giorno
-la salvi in .txt o .prn in un file di nome noto (es. pippo.prn)
-lanci da macro un .bat (che hai creato precedentemente) che appende pippo.prn al tuo file storico (COPY PIPPO.PRN >>STORICO.TXT ma e’ meglio mettere i path completi!)
Per lanciare da vba lanci il file .bat userai qualcosa come
Codice: Seleziona tutto
Shell (“C:\ etcetera etcetera\ILMIO.bat”)


Ad esempio la macro che ti ho postato il 30-8 diventerebbe
Codice: Seleziona tutto
Sub MacroTxt()
    ActiveWorkbook.Save
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="BORSA_YAHOO_qqqxxx.txt", FileFormat:=xlText, CreateBackup:=False
Shell ("c:\ilmio.bat")
End Sub


Spero che in tutto questo trovi qualche spunto utile.

Ciao.

PS: le domande di x8 sono per tutti i frequentatori del forum; quindi: avanti con i contributi
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Alexsandra » 01/09/06 07:29

Io vorrei portare la vostra attenzione su un altro metodo.

Se si apre il file "For Binary" ????? e copiate i dati della giornata mettendo come inizio un flag racchiuso entra i tag ([Alex], questo tag và solo all'inizio)
come verrebbe il tutto?.

In giornata vi recupero il codice e vediamo cosa ne vien fuori :D
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi foreights » 01/09/06 09:05

Grazie ad Anthony47 per tutti gli spunti che ha fornito: ci ragiono sopra.
Invece non ho capito bene l'idea di Alexsandra. Attendo il codice per un po' più di luce.
;)
foreights
Utente Junior
 
Post: 46
Iscritto il: 12/08/06 15:10
Località: Roma

Postdi Alexsandra » 01/09/06 12:52

foreights ha scritto:..... Attendo il codice per un po' più di luce.
;)
Lì ci pensa l'ENEL :lol: :lol: :lol: :lol: :lol:
lo metto stasera,ora sono in ufficio.
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Re: [Excel] Trasferire dati in file txt con VBA

Postdi marpar » 30/04/12 11:16

Volendo semplificare il tutto per una sola colonna (la A), evitare che la stringa venga troncata alla fine ed aggiungere solo LF adattando il tutto per MAC per quanto riguarda la dir (scusate so che siamo su Applicazioni Office Windows) dovrei fare come di seguito o esiste un modo più elegante....
Grazie a tutti!!!
Marco

Codice: Seleziona tutto
Public Sub mEsportaTxt()
    Dim lng As Long
    Dim nr As Long
    Dim colA As String
    Dim s As String
    Dim rec As String
    Dim FileNum As Integer

    With Worksheets("0130.xml")
        nr = .Range("A65536").End(xlUp).Row
        For lng = 1 To nr
            rec = ""
            colA = Cells(lng, 1).Value
            rec = colA
            s = s & Mid(rec, 1, Len(rec)) & vbLf
        Next
    End With
        FileNum = FreeFile
        Open "Mac HD:Users:Marco:Desktop:0130.xml" For Output As #FileNum
        Print #FileNum, Mid(s, 1, Len(s))
        Close FileNum
End Sub
marpar
Newbie
 
Post: 8
Iscritto il: 30/04/12 11:07

Re: [Excel] Trasferire dati in file txt con VBA

Postdi Flash30005 » 30/04/12 12:50

Ciao Marpar e benvenuto nel Forum

Elegante o funzionale? :D
Vedi se ti garba questa macro
Codice: Seleziona tutto
Sub ScriveTxt()
UR = Range("A" & Rows.Count).End(xlUp).Row
Perc = "C:\Temp\"    '<<<<<<<<<<<<<<<<<<<<<<<<<< inserisci il percorso effettivo
Open Perc & "Pippo.txt" For Output As #1    '<<<<<<<<<<<< cambia il nome al file secondo l'esigenza
For RR = 1 To UR
Print #1, Range("A" & RR).Value
Next RR
Close #1
End Sub


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: [Excel] Trasferire dati in file txt con VBA

Postdi marpar » 30/04/12 13:05

Grazie Flash lavora alla grande!!! :)

Ho imparato altre cose tra cui, correggimi se sbaglio, RR equivale a vbLf...
marpar
Newbie
 
Post: 8
Iscritto il: 30/04/12 11:07

Re: [Excel] Trasferire dati in file txt con VBA

Postdi Flash30005 » 30/04/12 15:35

Non proprio
RR è una variabile che assume in questo caso il numero di riga da 1 a UR (la varibile che calcola le righe nella colonna A del foglio)
quindi Range("A" & RR).Value
è il valore (o ciò che contiene) la cella A1, poi A2, poi A3
e scrive bel file una riga alla volta con
Print #1, Range("A" & RR).Value
a differenza della tua macro che "caricava" l'intera colonna A in una unica varibile (con gli "a capo") per poi scriverla nel file testo.

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: [Excel] Trasferire dati in file txt con VBA

Postdi marpar » 30/04/12 18:36

Ma allora ad aggiunger LF a fine riga ci pensa la funzione Print?
E se in vece di LF volessi aggiungere CRLF cosa dovrei fare?
Grazie
Ciao
marpar
Newbie
 
Post: 8
Iscritto il: 30/04/12 11:07

Re: [Excel] Trasferire dati in file txt con VBA

Postdi Flash30005 » 30/04/12 21:33

Print #1,
pensa a scrivere una riga (o record) nel file testo
non occorre nella LF o CRLF
Se vuoi avere una riga vuota che intervalli un dato dall'altro aggiungi una Print#1 in questa maniera
Codice: Seleziona tutto
Sub ScriveTxt()
UR = Range("A" & Rows.Count).End(xlUp).Row
Perc = "C:\Temp\"    '<<<<<<<<<<<<<<<<<<<<<<<<<< inserisci il percorso effettivo
Open Perc & "Pippo.txt" For Output As #1    '<<<<<<<<<<<< cambia il nome al file secondo l'esigenza
For RR = 1 To UR
Print #1, Range("A" & RR).Value
Print #1  '<<<<<<<<<<<<<<<<<< questo codice lo puoi mettere qui (sotto) o sopra alla riga precedente
Next RR
Close #1
End Sub


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Trasferire dati in file txt con VBA":


Chi c’è in linea

Visitano il forum: Nessuno e 73 ospiti