Import e Formattazione



  • Import e Formattazione
    di Ronnie (utente non iscritto) data: 15/05/2013 07:42:21

    Salve a tutti: dovrei scusarmi di essere tanto "niubbo" e un poco mi vergogno!
    Ho un file .txt che desidero importare in excel. Il file è di questo tipo:
    -----------------------------------
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur et ipsum eu neque varius pellentesque.
    ###
    Pellentesque imperdiet, nibh eu mattis tempus,
    ###
    Duis nec massa ante.
    ###
    Vivamus tempor placerat justo, sed consectetur ipsum luctus nec. Sed iaculis hendrerit rhoncus.
    ###
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum feugiat egestas malesuada.
    ###
    -----------------------------------
    Il risultato dopo la formattazione dovrebbe essere:
    -----------------------------------
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur et ipsum eu neque varius pellentesque.
    1
    Pellentesque imperdiet, nibh eu mattis tempus,
    2
    Duis nec massa ante.
    3
    Vivamus tempor placerat justo, sed consectetur ipsum luctus nec. Sed iaculis hendrerit rhoncus.
    4
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum feugiat egestas malesuada.
    5
    -----------------------------------
    vale a dire tutti gli "###" sono stati trasformati in un numero sequenziale che parte da un determinato valore. Il risultato verrebbe poi copiato in memoria ed essere disponibile come appunto da incollare secondo necessità.
    Tutto questo è sicuramente fattibile, ma........... mi date una mano? Ve ne sarei davvero grato!

    Saluti
    Ronnie



  • di Baz (utente non iscritto) data: 15/05/2013 08:24:00

    Ciao,
    innanzitutto che conoscenze hai di vba?
    personalmente non credo si possa fare altrimenti.
    Tu parti dal file TXT già nel foglio Excel?

    cit.
    "...tutti gli "###" sono stati trasformati in un numero sequenziale..."
    ok

    cit.
    "...che parte da un determinato valore.."
    che valore? dove lo indichi?

    cit.
    "... Il risultato verrebbe poi copiato in memoria ed essere disponibile come appunto da incollare secondo necessità"
    non mi è chiaro, essendo intervallati dal TESTO (riga testo, numero, riga testo, numero, ....), come intendi incollare tale sequenza di numeri?

    Ciao



  • di Ronnie (utente non iscritto) data: 15/05/2013 08:59:28

    ciao, grazie della riposta: vediamo......
    - Importo il txt in excel leggendolo una riga alla volta
    - se la riga contiene "###" sostituisco il ### con un numero che posso indicare nella routine stessa
    - aggiorno il contatore, tipo numero = numero +1
    - se non contiene ### vado a riga successiva e ricomincio
    - tutto questo sino alla fine del file
    - chiudo il file
    - mi ritrovo con un file excel che contiene in una colonna tutto il file una riga per cella
    - copio il file (intero, non solo il numero) e lo incollo dove serve.

    Conoscenze di vba? Nessuna, ma proprio nessuna!

    Grazie



  • di Baz (utente non iscritto) data: 15/05/2013 11:11:44

    scusami,
    prima dell'import, tu conosci il tuo ID come progressivo da cui partire?
    vuoi digitarlo all'inizio?

    dopo l'import e l'aggiornamento, è corretto ottenere come segue?

    testo1
    1
    testo2
    2
    testo3
    3
    testo4
    4
    ...

    tutto nella stessa colonna?


    cit. "...lo incollo dove serve"
    cosa intendi?



  • di Baz (utente non iscritto) data: 15/05/2013 11:39:05


    Per inserire un modulo:
    1- aprire il file excel
    Assicurati che la protezione
    Strumenti -> Macro -> Protezione sia impostata su "Medio"
    altrimenti nessuna macro verrà attivata
    2- premere ALT+F11 (si aprire l'editor di Visual Basic)
    3- posizionarsi nella finestra "Progetto - VBAProject" (in alto a sx)
    4- selezionare il file sul quale vuoi inserire il codice (es. Cartel1)
    5- premere il tasto dx del mouse Inserisci -> Modulo
    6- Copiare il codice che trovi sotto, nel modulo che si è appena aperto
    7- modifica il valore all'interno dei 2 apici TUA CARTELLA e 'TUO FILE
    8- premi F5 dall'editor

    se tutto è corretto, dovrebbe importarti il file.

    p.s.: non ho gestito eventuali errori nel caso il file no sia presente, se serve ...


     
    Option Explicit
    
    
    Function LeggiTxt()
    Dim myPath As String
    Dim myFileTxt As String
    Dim myTxt As String
    Dim r As Long
    Dim myId
    
    
    myId = InputBox("Digita l'ID da cui partire", "Info")
    
    'verifico il dato inserito
    If myId = "" Then
        MsgBox "Valore non inserito"
        GoTo Fine:
    ElseIf Not IsNumeric(myId) Then
        MsgBox "Valore non valido"
        GoTo Fine:
    End If
    
    'converto in numero
    myId = CDbl(myId)
    
    r = 1 'riga inizio inserimento dati
    
    myPath = "c:"    'TUA CARTELLA
    myFileTxt = "prova.txt"    'TUO FILE
    
    'apro il file in lettura
    Open myPath & myFileTxt For Input As #1
        Do Until EOF(1)
            Input #1, myTxt
            If myTxt = "###" Then
                Cells(r, 1) = myId
                myId = myId + 1
            Else
                Cells(r, 1) = myTxt
            End If
            r = r + 1
        Loop
    Close #1
    
    MsgBox "Fine elaborazione"
    
    Fine:
    Exit Function
    
    
    End Function
    



  • di Vecchio Frac data: 15/05/2013 12:04:19

    Aaaaargh:
    GoTo Fine:

    ...spaghetti western? aggiungo le faccine! ^_^ LOL





  • di Ronnie (utente non iscritto) data: 15/05/2013 12:08:22

    Ciao,
    grazie ancora, funziona alla grande, ma spezza ogni riga del file originale in tre o quattro righe diverse. Per il resto va benissimo.

    Ronnie



  • di Ronnie (utente non iscritto) data: 15/05/2013 12:35:08

    Risolto!
    Uso Line Input al posto di Input.

    Grazie davvero, sei stato gentilissimo! Mi sono iscritto al forum



  • di Baz data: 15/05/2013 13:26:11

    x Ronnie:
    bene,

    x Vecchio Frac:
    mmm non ho capito il tuo intervento


    all'inizio volevo mettere il msg d'errore alla fine ... poi l'ho diviso in 2 ...



  • di Vecchio Frac data: 15/05/2013 13:31:57

    @Baz
    Non c'entra il messaggio di fine elaborazione, è il ricorso all'istruzione "GoTo" che sarebbe da evitare :)
    Vedi la definzione di spaghetti code su wikipedia: it.wikipedia.org/wiki/Spaghetti_code

    Il resto del codice proposto va bene (con Line Input in effetti leggi e assegni l'intera riga fino alla fine della stringa).





  • di Baz data: 15/05/2013 13:44:28

    mmm ... quindi cosa suggeriresti in alternativa al Goto ? sono curioso.



  • di Vecchio Frac data: 15/05/2013 14:00:21

    Nei casi più complessi bisogna fare ricorso a Select Case, Do o al limite una catena di If.
    In questo caso più semplice, invece, poichè l'unico scopo è far terminare il programma in presenza di dati non validi, basta semplicemente uscire dalla funzione:

    'verifico il dato inserito
    If myId = "" Then
    MsgBox "Valore non inserito"
    Exit Function
    ElseIf Not IsNumeric(myId) Then
    MsgBox "Valore non valido"
    Exit Function
    End If







  • di Baz data: 15/05/2013 14:29:01

    tks x le info,
    ultima cosa, in certi casi è contemplabile l'utilizzo del Goto (es. dover far ripetere una parte di funzione fino al verificarsi di un particolare evento) o severamente vietato?



  • di Vecchio Frac data: 15/05/2013 14:47:34

    Le istruzioni GoTo e GoSub sono rimaste per evidenti motivi di compatibilità con codice vecchio (e forse per nonnetti come me nostalgici di BASIC/BASICA, GWBasic e QBasic ^_^).
    Pur non essendo "severamente vietato" il loro utilizzo, è da considerarsi deprecato per migliorare la leggibilità e la manutenibilità del codice.
    Per ripetere parti di codice fino al verificarsi di una certa condizione si utilizzano costrutti più potenti, tipo While...Wend e Do...Loop.
     
    Option Explicit
    
    Sub test()
    Dim i As Integer
    
        'Costrutto While
        'Esegue una serie di istruzioni finché la valutazione di una determinata condizione dà come risultato True.
        i = 0
        While i < 10
            i = i + 1
            Debug.Print i
        Wend
        
        
        'Costrutto Do...Loop
        'Ripete un blocco di istruzioni finché la valutazione di una condizione dà come risultato True o fino a quando non dà come risultato True.
        'Si deve usare Exit Do per uscire dal ciclo infinito
        i = 0
        Do
            i = i + 1
            Debug.Print i
            If i = 10 Then Exit Do
        Loop
        
        
        'Costrutto Do...Loop Until
        'Il raggiungimento della condizione è garantito da Until (finchè la condizione è vera)
        i = 0
        Do
            i = i + 1
            Debug.Print i
        Loop Until i = 10
    
    
        'Costrutto Do...Loop While
        'Il raggiungimento della condizione è garantito con While (nel mentre la condizione rimane vera)
        i = 0
        Do
            i = i + 1
            Debug.Print i
        Loop While i < 10
    End Sub






  • di Baz data: 15/05/2013 14:55:15

    Grazie ancora.