Condividi:        

MT4->TXT->Xls

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

MT4->TXT->Xls

Postdi Gianca532011 » 25/06/11 14:47

Ciao a tutti,
devo acquisire una serie di dati da piattaforma metatrader e sono costretto a importare i dati con formato TXT. Peraltro ho dovuto scartare l'acquisizione DDE ( vedi mia altra discussione) pur avendo configurato, con l'aiuto di Anthony, una macro valida e funzionante, perchè il DDE non fornisce tutti i dati necessari, ma solo alcuni. Mi sono quindi messo alla ricerca di un sistema per ottenere quanto voluto.
Ovvero : da MT4 ottengo dati di un minuto in formato TXT con separatore (;) da qui importo in excel e quindi li gestisco . Il mio problema è che l'istruzione che li traspone dal foglio 1 al foglio 2, e li dovrebbe ordinare in AZ crescente, non va oltre la seconda riga e non riesco a capire dov'è l'inghippo.
Se qualche volenteroso ci dà un occhio, lo ringrazio in anticipo.
Allego entrambi i file .

SE a qualcuno del forum interessa anche il file che in ambiente metatrader produce i dati, selezionabili con frequenza di : 1Min-5 min-15-30-60-240-1440 minuti, non ho problemi a postarlo.
https://rapidshare.com/files/1958351791/Fname3.xlsm
https://rapidshare.com/files/3077840482/EURUSD.txt
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: MT4->TXT->Xls

Postdi Anthony47 » 25/06/11 22:32

Da uno sguardo veloce non ho capito quali sono le istruzioni che traslano da foglio1 a foglio2 e poi ne fa l' ordinamento AZ.
Puoi essere piu' preciso sulla richiesta?

E perche' il file txt lo leggi e lo "parsi" riga per riga invece che Importarlo (Menu /Dati /Imposrta dati esterni /Importa dati, etc)? Tra l' altro puoi impostare l' importazione con "Aggiorna i dati ogni N minuti.

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

Re: MT4->TXT->Xls

Postdi Gianca532011 » 26/06/11 06:03

ciao Anthony,
1) il file TXT è composto da una sola riga ed è già temporizzato a 1 min, oppure, ma è una mia scelta, posso scegliere intervalli superiori 5-15-30 ecc min. operando in Metatrader,
2 ) in excel questo dato in automatico viene copiato nel foglio1 (nel quale non vorrei scrivere altro), quindi trasferisco nel foglio 2 con la seguente istruzione inserita nella macro ImportTextFile

Sheets("foglio1").Range("a2:G2").Copy
Sheets("Foglio2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False

nella stessa macro ho poi inserito un ciclo on time di "interrogazione " temporizzato del file txt.
Il problema è che l'accodamento deve essere con ordine crescente verso il basso: il nuovo dato deve essere messo nella riga immediatamente sotto la precedente in successione infinita, o fino a stop utente.
Grazie.
Gianca
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Gianca532011 » 26/06/11 10:12

Anthony,
cancella tutto quanto nel mio post precedente .
L'interferenza che provocava errore di trasposizione era in una istruzione di cancellazione celle . Sistemato il tutto allego file funzionante correttamente.
Ciao
gianca

https://rapidshare.com/files/1226097175/Fname3b.xlsm
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Anthony47 » 26/06/11 12:51

Mi aveva portato fuori strada il riferimento all' ordinamento AZ che nella macro non esisteva, ne' e' necessario se si accodano dati con un timestamp in col B intrinsecamente crescente.
Ora dici che e' tutto ok, ma mi permetto di avere qualche dubbio:
-Le macro fanno riferimento a Range senza nessun riferimento al foglio; es Range("$A$1:$g$1").Select / Selection.ClearContents azzereranno A1:G1 di qualsiasi sia il foglio selezionato; idem Range("$A$2:$g$5000").Select / Selection.ClearContents. Idem Sheets("foglio1").Range("a2:G2").Copy / Sheets("Foglio2").Cells(Rows.Count, 1).etc etc
-fai un paio di impostazioni quali Set sh = Worksheets("Foglio1"), salvo che poi non usi mai quelle impostazioni. Si perche' l' oggetto impostato con la Set va poi usato, altrimenti rimane una impostazione morta.
Il risultato e' che la macro periodica ora cancella A1:G1 del foglio "corrente".

Quindi non Range("$A$1:$g$1").Select, ma (forse) sh.Range("$A$1:$g$1").Select, che seleziona A1:G1 sul foglio impostato tramite Set; idem su Range("$A$2:$g$5000").Select.

MA questo non e' ancora sufficiente, perche' ad es. Set sh = Worksheets("Foglio1") imposta "SH" come "Foglio1 del worksheet corrente", quindi se mentre quel file con quella macro che lavora in background e raccoglie i dati tu ti metti a lavorare su un altro worksheet, il risultato sara' che ti ritrovi periodicamente con A1:G1 (del foglio corrente o del Foglio1) azzerati, e A1:G1 di Foglio1 copiati in coda al Foglio2; oppure con un errore di "Indice non incluso nell' intervallo" se il file corrente non ha un Foglio1 e un Foglio2.

QUINDI non basta Set sh = Worksheets("Foglio1") ma dovrai meglio usare Set sh = Thisworkbook.Worksheets("Foglio1") (ThisWorkbook equivale a "il file che contiene la macro"); idem non basta Sheets("foglio1").Range("a2:G2").Copy / Sheets("Foglio2").Cells(Rows.Count, 1).etc etc ma sevira'
Thisworkbook.Sheets("foglio1").Range("a2:G2").Copy
Thisworkbook.Sheets("Foglio2").Cells(Rows.Count, 1).etc

Nota che l' uso di Set sh= etc etc e poi l' uso di sh.qualcosa e' una alternativa all' uso esplicito di Thisworkbook.Sheets(etc etc; nel tuo caso (dove sono coinvolti 2 fogli in tutto) potresti anche farne a meno.

Spero di non averti confuso oltre le mie intenzioni :D

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

Re: MT4->TXT->Xls

Postdi Gianca532011 » 26/06/11 17:11

Grazie Anthony,
sia per le rettifiche che per l'intrinseco messaggio ovvero, per come l'ho capito io :

1 --> nella programmazione VBA è necessario attenersi a una sintassi precisa, altrimenti si rischiano svarioni, complicazioni e conseguente perdita di tempo,
2 --> di conseguenza : se x necessità (lavoro) o semplicemente x passione ti viene voglia di utilizzare il VBA, devi imparare dalla basi e non copiare pari pari, adattandoli, i pezzi di macro trovati qua e la.
Cosa appunto che io ho fatto e penso si sia capito...
ciao
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Anthony47 » 26/06/11 23:32

Purtroppo non c' e' "una sintassi precisa" (sarebbe troppo bello: se si sbaglia ti dice Errore di sintassi), ma ogni sintassi ha il suo significato.
Con un po' di esperienza imparerai a conoscere le regole basilari, poi le piu' importanti e poi qualche trucco; basta non demordere.

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

Re: MT4->TXT->Xls

Postdi Gianca532011 » 24/07/11 17:28

Stesso progetto, nuovo problema.
Il sistema mi aggiorna i dati da file TXt collegato a piattaforma MT4, via macro trasferisco in foglio excel, da qui elaboro.
Il problema che mi si presenta è il seguente :
i dati in ingresso vanno a a finire in una serie di colonne , tipo A6: G 1000, con a lato le altre colonne di calcolo. Se per un qualsiasi motivo ho due righe doppie con gli stessi valori le formule impazziscono (giustamente) e mi danno errore (#DIV/0!) e il sistema si blocca con l'acquisizione.
A questo punto sto tentando di inserire trovato una macro che nelle mie intenzione dovrebbe rimuovere i soli dati doppi dell'intervallo AX:GX, e non l'intera riga.
la macro è la seguente :

Codice: Seleziona tutto
Sub puliscizona()

Set currentCell = Worksheets("foglio2").Range("B6")
Do While Not IsEmpty(currentCell)
Set nextCell = currentCell.Offset(1, 0)
If nextCell.Value = currentCell.Value Then
currentCell.ClearContents
End If
Set currentCell = nextCell
Loop
Range("B7").Select

End Sub


Come si fa ad aggiustarla in modo da cancellare le celle ripetute utilizzando la col. b come puntatore di riferimento.?
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Flash30005 » 24/07/11 18:24

Dal tuo post non riesco a capire bene se i tuoi dati sono da AX e GX oppure la macro da te trovata lavora su quel range e vorresti renderla idonea per la colonna B (come da tua ultima frase)

E se i tuoi dati sono da AX a GX vorresti cancellare il contenuto delle sole (e singole) celle identiche
es se AX3 = 4 e AY3 = 6
e AX4 = 4 e AY4 = 7
cancellare solo la cella AX4
(stesso procedimento fino alla colonna GX (quindi AY, AZ...)
oppure se tutte le celle da AX3 a GX3 sono uguali
al range da AX4 a GX4 cancellare tutto il range

Un'ultima ma non meno importante
Puoi implementare la formula inserendo la condizione
ad esempio:
Codice: Seleziona tutto
=SE(G6="";"";A6/G6)

In questa maniera eviteresti l'errore Divisione per Zero

Fai sapere
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: MT4->TXT->Xls

Postdi Gianca532011 » 24/07/11 19:20

chiarisco.
I miei dati sono in riga da Ax a Gx; la loro implementazione è continua e, una volta verificato che esiste un doppione , (sulla base dei dati tempo della col. B) devo cancellare solo l'ultima riga doppia ( importante: che sia l'ultima, altrimenti mi si creano buchi nei grafici collegati) .
grazie.
gianca53

ps. come si fa ad allegare/inviare una immagine ?
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Flash30005 » 24/07/11 20:18

Per allegare un file o per inviare un'immagine segui la procedura idonea all'esigenza specificata in questo topic
http://www.pc-facile.com/forum/viewtopic.php?f=26&t=80395
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: MT4->TXT->Xls

Postdi Gianca532011 » 25/07/11 05:07

Ok, grazie .
Allego esempio.
Ciao gianca53

https://rapidshare.com/files/1804542417/esempio.doc
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Flash30005 » 25/07/11 09:49

Ma come fa a crearsi una riga doppia?
vedo, dalla colonna B, che i tempo di aggiornamento è impostato a due minuti quindi B sarà sempre diverso da riga a riga
se prendiamo anche B come riferimento non avrai mai una riga doppione anche se tutti gli altri valori sono uguali
quindi penso che le colonne da controllare siano
la colonna A (data)
la colonna C, D, E, F, G
quando hai questi sei valori identici, il range A:G della seconda riga delle due deve essere cancellato?
Inoltre quando vorresti che avvenisse questo controllo?
ad ogni aggiornamento di B?
Se mi dai conferma procedo con la realizzazione della macro

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: MT4->TXT->Xls

Postdi Gianca532011 » 25/07/11 10:16

Ciao Flash,
ti rispondo in ordine :
1) la riga doppia mi si forma quando, ad esempio, cade la connessione internet, in questo caso excel continua a trasporre i dati con frequenza di 2 min , ma il file da cui li preleva (txt abbinato alla metatrader) è "inchiodato" e non acquisisce nulla. In pratica l'architettura è la seguente : MT4 ---> File Txt ----> Excel

2 ) la seconda riga in Ax:Gx , o se vuoi la prima riga doppia, è quella da cancellare,

3) il controllo è da effettuare prima di una nuova immissione, allo scopo ho previsto che la macro venga richiamata da una istruzione (call....) da inserire nel progetto prima di una ulteriore chiamata alla macro che mi gestisce la lettura a tempo dei nuovi dati.
non so se sono stato chiaro.
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Flash30005 » 25/07/11 10:20

Si ok
Allora prova questa macro
Codice: Seleziona tutto
Sub EliminaDoppie()
Dim Str1, Str2 As String
UR = Range("A" & Rows.Count).End(xlUp).Row
Str1 = ""
Str2 = ""
For ST = 1 To 6
    If ST <> 2 Then     '<<<<<<<<<<<<<<<<<<<<< Togliere nel caso voglia controllare anche il valore nella colonna B
        Str1 = Str1 & Cells(UR - 1, ST).Value
        Str2 = Str2 & Cells(UR, ST).Value
        If Str1 = Str2 Then Range("A" & UR & ":G" & UR).ClearContents
    End If       '<<<<<<<<<<<<<<<<<<<<< Togliere nel caso voglia controllare anche il valore nella colonna B
Next ST
End Sub


Testata e funzionante
chiaramente la richiamerai con una Call...

fai sapere
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: MT4->TXT->Xls

Postdi Gianca532011 » 25/07/11 15:37

ciao,
la macro funziona ma non mi fa lo scroll in avanti delle nuove righe acquisite. In pratica sovrappone sempre sulla stessa riga.
Che fare ? sbaglio l'inserimento della call ? ti mando la macro principale. Come vedi ho provato a l'inserire la call sia in fondo che all'inzio della macro, in entrambi i casi non c'è scroll in basso dei nuovi dati.
grazie ancora
Gianca53


Codice: Seleziona tutto
Private Sub ImportTextFile(FName As String, Sep As String)

Dim RowNdx As Long
Dim ColNdx As Integer
Dim TempVal As Variant
Dim WholeLine As String
Dim Pos As Integer
Dim NextPos As Integer
Dim SaveColNdx As Integer

Dim sh As Worksheet
Dim RngIn As Range
Dim RngOut As Range
Dim iRow As Long
Dim CalcMode As Long

Application.ScreenUpdating = False
'On Error GoTo EndMacro:
Call EliminaDoppie
Worksheets("Foglio1").Activate
    Range("$A$1:$g$1").Select
    Selection.ClearContents

SaveColNdx = ActiveCell.Column
RowNdx = ActiveCell.Row
FName = "C:\Users\giancarlo\AppData\Local\VirtualStore\Program Files\Alpari ÌÒ4\experts\files\EURUSD.txt"
Open FName For Input Access Read As #1

While Not EOF(1)
    Line Input #1, WholeLine
    If Right(WholeLine, 1) <> Sep Then
        WholeLine = WholeLine & Sep
    End If
    ColNdx = SaveColNdx
    Pos = 1
    NextPos = InStr(Pos, WholeLine, Sep)
    While NextPos >= 1
        TempVal = Mid(WholeLine, Pos, NextPos - Pos)
        Cells(RowNdx, ColNdx).Value = TempVal
        Pos = NextPos + 1
        ColNdx = ColNdx + 1
        NextPos = InStr(Pos, WholeLine, Sep)
    Wend
    RowNdx = RowNdx + 1
Wend

EndMacro:
On Error GoTo 0
Close #1

Range("$a$2:$g$2").Select
Selection.Copy
Worksheets("Foglio2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Application.ScreenUpdating = True
'Call EliminaDoppie

Call mStart

End Sub


Sub EliminaDoppie()
Worksheets("Foglio2").Activate
Dim Str1, Str2 As String
UR = Range("A" & Rows.Count).End(xlUp).Row
Str1 = ""
Str2 = ""
For ST = 1 To 6
    If ST <> 2 Then     '<<<<<<<<<<<<<<<<<<<<< Togliere nel caso voglia controllare anche il valore nella colonna B
        Str1 = Str1 & Cells(UR - 1, ST).Value
        Str2 = Str2 & Cells(UR, ST).Value
        If Str1 = Str2 Then Range("A" & UR & ":G" & UR).ClearContents
    End If       '<<<<<<<<<<<<<<<<<<<<< Togliere nel caso voglia controllare anche il valore nella colonna B
Next ST
End Sub
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Flash30005 » 25/07/11 16:09

Vedo una chiamata ad una macro Mstart (cosa fa?)
secondo me dovresti mettere la call dopo questa chiamata
in pratica prima dell'end sub
inoltre vedo che passi da foglio1 a foglio2
e il cancella doppie attiva il foglio2
è questo il foglio sul quale vuoi eliminare le doppie?
ma per caso le hai anche sul foglio1 le righe doppie e poi vengono riportate nel foglio2?
Inoltre se hai il file Txt con righe uguali te le ritroverai uguali ogni volta che ricarichi il file txt
a meno che non hai sempre un nuovo file.txt
insomma devi analizzare meglio la situazione
anche perché non ho la possibilità di testare l'intero programma senza tutti i file che lo fanno funzionare

Per provare la macro eliminadoppie
copia l'ultima riga nella riga successiva in maniera da avere le ultime due righe uguali
poi avvia solo la macro eliminadoppie vedrai cancellare il range An:Gn dell'ultima riga

Fai sapere
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: MT4->TXT->Xls

Postdi Gianca532011 » 29/07/11 08:19

Nulla da fare. Non và, cioè la macro funziona, rimuove puntualmente l'ultima riga doppia ma dopo impedisce alle altro macro di inserire nuovi dati. Ci sono alternative/modifiche da fare ?
grazie.
gianca53
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Gianca532011 » 29/07/11 19:57

Ho trovato questa macro che, come logica di lavoro, si adatta al 90 % a quanto devo fare io , ovvero fa una ricerca sulla base dei doppioni presenti in colonna "B" e poi cancella la riga , mentre io ho bisogno che cancelli solo il range Ax:Gx del doppione. Si può adattare ? oppure sono proprio logiche di lavoro troppo diverse ?

grazie.

Codice: Seleziona tutto
Sub EliminaDoppioni()
'Questo codice ordina i dati nella seconda
'colonna del foglio Dati ed elimina le righe che 'contengono dati duplicati.
Application.ScreenUpdating = False
Range("B4:B800").Select
Selection.Sort Key1:=Range("B4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Set currentCell = Worksheets("Dati").Range("B4")
Do While Not IsEmpty(currentCell)
Set nextCell = currentCell.Offset(1, 0)
If nextCell.Value = currentCell.Value Then
currentCell.EntireRow.Delete
End If
Set currentCell = nextCell
Loop
Range("B4").Select

End Sub
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: MT4->TXT->Xls

Postdi Gianca532011 » 29/07/11 20:49

Sorry,
non tenete conto della precedente. Ho risolto come segue:

Codice: Seleziona tutto
Sub Remove()
Worksheets("Foglio2").Select
    Range("A6:g1000").Select
    ActiveSheet.Range("$A$6:$g$1000").RemoveDuplicates Columns:=2, Header:= _
        xlYes
End Sub

Semplice, funzionale e funzionante.
Saluti.
Gianca53
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Prossimo

Torna a Applicazioni Office Windows

Chi c’è in linea

Visitano il forum: Nessuno e 55 ospiti