Condividi tramite

Tracciato record variabile

Anonimo
2010-11-12T10:02:11+00:00

Un saluto a tutto il forum.

Ho un file xls 2003 con 2 fogli, Dati e Tracciato.

Sul foglio Tracciato a riga 1 ho i seguenti campi:

A1: Cognome

B1: Nome

C1: Città

D1: Provincia

E1: CAP

a riga 2 ho il tipo di campo

A2: Stringa

B2: Stringa

C2: Stringa

D2: Stringa

E2: Numerico

a riga 3 ho la lunghezza del campo

A3: 30

B3: 30

C3: 30

D3: 2

E3: 5

Solitamente quando devo scrivere del codice per un leggi in excel e scrivi un file in txt mi definisco tutti i miei campi con le varie Dim e faccio il mio ciclo di lettura e scrittura, nessun problema.

Ora invece devo dare il file a chi non conosce VBA e voglio renderli indipendenti da me, e mi hanno già detto che in futuro il tracciato potrebbe essere modificato aggiungendo altri campi, per esempio “sesso”, “codice fiscale” ecc. e non ho voglia ogni volta di modificare il codice per le diverse esigenze.

In linea di principio ho idea dei diversi passi ma prima di iniziare vorrei sapere se hanno una possibilità di riuscita oppure no.

I passi in VBA sarebbero divisi in 2 parti:

parte 1

Definisco 1 variabile “Tracciato” con dimensione iniziale a 2

Verifico quale sia l’ultima colonna del foglio Tracciato valorizzata e a questo punto faccio una ReDim della variabile Tracciato

Ciclo con for next e valorizzo Tracciato(i) con i diversi nomi a riga 1 e tipologia a riga 2 del foglio Tracciato

parte 2

Mi sposto su foglio Dati

Trovo l’ultima riga scritta

Apro file di scrittura

Valorizzo Tracciato(i) con i dati che leggo

Scrivo il file

Ricomincio il ciclo fino alla fine

Chiudo file di scrittura

Scusate la lunghezza ma ho qualche speranza di riuscita secondo voi?

Per favore mi potreste, se realizzabile il progetto, scrivermi il codice

relativo alla parte 1

come valorizzereste la variabile Tracciato(i) con i dati che leggo dal foglio Dati

Grazie ancora per i vostri suggerimenti.

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-11-15T10:51:47+00:00

Ciao Mauro,

 

nel frattempo che facevo la parte di leggi/scrivi ho voluto complicare un pochino le cose ed ho aggiunto sul foglio Tracciato la possibilità di avere anche dei campi con una valorizzazione fissa ed inoltre ho dato la possibilità all’utente di definire a suo piacimento percorso e nome file output ed alla fine ne è uscito quanto sotto riportato. Come dicevo prima sono sempre ben accettate critiche e revisioni.

 

<cut>

Per iniziare. Io utilizzerei la programmazione ad oggetti al posto di Select/Activate. E' più sicura e leggibile. Inoltre per trovare l'ultima colonna con un valore, terrei conto che post 2003 Excel ha ben più colonne. Esempio:

Public Sub m()

    Dim shTrac As Worksheet

    Dim shDati As Worksheet

    Dim lCol As Long

    Dim lRiga As Long

    With ThisWorkbook

        Set shTrac = .Worksheets("Tracciato")

        Set shDati = .Worksheets("Dati")

    End With

    With shTrac

        lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column

        MsgBox lCol

    End With

    With shDati

        lRiga = .Range("A" & .Rows.Count).End(xlUp).Row

        MsgBox lRiga

    End With

    Set shDati = Nothing

    Set shTrac = Nothing

End Sub

Nel caso tu voglia la lettera e non il numero della colonna:

Public Sub m()

    Dim shTrac As Worksheet

    Dim shDati As Worksheet

    Dim sCol As String

    Dim lRiga As Long

    With ThisWorkbook

        Set shTrac = .Worksheets("Tracciato")

        Set shDati = .Worksheets("Dati")

    End With

    With shTrac

        sCol = f(.Cells(1, .Columns.Count).End(xlToLeft).Column)

        MsgBox sCol

    End With

    With shDati

        lRiga = .Range("A" & .Rows.Count).End(xlUp).Row

        MsgBox lRiga

    End With

    Set shDati = Nothing

    Set shTrac = Nothing

End Sub

Public Function f(ByVal lng As Long) As String

    f = Split(Cells(1, lng).Address( _

        True, False, xlA1, False), "$")(0)

End Function


--

La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

--

Mauro Gamberini - Microsoft© MVP(Excel)

http://www.maurogsc.eu/

La risposta è stata utile?

0 commenti Nessun commento

7 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-11-15T09:07:59+00:00

    Esatto. Nel mio messaggio di apertura ho nel foglio Tracciato sulla riga 1 il nome dei campi, in riga 2 il tipo ed in riga 3 la lunghezza.

    Nel frattempo ho cominciato a scrivere qualcosa, che non è ancora completo, e sicuramente può essere migliorato. Stavo iniziando la parte relativa alla lettura dei dati; come detto prima i suggerimenti/migliorie sono molto graditi.

    Ciao e grazie

    Sub a()

    Dim Campo()

    Dim TipoCampo()

    Dim LenCampo()

    Dim Ur As Integer

    Dim Uc As Integer

    Dim MioPerc As String

    Dim MioFile As String

    'Seleziono foglio Tracciato

    Sheets("Tracciato").Select

    Range("a1").Select

    MioPerc = Range("b7").Value

    MioFile = Range("b8").Value

    'Trovo ultima colonna su foglio Tracciato

    Uc = Range("IV1").End(xlToLeft).Column

    'Ridimensiono matrici

    ReDim Campo(Uc)

    ReDim TipoCampo(Uc)

    ReDim LenCampo(Uc)

    For PopMatr = 1 To Uc

        Campo(PopMatr) = Cells(1, PopMatr).Value

        TipoCampo(PopMatr) = Cells(2, PopMatr).Value

        LenCampo(PopMatr) = Cells(3, PopMatr).Value

    Next

    'Seleziono foglio Dati

    Sheets("Dati").Select

    Range("a1").Select

    'Trovo ultima colonna su foglio Dati

    Ur = Range("A" & Rows.Count).End(xlUp).Row

    Open MioPerc & MioFile For Append As #1

        For scrivi = 2 To Ur

                                           <===== Lettura dei diversi campi e relativa formattazione

                                           <===== i numeri allineati a destra con completamento a 0 (zero)

                                           <===== le stringhe allineate a sinistra con completamento a spazio

           scrivi_record =

            Print #1, scrivi_record

        Next scrivi

    Close

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-11-12T16:33:17+00:00

    Sul foglio Tracciato ho il tracciato dei campi con il loro nome, tipo e lunghezza.

    Nell'esempio ho inserito 5 campi ma ne verranno aggiunti altri che ho ipotizzato essere sesso e codice fiscale ma ne verranno inseriti degli ulteriori da parte della persona a cui darò il file e non ho voglia di mettere mano al codice ad ogni modifica.

    Così pensavo di scrivere una macro che leggendo le caratteristiche del campo sul foglio Tracciato potesse costruirsi un "tracciato record dinamico" e leggendo quanto verrà inserito nel foglio Dati creare l'output, file txt, con le caratteristiche dei campi riportati nel foglio Tracciato.

    Nella macro andavo a definire una sola variabile, se possibile, Dim Pippo(2); verificavo sul foglio Tracciato quante colonne sono valorizzate e faccio ReDim di Pippo; ciclo per valorizzare l'array Pippo con le caratteristiche riportate nel foglio Tracciato; passavo al foglio Dati ed eseguivo il ciclo leggi/scrivi.

    Grazie per l'interessamento.

    Quindi, hai bisogno di campi di lunghezza specifica per l'esportazione in .txt, è corretto? Perchè se la lunghezza del campo non è importante, non vedo il motivo di questa cosa.


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-11-12T11:47:41+00:00

    Sul foglio Tracciato ho il tracciato dei campi con il loro nome, tipo e lunghezza.

    Nell'esempio ho inserito 5 campi ma ne verranno aggiunti altri che ho ipotizzato essere sesso e codice fiscale ma ne verranno inseriti degli ulteriori da parte della persona a cui darò il file e non ho voglia di mettere mano al codice ad ogni modifica.

    Così pensavo di scrivere una macro che leggendo le caratteristiche del campo sul foglio Tracciato potesse costruirsi un "tracciato record dinamico" e leggendo quanto verrà inserito nel foglio Dati creare l'output, file txt, con le caratteristiche dei campi riportati nel foglio Tracciato.

    Nella macro andavo a definire una sola variabile, se possibile, Dim Pippo(2); verificavo sul foglio Tracciato quante colonne sono valorizzate e faccio ReDim di Pippo; ciclo per valorizzare l'array Pippo con le caratteristiche riportate nel foglio Tracciato; passavo al foglio Dati ed eseguivo il ciclo leggi/scrivi.

    Grazie per l'interessamento.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2010-11-12T11:32:55+00:00

    Un saluto a tutto il forum.

    <cut>

    Io non ho capito quasi nulla. Cosa devi fare con quella cosa che tu chiami Tracciato?


    --

    La soluzione, il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dalla soluzione proposta se usata impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare la soluzione in files importanti.

    --

    Mauro Gamberini - Microsoft© MVP(Excel)

    http://www.maurogsc.eu/

    La risposta è stata utile?

    0 commenti Nessun commento