trasformazione format tabelle



  • trasformazione format tabelle
    di rabat (utente non iscritto) data: 12/03/2014 15:15:27

    Salve a tutti, sono alle prese con una tabella di dati che devo riorganizzare in formato diverso, rispetto all'originale che mi è stato fornito da terzi, per poter fare successive elaborazioni. Nella tabella originale ho dati chimici organizzati in modo tale che per ogni punto di campionamento ho tante righe quanti sono i parametri chimici analizzati (non sempre uguali per i vari punti di campionamento). Ogni punto di campionamento poi è ripetuto più volte a seconda della data di prelievo, il tutto per oltre 3600 righe. Il mio obiettivo è di ottenere una tabella di destinazione in cui nella prima colonna ho il punto di campionamento, nella seconda la data di campionamento e a seguire tante colonne quante sono i parametri chimici, in modo tale che per ogni riga abbia campione, data e parametri (in tutto 20, ma non sempre tutti presenti). Avevo un codice in Qbasic sul vecchio pc che, che riporto, funzionava bene e che prendeva i dati in formato csv e li salvava in dat. Volevo adattarlo in VBA, ma non ne sono capace. Qualcuno potrebbe darmi una mano in questo o indicarmi una soluzione alternativa?

    Grazie mille
     
    DECLARE SUB leggistringa (a$, ID$, dat$, sostanza$, valore!)
    Rem tabella batta
    Dim sosta$(20)
    Dim vettore(20), flag(20) As Single
    Data "Al", "As", "B", "Cd", "Co", "Cond", "Cr_tot", "Cr_VI", "Fe", "Mn", "Hg", "Ni", "pH", "Pb", "Pot_Redox", "Cu", "Se", "SO4", "Temp", "Zn"
    For i = 1 To 20
      READ sosta$(i)
    Next i
    dire$ = "F:dosatta"
    nome$ = "dati"
    nomeinp$ = dire$ + nome$ + ".csv"
    nomeout$ = dire$ + nome$ + ".dat"
    Open nomeinp$ For Input As #1
    Open nomeout$ For Output As #2
    Line Input #1, a$
    oldid$ = "null"
    For i = 1 To 20
      flag(i) = 0
      vettore(i) = 0
    Next i
    Do Until EOF(1)
     Line Input #1, a$
     Call leggistringa(a$, ID$, dat$, sost$, valore)
     If oldid$ = "null" Then
       oldid$ = ID$
       olddat$ = dat$
     End If
     If ID$ = oldid$ Then
       For i = 1 To 20
         If flag(i) = 0 Then
          If InStr(sosta$(i), sost$) = 1 Then
           vettore(i) = valore
           flag(i) = 1
          Else
           vettore(i) = -9999
           
          End If
        End If
       Next i
     Else
    Rem costruisce la stringa
      cc$ = oldid$ + ";" + olddat$ + ";"
      Print #2, cc$;
      For i = 1 To 20
       Print #2, vettore(i);
       Print #2, ";";
      Next i
      Print #2, vettore(20)
      oldid$ = ID$
      olddat$ = dat$
       For i = 1 To 20
          flag(i) = 0
          vettore(i) = 0
       Next i
       For i = 1 To 20
         If flag(i) = 0 Then
          If InStr(sosta$(i), sost$) = 1 Then
           flag(i) = 1
           vettore(i) = valore
          Else
           vettore(i) = -9999
           
          End If
         End If
       Next i
     End If
    Rem  PRINT a$
    Loop
    Close #2
    Close #1
    End
    
    Sub leggistringa(a$, ID$, dat$, sostanza$, valore)
    lung = Len(a$)
    If Mid$(a$, lung, 1) <> ";" Or Mid$(a$, lung, 1) <> "," Then
       lung = lung + 1
       a$ = a$ + ";"
    End If
    Index = 0
    b$ = ""
    For i = 1 To lung
     c$ = Mid$(a$, i, 1)
     If c$ = ";" Or c$ = "," Then
        Index = Index + 1
        Select Case Index
          Case 1
            ID$ = b$
            b$ = ""
          Case 2
            dat$ = b$
            b$ = ""
          Case 3
            sostanza$ = b$
            b$ = ""
          Case 8
             valore = Val(b$)
             b$ = ""
        Case Else
             b$ = ""
        End Select
     Else
      b$ = b$ + c$
     End If
    Next i
    End Sub



  • di isy data: 12/03/2014 15:29:54

    Bello il codice,
    ci puoi allegare il file cvs o un esempio di come vanno impostati i dati su Excel
    Ne è passato.. di tempo dal codice Qbasic



  • di rabat (utente non iscritto) data: 12/03/2014 15:39:53

    ho allegato un estratto dei files di input e output...



  • di isy data: 12/03/2014 16:27:27

    Ciao

    Allego per verifica il file: inputOutput.xlsx
    Ho utilizzato le formule solo per una verifica.

    Chiedo il file Cvs lo importi direttamente sul foglio o hai necessità che il codice vba lo prelevi e riporti i calcoli sul foglio.
    Se inserisci maggiori dettagli per il prelievo dalla cartella.
    Il nome del file: input.xlsx è sempre lo stesso?



  • di rabat (utente non iscritto) data: 12/03/2014 21:53:00

    Intanto grazie,
    non ho bisogno di creare per forza un csv, posso lavorare in excel come hai brillantemente fatto tu. Ho provato a utilizzare la tua formula sul file completo, ma non capisco perchè non funziona, mi restituisce solo valori 0. L'unica modifica fatta riguarda l'eliminazione della moltiplicazione per 1000 dove presente, perchè non necessaria. Ho nominato Input il foglio di partenza e Output quello di destinazione, copiato le tue stesse formule, con l'unica modifica che ti ho detto, ma ottengo solo valori nulli... perdonami ma sono una schiappa



  • di isy data: 12/03/2014 22:36:30

    In cella cella C3 del foglio Output sostituisci la formula che effettuava la ricerca solamente in 40 righe
    Vedi:

    '=MATR.SOMMA.PRODOTTO(--(Input!$A$2:$A$40=Output!$A3);--(Input!$C$2:$C$40=Output!C$1);Input!$G$2:$G$40)

    ora per estendere il range di ricerca
    ricopia la seguente formula in C3:

    '=MATR.SOMMA.PRODOTTO(--(Input!$A$2:$A$4000=Output!$A3);--(Input!$C$2:$C$4000=Output!C$1);Input!$G$2:$G$4000)

    Ricopia questa formula per sostituire le precedenti formule nel foglio
    Formula da adattare se necessario



  • di rabat (utente non iscritto) data: 13/03/2014 00:05:29

    avevo già modificato il numero delle righe impostando quello giusto. ho provato ad incollare la tabella completa nel foglio input del tuo file, ma mi viene fuori una sfilza di #VALORE!. Forse il problema è che non per tutti i campioni sono presenti gli stessi parametri, anche se l'elenco completo è quello riportato nel file output?



  • di rabat (utente non iscritto) data: 13/03/2014 10:19:56

    Buongiorno, ho scoperto l'inghippo, c'erano dei dati sballati che non avevo visto in alcune celle! La tua formula funziona a meraviglia. Ti ringrazio tantissimo