Modificare file testo con excel



  • Modificare file testo
    di Enzo (utente non iscritto) data: 11/05/2009

    Ciao a tutti avrei bisogno di un aiuto in merito al trattamento di file di testo
    mi spiego
    ho un file di testo con dei record tutti la stessa lunghezza solo che hanno una particolarita'
    ossia il primo record inizia per zero il secondo per uno poi posso avere diversi record inizianti per 2 poi uno con otto ed uno per 9
    subito dopo posso avere altri blocchi sempre allo stesso modo ossia uno per zero uno che inizia per uno
    tanti altri per due sempre uno per otto ed uno per nove
    riepilogando ogni blocco e' formato dalla sequenza che ho appena elencato
    come posso fare affinche ogni blocco possa essere copiato in un file txt singolo ossia avere tanti file txt per ogni
    singolo blocco
    spero di essermi spiegato



  • di Ricky53 data: 11/05/2009

    Ciao enzo,

    le gestione dei file txt:
    apertura e scrittura è stata affrontata da me con te altre volte e dovresti avere ancora una macro che legge un file e ne scrive un altro.

    utilizzando lo schema di base puoi
    leggendo in input il tuo file,
    caricare una array,
    controllare (if) che il primo carattere mid(dato, 1, 1) = 9 then ...
    qui scrivi i dati presenti nella array in un nuovo file
    il cui nome lo puoi comporre con una variabile che incrementi ogni volta che trovi "9",
    azzeri l'array
    prosegui fino a fine file

    ... lavoraci sopra

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 12/05/2009

    Ciao ricky, ho diverse casistiche che trattano il problema dei file txt
    il problema che mi tira scemo e dire all'istruzione di chiudere il blocco quando arriva a 9
    ci provo per l'ennesima volta
    ciao



  • di Ricky53 data: 12/05/2009

    Ciao enzo,

    lo avevo già scritto:
    ...
    controllare (if) che il primo carattere mid(dato, 1, 1) = 9 then ...
    qui scrivi i dati presenti nella array in un nuovo file
    il cui nome lo puoi comporre con una variabile che incrementi ogni volta che trovi "9",
    azzeri l'array
    ...

    prova a lavorarci e, se non ne esci e mi mandi il codice che stati utilizzando, ti scrivo bene le istruzioni.

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 12/05/2009

    Ciao ricky ho provato con l'istruzione qui sotto
    conto quanti record iniziano per 8 per sapere quanti file devo costruire
    il problema e' successivo in quanto non riesco a copiare i blocchi per file
    ho provato ad allegarti il file txt
    se riesci a darmi una mano te ne sarei grato
    p.s. ti spiego il file txt
    ha il primo record di apertura che comincia per 0 e l'ultimo di chiusura che comincia per 9 che devono essere presenti in tutti i file
    i blocchi successivi ossia quelli che cominciano per 1 per 2 per 8 costituiscono i blocchi presenti nei file ossia
    ogni singolo file deve essere
    0
    1
    2
    2
    2
    8
    9
    oppure
    0
    1
    2
    8
    9
    non so se sono stato chiaro

     
    Open "C:PROVAMULTIPLO.TXT" For Input As #1
    CONTA = 0
    Do Until EOF(1)
    Line Input #1, DATA
    DATO = Mid(DATA, 1, 1)
    If DATO = 8 Then
    CONTA = CONTA + 1
    End If
    Loop
    Close
    For I = 1 To CONTA
    Open "C:PROVAMULTIPLO.TXT" For Input As #1
    Open "C:" & I & ".TXT" For Output As #2
    Do Until EOF(1)
    Line Input #1, DATA
    DATO = Mid(DATA, 1, 1)
    If DATO = 0 Or DATO = 1 Or DATO = 2 Or DATO = 8 Then
    Print #2, DATA
    Close
    End If
    Loop
    Close
    Next I



  • di Ricky53 (utente non iscritto) data: 12/05/2009

    Ciao enzo,
    adesso non posso rimandiamo a questa sera.
    comuqnue
    devi aprire fuori ciclo l'input
    ciclare con il fine file eof
    se il tipo è "0" ----> con if mid(dato, 1,1) = "0" then ...
    apri l'output
    scrivi i vari tipi tutti e sempre
    se il tipo è "9" chiudi l'output ----> con if mid(dato, 1,1) = "0" then ...
    ...

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 12/05/2009

    E' mia abitudine non demandare ad altri quello che cerco di voler fare ma prima ho sintetizzato tutti i tentativi che ho cercato di fare ma non riuscendo nell'intento.
    se vorrai inviarmi un esempio sulla base del file txt che ti ho inviato (scusa il gioco di parole) te ne sarei grato.
    p.s. quando il tuo tempo te lo consente.
    ciao e grazie di nuovo



  • di Ricky53 data: 12/05/2009

    Ciao,
    non ho fatto la pausa "biscottini"
    ed ho buttato giù una macro prendendone una che avevo fatto tempo fa (forse per te ...) tagliando e modificando.

    ad occhio: dovrebbe funzionare.
    provala e fammi sapere

    ciao da ricky53
     
    Option Explicit
    Public I As Integer, Scritti As Integer, Dato_Letto As String, Nome_Inp As String, Nome_Out As String, Nome_App As String
    
    Sub Dividi_File()
        Nome_Inp = "C:Multiplo.txt"
        On Error GoTo Errore1
        Open Nome_Inp For Input As #1
        Nome_Out = "Multiplo_"
        I = 1
        Do Until EOF(1)
            Line Input #1, Dato_Letto
            If Mid(Dato_Letto, 1, 1) = 0 Then
                On Error GoTo Errore2
                Nome_App = "C:" & Nome_Out & Format(I, "00") & ".txt"
                Open Nome_App For Output As #2
                Scritti = 0
            End If
            Print #2, Dato_Letto
            Scritti = Scritti + 1
            If Mid(Dato_Letto, 1, 1) = 9 Then
                Close 2
                MsgBox "Effettuata scrittura del file: " & Nome_App & "    con " & Scritti & " record"
                I = I + 1
            End If
        Loop
        Close 1
        GoTo Fine
    Errore1:
        MsgBox "Errore sul file: " & Nome_Inp
        GoTo Fine
    Errore2:
        MsgBox "Errore sul file: " & Nome_Out
    Fine:
        MsgBox "Fine Elaborazione. Scritti: " & I - 1 & "  File"
    End Sub



  • di Enzo (utente non iscritto) data: 12/05/2009

    Ciao ricky ti ringrazio per il tempo dedicato
    ho provato la tua istruzione ma appena parte mi da errore sul file in apertura
    ho solamento modificato il percorso dove aprire il file ma non va
    non so dove sbaglio
    l'errore e' su

    msgbox "errore sul file: " & nome_inp
    poi
    msgbox "fine elaborazione. scritti: " & i - 1 & " file"
    ossia mi restituisce fine elaborazione scritti -1 file
     
    Option Explicit
    Public I As Integer, Scritti As Integer, Dato_Letto As String, Nome_Inp As String, Nome_Out As String, Nome_App As String
    Sub Dividi_File()
        Nome_Inp = "C:UsersENZOMULTIPLO.TXT"
        On Error GoTo Errore1
        Open Nome_Inp For Input As #1
        Nome_Out = "Multiplo_"
        I = 1
        Do Until EOF(1)
            Line Input #1, Dato_Letto
            If Mid(Dato_Letto, 1, 1) = 0 Then
                On Error GoTo Errore2
                Nome_App = "C:UsersENZO" & Nome_Out & Format(I, "00") & ".txt"
                Open Nome_App For Output As #2
                Scritti = 0
            End If
            Print #2, Dato_Letto
            Scritti = Scritti + 1
            If Mid(Dato_Letto, 1, 1) = 9 Then
                Close 2
                MsgBox "Effettuata scrittura del file: " & Nome_App & "    con " & Scritti & " record"
                I = I + 1
            End If
        Loop
        Close 1
        GoTo Fine
    Errore1:
        MsgBox "Errore sul file: " & Nome_Inp
        GoTo Fine
    Errore2:
        MsgBox "Errore sul file: " & Nome_Out
    Fine:
        MsgBox "Fine Elaborazione. Scritti: " & I - 1 & "  File"
    End Sub
    



  • di Ricky53 data: 13/05/2009

    Ciao enzo,
    hai l'errore perchè il file inserito in nome_inp
    nome_inp = "c:usersenzomultiplo.txt"

    non si trova nel percorso che hai scritto: c:usersenzo
    o non sichiama così: multiplo.txt

    controlla bene.

    ciao da ricky53




  • di Enzo (utente non iscritto) data: 13/05/2009

    Ciao ricky, allora ho bypassato l'errore di ieri in quanto era giusto solo che il mio portatile mi da i numeri
    ho provato l'istruzione al lavoro e funziona in quanto mi va a leggere il file di input
    il problema e' nel file di scrittura in quanto non mi spezza il file in tanti file ma mi duplica esattamente il file di input (multiplo per intenderci , come contenuto)
    i file che intendo creare sono quelli nell'esempio qui sotto





     
    ossia
    se nel file di input ho
    0apertura
    1aaaaa
    2aaaaa
    2aaaaa
    2aaaaa
    8aaaaa
    1bbbbb
    2bbbbb
    2bbbbb
    8bbbbb
    9chiusura
    ''''''''''''''''''''''''''
    dovro' avere il primo file
    0apertura
    1aaaaa
    2aaaaa
    2aaaaa
    2aaaaa
    8aaaaa
    9chiusura
    ''''''''''''''''''''''''
    il secondo file
    0apertura
    1prova
    2bbbbb
    2bbbbb
    8bbbbb
    9chiusura
    etc etc
    



  • di Enzo (utente non iscritto) data: 13/05/2009

    Scusa i file dovrebbero essere questi, avevo commesso un errore

     
    ossia
    se nel file di input ho
    0apertura
    1aaaaa
    2aaaaa
    2aaaaa
    2aaaaa
    8aaaaa
    1bbbbb
    2bbbbb
    2bbbbb
    8bbbbb
    9chiusura
    ''''''''''''''''''''''''''
    dovro' avere il primo file
    0apertura
    1aaaaa
    2aaaaa
    2aaaaa
    2aaaaa
    8aaaaa
    9chiusura
    ''''''''''''''''''''''''
    il secondo file
    0apertura
    1bbbbb
    2bbbbb
    2bbbbb
    8bbbbb
    9chiusura
    etc etc
    
    



  • di Ricky53 data: 13/05/2009

    Ciao enzo,
    cerco di riepilogare perché, in base a quanto hai scritto adesso noto una differenza nella struttura del file iniziale:
    1. con il primo intervento avevi scritto:

    ossia il primo record inizia per zero il secondo per uno poi posso avere diversi record inizianti per 2 poi uno con otto ed uno per 9
    subito dopo posso avere altri blocchi sempre allo stesso modo ossia uno per zero uno che inizia per uno
    tanti altri per due sempre uno per otto ed uno per nove

    quindi un tipo “9” in ogni blocco

    2. adesso , invece il tipo “9” è presente una sola volta alla fine del file e la separazione dei blocchi è fatta dal tipo “8”
    3. il tipo “9” va scritto alla fine di ogni nuovo file prendendolo dall’ultimo del file iniziale?

    se non si definisce bene la struttura del file iniziale e di quelli finali non si può produrre il codice per spezzarlo.

    non è pignoleria ma senza le condizioni precise non si può proprio operare.
    il file, di esempio, allegato (che rispecchia quanto ho scritto nel punto 2.) è rispondente alla struttura effettiva del tuo file?
    se “si” posso operare.
    attendo tue notizie.

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 13/05/2009

    Si rispecchia il mio file iniziale
    ti spiego sperando di essere molto piu'chiaro
    il file multiplo racchiude all'inizio
    il record che inizia per 0
    poi c'e' un record che inizia per uno
    tanti altri che iniziano per due
    poi un otto
    successivamente parte un altro per uno
    altri per due ed un altro per otto e cosi via sino a giungerer all'ultimo che inizia per nove
    quindi ogni file dovra' avere il primo che comincia per 0 l'ultimo che comincia per nove ed in ogni file il relativo blocco di file che iniziano per uno per due per otto e cosi via
    proprio come l'ultimo esempio che ti ho inviato
    grazie per la collaborazione



  • di Enzo (utente non iscritto) data: 13/05/2009

    Leggendo attentamente la tua risposta ci hai preso esattamente
    ossia ogni blocco e' separato dal file che comincia per otto solo che in ogni file devo avere sempre lo zero iniziale e in chiusura il nove



  • di Big ronnie (utente non iscritto) data: 13/05/2009

    Ciao ricky ciao enzo,
    dopo quest'ultimo chiarimento(il definitivo) ho buttato giù qualcosa che a me funziona.provala e fammi sapere.

    ciao big
     
    Sub DividiFile()
    Dim Matrice()
    ReDim Matrice(10000)
    NumFile% = FreeFile
    NomeFile = 1
    Open "C:Tuo PercorsoMULTIPLO.TXT" For Input As #1
    Do Until EOF(1)
    Line Input #1, Data
    I = I + 1
    Matrice(I) = Data
    Loop
    Close #1
    ReDim Preserve Matrice(I)
    Open "C:Tuo Percorso" & NomeFile & ".TXT" For Output As #NumFile
    For II = LBound(Matrice) + 1 To UBound(Matrice)
      If Mid(Matrice(II), 1, 1) < 8 Then
         Print #NumFile%, Matrice(II)
      Else
         NomeFile = NomeFile + 1
         Print #NumFile%, Matrice(II)
           If II < UBound(Matrice) Then
              Print #NumFile%, "9Chiusura"
              Close #NumFile%
              If UBound(Matrice) = II + 1 Then Exit Sub
              Open "C:Tuo Percorso" & NomeFile & ".TXT" For Output As #NumFile%
              Print #NumFile%, "0Apertura"
           End If
      End If
    Next II
    End Sub
    



  • di Ricky53 data: 13/05/2009

    Ciao enzo,

    in attesa di informazioni mi baso sul file allegato.
    ecco quanto ho modificato per adattarlo alla struttura del file che hai allegato.

    ciao da ricky53

     
    Option Explicit
    Public I As Integer, Scritti As Integer, Dato_Letto As String, Nome_Inp As String, Nome_Out As String, Nome_App As String
    Public Tipo_0 As String, Tipo_9 As String
    Sub Dividi_File()
        Nome_Inp = "C:Multiplo.txt"
        On Error GoTo Errore1
        Open Nome_Inp For Input As #1
        Nome_Out = "Multiplo_"
        I = 1
        Do Until EOF(1)
            Line Input #1, Dato_Letto
            If Mid(Dato_Letto, 1, 1) = 0 Then
                Tipo_0 = Dato_Letto
            End If
            If Mid(Dato_Letto, 1, 1) = 9 Then
                Tipo_9 = Dato_Letto
            End If
        Loop
        Close 1
        
        On Error GoTo Errore1
        Open Nome_Inp For Input As #1
        Do Until EOF(1)
            Line Input #1, Dato_Letto
            If Mid(Dato_Letto, 1, 1) = 9 Then
                Close 2
                Exit Do
            End If
            If Mid(Dato_Letto, 1, 1) = 1 Then
                On Error GoTo Errore2
                Nome_App = "C:" & Nome_Out & Format(I, "00") & ".txt"
                Open Nome_App For Output As #2
                Print #2, Tipo_0
                Scritti = 1
            End If
            If Mid(Dato_Letto, 1, 1) <> 0 Then
                Print #2, Dato_Letto
                Scritti = Scritti + 1
            End If
            If Mid(Dato_Letto, 1, 1) = 8 Then
                Print #2, Tipo_9
                Scritti = Scritti + 1
                Close 2
                MsgBox "Effettuata scrittura del file: " & Nome_App & "    con " & Scritti & " record"
                I = I + 1
            End If
        Loop
        Close 1
        GoTo Fine
    Errore1:
        MsgBox "Errore sul file: " & Nome_Inp
        Close 1
        Exit Sub
    Errore2:
        MsgBox "Errore sul file: " & Nome_Out
        Close 1
        Exit Sub
    Fine:
        MsgBox "Fine Elaborazione. Scritti: " & I - 1 & "  File"
    End Sub
    



  • di Ricky53 data: 13/05/2009

    Ciao enzo e big,
    ho iniziato a scrivere l'intervento mentre voi scrivevate i vostri.

    comunque leggendo quanto enzo ha appena scritto ho verificato di aver capito bene e, quindi, la macro che ho inviato è corretta.

    big:
    avevo pensato anch'io ad una matrice poi ho preferito non utilizzarla e ho scelto di memorizzarmi i tipi "0" e "9" ed utilizzarli come inizio e fine dei nuovi file.

    ciao da ricky53



  • di Big ronnie (utente non iscritto) data: 13/05/2009

    Ciao ricky,

    dopo averle capite un pò trovo che lavorare con le matrici sia molto veloce e ordinato.
    scusa se mi sono intromesso ma non avevo mai lavorato con i file di testo ed ho voluto provare.

    ciao alla prossima



  • di Ricky53 data: 13/05/2009

    Ciao big,
    nessuna intromissione, anzi è un contributo utile.

    utilizzo spesso le matrici ma questa volta, per scelta dettata dal voler produrre un esempio didattico sulla gestione dei file di testo, non le ho utilizzate.

    big,
    mi permetto di apportare una piccola modifica alla tua soluzione per far scrivere il tipo "0" e "9" come sono nel file di origine ed un'altra sul formato del nome del file di output.

    ciao a tutti da ricky53

     
    Sub DividiFile_Big()
        Dim Matrice()
        ReDim Matrice(10000)
        NumFile% = FreeFile
        NomeFile = 1
        Open "C:MULTIPLO.TXT" For Input As #1
        Do Until EOF(1)
            Line Input #1, Data
            I = I + 1
            Matrice(I) = Data
        Loop
        Close #1
        ReDim Preserve Matrice(I)
        Open "C:" & Format(NomeFile, "000") & ".TXT" For Output As #NumFile
        For II = LBound(Matrice) + 1 To UBound(Matrice)
            If Mid(Matrice(II), 1, 1) < 8 Then
                Print #NumFile%, Matrice(II)
            Else
                NomeFile = NomeFile + 1
                Print #NumFile%, Matrice(II)
                If II < UBound(Matrice) Then
                    Print #NumFile%, Matrice(UBound(Matrice)) '"9Chiusura"
                    Close #NumFile%
                    If UBound(Matrice) = II + 1 Then
                        Exit Sub
                    End If
                    Open "C:" & Format(NomeFile, "000") & ".TXT" For Output As #NumFile%
                    Print #NumFile%, Matrice(1) '"0Apertura"
                End If
            End If
        Next II
    End Sub



  • di Enzo (utente non iscritto) data: 13/05/2009

    Dirvi che siete dei "mostri" e' poco
    funzionano alla stragrandissima tutti e due
    potrei farvi un altra domanda
    il file da spezzare si chiama multiplo
    il quesito e' questo
    i file multipli possono essere piu' di uno
    si chiamano multiplo multiplo1 multiplo2 etc
    riesco ad inserire il nome dei file compreso il percorso in una cella excel
    ossia c:multiplo.txt in a1
    c:multiplo.txt in a2 etc
    il problema e' che utilizzando un ciclo for next per aprire il primo multiplo e' spezzarlo poi fare la stessa cosa con il secondo etc non mi funziona
    avete una idea
    ps ribadisco che siete grandi




  • di Enzo (utente non iscritto) data: 13/05/2009

    Scusate ma ho scritto un po di fretta
    volevo dire questo:
    il nome ed il percorso del file lo introduco in celle excel
    a1 = c:multiplo.txt
    a2 = c:multiplo1.txt
    a3 = c:multiplo3.txt
    for e next non riesco a farli funzionare
    ossia apro a1 spezzo i file
    apro a2 spezzo i file etc



  • di Ricky53 (utente non iscritto) data: 13/05/2009

    Certo che si uò fare, ma questa volta ci paghi (per me cioccolata fondente al peperoncino, per big chiedi a lui).
    appena posso ti scrivo qualcosa però
    ... consentimi (avrebbe detto qualcuno ... molto famoso)
    un ciclo for/next che scorre alcune righe di una colonna e cambia il nome del file di input prendendolo dalla i-esima riga ... potevi /dovevi riuscirci da solo ...
    senza offesa ovviamente enzo.
    ciao da ricky53



  • di Enzo (utente non iscritto) data: 13/05/2009

    Ciao riky ci sto provando da tre ore ma il ciclo for next non me lo prende in considerazione
    il problema e' anche che il primo multiplo lo prende e lo spezza
    poi se lo faccio con il secondo mi rinumera i file partendo sempre da 001 ma li sovrascrive



  • di Ricky53 (utente non iscritto) data: 13/05/2009


    questa sera ci provo.

    ciao da ricky53



  • di Big ronnie (utente non iscritto) data: 13/05/2009

    Ciao enzo,

    ti mando questa macro senza provarla,vedi tu e fai sapere.

    ciao
     
    Sub DividiFile_Big()
        Dim Matrice()
        Dim Intervallo As Range, Indirizzo As String
        Set Intervallo = ActiveSheet.Range("A1:A" & Range("a65536").End(xlUp).Row)
        For Each Cella In Intervallo
            Indirizzo = Cella
            Erase Matrice
            ReDim Matrice(10000)
            NumFile% = FreeFile
            NomeFile = 1
            Open Indirizzo For Input As #1
            Do Until EOF(1)
                Line Input #1, Data
                I = I + 1
                Matrice(I) = Data
            Loop
            Close #1
            ReDim Preserve Matrice(I)
            Open "C:" & Format("M" & NomeFile, "000") & ".TXT" For Output As #NumFile
            For II = LBound(Matrice) + 1 To UBound(Matrice)
                If Mid(Matrice(II), 1, 1) < 8 Then
                   Print #NumFile%, Matrice(II)
                Else
                   NomeFile = NomeFile + 1
                   Print #NumFile%, Matrice(II)
                  If II < UBound(Matrice) Then
                     Print #NumFile%, Matrice(UBound(Matrice)) '"9Chiusura"
                     Close #NumFile%
                      If UBound(Matrice) = II + 1 Then Exit Sub
                     Open "C:" & Format(NomeFile, "000") & ".TXT" For Output As #NumFile%
                     Print #NumFile%, Matrice(1) '"0Apertura"
                  End If
                End If
            Next II
            I = 0
        Next
    End Sub



  • di Big ronnie (utente non iscritto) data: 13/05/2009

    Non ho corretto il secondo - open"c:" & format ..........come il primo.fallo tu altrimenti non avrai i file con lo stesso nome.



  • di Ricky53 data: 13/05/2009

    Ciao enzo,
    beh non potevo fare brutta figura con il grande big ...
    quindi, nella pausa di tardo pomeriggio, ho scritto quanto ti allego.
    l'ho provata e, a mio avviso, va bene.
    ciao da ricky53
     
    Option Explicit
    Public I As Integer, Scritti As Integer, Scritti_Tot As Integer, Dato_Letto As String, Nome_Inp As String, Nome_Out As String, Nome_App As String
    Public Tipo_0 As String, Tipo_9 As String
    Public Riga As Integer, Num_file As Integer
    
    Sub Dividi_File_Nuova()
        Scritti_Tot = 0
        Num_file = Range("A" & Rows.Count).End(xlUp).Row
        For Riga = 2 To Num_file
            Nome_Inp = Foglio1.Cells(Riga, 1) '"C:Multiplo.txt"
            On Error GoTo Errore1
            Open Nome_Inp For Input As #1
            Nome_Out = Left(Foglio1.Cells(Riga, 1), Len(Foglio1.Cells(Riga, 1)) - 4) & "_"
            I = 1
            Do Until EOF(1)
                Line Input #1, Dato_Letto
                If Mid(Dato_Letto, 1, 1) = 0 Then
                    Tipo_0 = Dato_Letto
                End If
                If Mid(Dato_Letto, 1, 1) = 9 Then
                    Tipo_9 = Dato_Letto
                End If
            Loop
            Close 1
        
            On Error GoTo Errore1
            Open Nome_Inp For Input As #1
            Do Until EOF(1)
                Line Input #1, Dato_Letto
                If Mid(Dato_Letto, 1, 1) = 9 Then
                    Close 2
                    Exit Do
                End If
                If Mid(Dato_Letto, 1, 1) = 1 Then
                    On Error GoTo Errore2
                    Nome_App = Nome_Out & Format(I, "000") & ".txt"
                    Open Nome_App For Output As #2
                    Print #2, Tipo_0
    
                    Scritti = 1
                End If
                If Mid(Dato_Letto, 1, 1) <> 0 Then
                    Print #2, Dato_Letto
                    Scritti = Scritti + 1
                End If
                If Mid(Dato_Letto, 1, 1) = 8 Then
                    Print #2, Tipo_9
                    Scritti = Scritti + 1
                    Close 2
                    
    '.....................................
    ' La seguente isctruzione la puoi togliere dopo aver fatto le prove
                    MsgBox "Effettuata scrittura del file: " & Nome_App & "    con " & Scritti & " record"
    '.....................................
    
                    I = I + 1
                End If
            Loop
            Close 1
            Scritti_Tot = Scritti_Tot + I - 1
    
    '.....................................
    ' Questa vedi tu se lasciarla o meno
            MsgBox "Effettuata scrittura di: " & I - 1 & " file partendo da: " & Nome_Inp
    '.....................................
    
        Next Riga
        GoTo Fine
    Errore1:
        MsgBox "Errore sul file: " & Nome_Inp
        Close 1
        Exit Sub
    Errore2:
        MsgBox "Errore sul file: " & Nome_Out
        Close 1
        Exit Sub
    Fine:
        MsgBox "Fine Elaborazione. Scritti: " & Scritti_Tot & "  File"
    End Sub



  • di Ricky53 data: 13/05/2009

    Ciao
    ho dimenticato di dirti che i nomi dei file devono essere scritti nel "foglio1" e partire dalla cella "a2" in giù

    ciao di nuovo da ricky53



  • di Big roniie (utente non iscritto) data: 13/05/2009

    Ti riferisci all'aggettivo inglese vero?

    ciao big



  • di Ricky53 data: 13/05/2009

    Ciao,
    mi riferivo a queste istruzioni

    for riga = 2 to num_file
    nome_inp = foglio1.cells(riga, 1)

    dove "foglio1" è il nome del foglio che si vede nel "vbaproject" e non sulle linguette del file xls (normalmente possono essere diversi)

    ciao da ricky53



  • di Big ronnie (utente non iscritto) data: 13/05/2009

    Ciao ricky,

    la mia era solo una battuta per la tua frase

    *** beh non potevo fare brutta figura con il grande big ... ***

    ciao big



  • di Ricky53 data: 13/05/2009

    Ciao big,
    che spinaccia che sono, non mi era accorto della battuta che avevo indotto e che tu avevi simpaticamente raccolto e rilanciato.

    sai in questi giorni, un un altro forum, c'è un utente che mi provoca e perseguita e sono, quindi, costretto a stare molto attento a quello che scrivo e mi sono controllato non facendo caso che ero su questo forum dove trovo tanti amici.

    un caro saluto a tutti da ricky53



  • di Enzo (utente non iscritto) data: 14/05/2009

    Ciao ricky scusa la mia risposta in ritardo ma stavo applicando l'ultima tua istruzione che mi hai inviato che , devo dire , e' stragrande.
    chiedo ancora il tuo aiuto
    non apro un altra discussione in quanto riguarda sempre un file di testo
    ti spiego
    ti ho allegato un file txt di esempio (prova.txt)
    faccio una premesse
    in un foglio excel nella colonna b ho nelle prime cinque celle dei valori progressivi lunghi otto campi "00000001" "00000002" etc
    ora con l'istruzione qui sotto ho cercato di aprire il file prova.txt
    ricercare i record che iniziano per 2 (sono quelli che hanno i campi da sostituire)(premetto che conosco la posizione di partenza, dalla 74 per otto campi) e sostituire progressivamente il campo (dist) nel primo record che comincia per due con il valore in b1, il secondo con b2 etc
    non mi puoi dare un aggiustatina alla mia istruzione perche' il file "duplicato.txt) che dovrebbe contenere il file prova con i nuovi valori sostituiti mi sballa e non so dove
    sbaglio
    grazie se ti rompo ancora le scatole


     
    sub duplica()
    P = 1
    Open "C:PROVA.TXT" For Input As #1
    Open "C:DUPLICATO.TXT" For Output As #2
    Do Until EOF(1)
    Line Input #1, DATA
    Record = Mid(DATA, 1, 1)
    If Record = 2 Then
    DIST = Mid(DATA, 74, 8)
    DATA = Replace(DATA, DIST, Foglio3.Range("B" & P))
    Debug.Print DATA
    End If
    P = P + 1
    Print #2, DATA
    Loop
    Close
    end sub



  • di Enzo (utente non iscritto) data: 14/05/2009

    Per essere piu' chiaro devo sostituire nel file txt in ogni record che comincia per due un campo che so che e' lungo otto e che parte dalla posizione 74 con quello sempre lungo otto indicato nella cella b1



  • di Ricky53 data: 14/05/2009

    Ciao enzo,

    riporto quanto scritto da te:

    "...
    per essere piu' chiaro devo sostituire nel file txt in ogni record che comincia per due un campo che so che e' lungo otto e che parte dalla posizione 74 con quello sempre lungo otto indicato nella cella b1
    ..."

    prima avevi scritto che il primo record tipo "2" da 74 per 8 car. andava sostituito con "b1" il secondo con "b2" ed immagino il terso con "b3"
    ecc fino a "b5"

    allora alcune domande:
    1. quale delle due condizioni deve essere utilizzata per sostituire da 74 per 8 car.

    2. se i tipi "2" presenti nel file di input sono più di 5 con quali valori si sostituisce?

    descrivi con precisione cosa ti occorre e si risolve facilmente.

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 14/05/2009

    Scusa se ho detto tiporecord due ma e' una caratteristica delk lavoro che svolgo in banca
    mi spiego meglio
    prendendo ad esempio il file che ti ho mandato
    ho sempre questi benedetti record il primo che comincia per zero il secondo per uno uno o piu' che cominciano per due il penultimo per otto e l'ultimo per nove
    ora so che i campi che devo sostituire sono quelli contenuti nei record che cominciano per due e sono lunghi otto posizioni e cominciano dalla posizione 74
    le stringhe che vanno in sostituzione sono lunghe otto posizioni e sono posizionate (scusa il gioco di parole) nelle celle dalla b1 in poi
    il mio era solo un esempio dalla b1 alla b5 in quanto se vedi nel file di testo ci sono cinque record che cominciano per due ma possono essere di piu'
    diciamo che in partenza conosco quanti record due ci sono e quindi quante celle excel occupare che andranno a sostiuire i valori nel file txt
    grazie ancora per l'aiuto



  • di Enzo (utente non iscritto) data: 14/05/2009

    Per farti capire meglio
    io ho una procedura che aprendo il file in input mi importa nella colonna a i valori dei record che cominciano per due (posizione 74 8 caratteri)
    quindi ogni cella della colonna a ha un valore estrapolato da ogni singolo record che comincia per due del file di testo
    quindi a questo punto vedendo quante sono le celle occupate nella colonna a so quanti valori inserire nelle celle b (questo per risponderti alla domanda che mi avevi posto precedentemente)
    poi manualmente intervengo io sulle celle della colonna b e qui entra in gioco la procedura in quanto deve andarmi a sostituire i valori come ti ho detto prima quindi se enne celle sono occupate in a tante ne scrivo in quel file ma sostituiendo solo quei caratteri in quella posizione ma il resto del file rimane invariato



  • di Ricky53 data: 14/05/2009

    Ciao enzo,
    ecco la macro con l'ipotesi che i record tipo "2" siano uguali al numero delle celle piene nel "foglio3".

    alcuni consigli:
    1. definisci sempre le variabili.
    2. utilizza option explicit
    3. gestisci gli errori di accesso aii file
    4. utilizza variabili per i nomi del file
    5. ottimizza, ove possibile, le istruzioni (vedi quanto ho modificato di ciò che avevi scritto)

    ciao da ricky53
     
    Option Explicit
    Public P As Integer, Dati As String, File_Inp As String, File_Out As String
    Sub Duplica()
        P = 1
        File_Inp = "PROVA.TXT"
        File_Out = "DUPLICATO.TXT"
        
        On Error GoTo Errore1
        Open File_Inp For Input As #1
        
        On Error GoTo Errore2
        Open File_Out For Output As #2
        
        Do Until EOF(1)
            Line Input #1, Dati
            If Mid(Dati, 1, 1) = 2 Then
                Dati = Mid(Dati, 1, 73) & Foglio3.Range("B" & P)
                P = P + 1
            End If
            
            On Error GoTo Errore3
            Print #2, Dati
        Loop
        GoTo Fine
    Errore1:
        MsgBox "Errore sul file: " & File_Inp
        GoTo Fine
    Errore2:
        MsgBox "Errore sul file: " & File_Out
        GoTo Fine
    Errore3:
        MsgBox "Errore in scrittura del file: " & File_Out
        GoTo Fine
    Fine:
        Close
    End Sub
    
    



  • di Enzo (utente non iscritto) data: 14/05/2009

    Ciao ricky grazie per la sollecita risposta
    non ho provato la tua istruzione ma vedo che in partenza c'e' un problema
    infatti la tua istruzione a quanto mi pare di capire fa questo ossia
    se il record comincai per due scrivi da 1 a 73 piu' quello che trova nella cella b
    il problema nasce in quanto il file di testo dopo gli otto campi da sostituire ne ha altri occupati
    per quello ti ho detto che e' un vantaggio che i campi da sostituire sono di lunghezza otto e che partono da 74 in quanto la tua istruzione andrebbe bene se gli otto da sosituire siano gli ultimi ma come ti ho detto ce ne sono altri dopo
    forse ho sbagliato mandandoti un file txt di esempio in quel modo ma era per semplificare le cose
    se hai qualche idea in merito



  • di Ricky53 data: 14/05/2009

    Ciao enzo,
    lo avevo sospettato, ma il tuo esempio terminava con gli otto da sostituire quindi ha scritto il codice in questo modo.

    la cosa è facilissima, adesso devo andare a cena, se posso questa sera tardi.

    consentimi una morale un po' spiritosa:
    se si spiega male, male si riceve ...

    meglio: se si semplifica troppo, troppo si sbaglia ...

    la prossima volta invia un esempio rispondente al vero ed esaustivo.

    io inserirei un controllo tra il numero di celle piene nel foglio3 ed il numero di record di tipo "2".
    tu che ne dici?
    il controllo lo fai sempre tu manualmente?
    e se ti sfugge qualcosa?
    meditate meditate ...

    ciao da ricky53

    p.s.: questa sera sono particolarmente "saggio" o ...



  • di Enzo (utente non iscritto) data: 14/05/2009

    Ciao ricky il problema e' che l'esempio originale non te lo posso mandare per problemi di privacy bancario
    poi preferisco controllare personalmente qello che vado ad inserire in quanto trattasi di dati particolari e non mi posso permettere di sbagliare
    grazie comunque per l'ennesimo aiuto
    ipotizza in ogni caso di inserire nei record due dopo gli otto campi da sostituire per esempio dei 4444444444444444
    buon appetito



  • di Ricky53 data: 14/05/2009

    Ciao enzo,
    come preomesso.

    rispetto ai dati non volevo dati reali ma una copia di quelli reali, senza dati riservati, con le stesse regole ed organizzazione.

    so bene cosa significhi trattare dati riservati: lavoro per un ministero.

    ciao da ricky53
     
    Option Explicit
    Public P As Integer, Part As Integer, Ri_Part As Integer, Lung As Integer, Per_Lung As Integer
    Public Dati As String, File_Inp As String, File_Out As String
    Sub Duplica()
        P = 1
        Part = 74
        Lung = 8
        Ri_Part = Part + Lung
    
        File_Inp = "PROVA.TXT"
        File_Out = "DUPLICATO.TXT"
        
        On Error GoTo Errore1
        Open File_Inp For Input As #1
        
        On Error GoTo Errore2
        Open File_Out For Output As #2
        
        Do Until EOF(1)
            Line Input #1, Dati
            If Mid(Dati, 1, 1) = 2 Then
                Per_Lung = Len(Dati) - Ri_Part + 1
                Dati = Mid(Dati, 1, (Part - 1)) & Foglio3.Range("B" & P) & Mid(Dati, Ri_Part, Per_Lung)
                P = P + 1
                If Foglio3.Range("B" & P) = "" Then
                    MsgBox "Elaborazione Interrotta - Controllare i dati nel Foglio 3 - Cella  'B" & P & "'"
                    Exit Do
                End If
            End If
            
            On Error GoTo Errore3
            Print #2, Dati
        Loop
        GoTo Fine
    Errore1:
        MsgBox "Errore sul file: " & File_Inp
        GoTo Fine
    Errore2:
        MsgBox "Errore sul file: " & File_Out
        GoTo Fine
    Errore3:
        MsgBox "Errore in scrittura del file: " & File_Out
    Fine:
        Close
    End Sub
    



  • di Enzo (utente non iscritto) data: 15/05/2009

    Ciao ricky ma sono arrivato in ufficio da poco
    ho provato la tua istruzione e con delle modifiche funziona alla stragrandeeeeeeeeeee
    grazie di nuovo per il tuo importantissimo apporto
    ciao e alla prossima
    ps ti devo un caffe'



  • di Ricky53 (utente non iscritto) data: 15/05/2009

    Ciao enzo,
    al posto del caffè preferisco del cioccolato fondente al peperoncino (cuorenero al 99%).

    alla prossima.
    buon proseguimento.

    ciao da ricky53



  • di Enzo (utente non iscritto) data: 16/05/2009

    Rileggendomi tutti gli interventi mi sono dimenticato di ringraziare big ronnie
    caffe' pagato anche per te
    ciao
    buon sabato e domenica