
Option Explicit
Sub transform()
Dim i As Long, j As Long, ur As Long
Dim ri As Long, u As Long
Dim indice_colore As Integer, indice_indirizzo As Integer, indice_dati As Integer
Dim maxc As Long, maxi As Long, maxd As Long
ur = Range("A1").CurrentRegion.Rows.Count
ri = 1: i = 1
[e1] = "nome": [f1] = "cognome": [g1] = "stato"
For i = 1 To ur
If Cells(i, "A") = "nome" Then
j = i
ri = ri + 1
Cells(ri, "E") = Cells(i, "B")
indice_colore = 0
indice_indirizzo = 0
indice_dati = 0
Else
j = j + 1
Select Case Cells(i, "A")
Case "cognome"
Cells(ri, "F") = Cells(i, "B")
Case "stato"
Cells(ri, "G") = Cells(i, "B")
Case "colore":
indice_colore = indice_colore + 1
u = 7 + indice_colore
If indice_colore > maxc Then
maxc = indice_colore
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "colore" & indice_colore
End If
Cells(ri, u) = Cells(i, "B")
Case "indirizzo"
indice_indirizzo = indice_indirizzo + 1
u = 7 + indice_colore + indice_indirizzo
If indice_indirizzo > maxi Then
maxi = indice_indirizzo
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "indirizzo" & indice_indirizzo
End If
Cells(ri, u) = Cells(i, "B")
Case "dati"
indice_dati = indice_dati + 1
u = 7 + indice_colore + indice_indirizzo + indice_dati
If indice_dati > maxd Then
maxd = indice_dati
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "dati" & indice_dati
End If
Cells(ri, u) = Cells(i, "B")
End Select
End If
i = j
Next
MsgBox "Done."
End Sub
|
Option Explicit
Sub transform1()
'prima parte di dichiarazione delle variabili
Dim i As Long, j As Long, ur As Long
Dim ri As Long, u As Long
Dim indice_Ente_app As Integer, indice_Ogg As Integer, indice_Cdz_econom As Integer, indice_Importo As Single, indice_Durata As Integer, indice_Oneri As Integer, indice_Onorario As Integer, indice_Procedura As Integer, indice_Articolo As Integer, indice_Data_Ins As Integer, indice_Aggiornam As Integer, indice_Data_aggiudica As Integer, indice_Zone As Integer, indice_Cat As Integer, indice_Aggiudicatario As Integer
'maxc, maxi, maxd, ecc sono nomi di variabili o il prefisso max ha qualche funzione?
Dim maxc As Long, maxi As Long, maxd As Long, maxh As Long, maxj As Long, maxk As Long, maxl As Long, maxm As Long, maxn As Long, maxo As Long, maxp As Long, maxq As Long, maxr As Long, maxs As Long, maxt As Long, maxu As Integer
ur = Range("A1").CurrentRegion.Rows.Count
' non riesco a tradurre/capire quanto sopra.. individua l'area dove c'è la cella selezionata?
ri = 1: i = 1
[e1] = "Rif_RiGa": [f1] = "Rif_Gara"
For i = 1 To ur 'per i che va da 1 a ur
If Cells(i, "A") = "Rif_RiGa" Then 'se le celle i-esime nella Colonna A sono “Rif_Riga” allora
j = i 'j diventa i
ri = ri + 1 'ri aumenta di 1
Cells(ri, "E") = Cells(i, "B") 'le celle ri-esime della colonna E sono uguali alle celle i-esime della colonna B
indice_Ente_app = 0 'indice_Ente_app da zero
indice_Ogg = 0
indice_Cdz_econom = 0
indice_Importo = 0
indice_Durata = 0
indice_Oneri = 0
indice_Onorario = 0
indice_Procedura = 0
indice_Articolo = 0
indice_Data_Ins = 0
indice_Aggiornam = 0
indice_Data_aggiudica = 0
indice_Zone = 0
indice_Cat = 0
indice_Aggiudicatario = 0
Else 'altrimenti (l’ ”else” praticamente divide i casi tra le categorie che hanno solo una colonna da quelle che possono avere più colonne giusto?)
j = j + 1
Select Case Cells(i, "A") 'selezione dei casi nelle celle i-esime della colonna A
Case "Rif_Gara" 'caso "Rif_Gara"
Cells(ri, "F") = Cells(i, "B") 'le celle ri-esime della colonna F sono uguali alle celle i-esime della colonna B
Case "Ente_app": 'caso "Ente_app"
indice_Ente_app = indice_Ente_app + 1 'l'inice Ente_app si incrementa di 1
u = 6 + indice_Ente_app 'u parte da 6+1. u è la colonna dove scrivo il dato di "B" relativo al caso in esame che aumenta con i casi e le colonne dei casi?
If indice_Ente_app > maxc Then 'se indice_Ente_app > maxc allora uguaglia indice_Ente_app e maxc ???
maxc = indice_Ente_app
Cells(1, u).EntireColumn.Insert xlShiftToRight 'la cella (riga 1, colonna u) inserire una colonna a destra
Cells(1, u) = "Ente_app" & indice_Ente_app 'l'intestazione di colonna è: "Ente_App(indice_Ente_app)"
End If
Cells(ri, u) = Cells(i, "B") 'inserisci il valore nella cella prendendolo dalla relativa posizione nella colonna B
Case "Ogg"
indice_Ogg = indice_Ogg + 1
u = 6 + indice_Ente_app + indice_Ogg
If indice_Ogg > maxi Then
maxi = indice_Ogg
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Ogg" & indice_Ogg
End If
Cells(ri, u) = Cells(i, "B")
Case "Cdz_econom"
indice_Cdz_econom = indice_Cdz_econom + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom
If indice_Cdz_econom > maxd Then
maxd = indice_Cdz_econom
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Cdz_econom" & indice_Cdz_econom
End If
Cells(ri, u) = Cells(i, "B")
Case "Importo"
indice_Importo = indice_Importo + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo
If indice_Importo > maxh Then
maxh = indice_Importo
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Importo" & indice_Importo
End If
Cells(ri, u) = Cells(i, "B")
Case "Durata"
indice_Durata = indice_Durata + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata
If indice_Durata > maxj Then
maxj = indice_Durata
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Durata" & indice_Durata
End If
Cells(ri, u) = Cells(i, "B")
Case "Oneri"
indice_Oneri = indice_Oneri + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri
If indice_Oneri > maxk Then
maxk = indice_Oneri
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Oneri" & indice_Oneri
End If
Cells(ri, u) = Cells(i, "B")
Case "Onorario"
indice_Onorario = indice_Onorario + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario
If indice_Onorario > maxl Then
maxl = indice_Onorario
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Onorario" & indice_Onorario
End If
Cells(ri, u) = Cells(i, "B")
Case "Procedura"
indice_Procedura = indice_Procedura + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario + indice_Procedura
If indice_Procedura > maxm Then
maxm = indice_Procedura
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Procedura" & indice_Procedura
End If
Cells(ri, u) = Cells(i, "B")
Case "Articolo"
indice_Articolo = indice_Articolo + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario + indice_Procedura + indice_Articolo
If indice_Articolo > maxn Then
maxn = indice_Articolo
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Articolo" & indice_Articolo
End If
Cells(ri, u) = Cells(i, "B")
Case "Data_Ins"
indice_Data_Ins = indice_Data_Ins + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario + indice_Procedura + indice_Articolo + indice_Data_Ins
If indice_Data_Ins > maxo Then
maxo = indice_Data_Ins
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Data_Ins" & indice_Data_Ins
End If
Cells(ri, u) = Cells(i, "B")
Case "Aggiornam"
indice_Aggiornam = indice_Aggiornam + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario + indice_Procedura + indice_Articolo + indice_Data_Ins + indice_Aggiornam
If indice_Aggiornam > maxp Then
maxp = indice_Aggiornam
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Aggiornam" & indice_Aggiornam
End If
Cells(ri, u) = Cells(i, "B")
Case "Data_aggiudica"
indice_Data_aggiudica = indice_Data_aggiudica + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario + indice_Procedura + indice_Articolo + indice_Data_Ins + indice_Aggiornam + indice_Data_aggiudica
If indice_Data_aggiudica > maxq Then
maxq = indice_Data_aggiudica
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Data_aggiudica" & indice_Data_aggiudica
End If
Cells(ri, u) = Cells(i, "B")
Case "Zone"
indice_Zone = indice_Zone + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario + indice_Procedura + indice_Articolo + indice_Data_Ins + indice_Aggiornam + indice_Data_aggiudica + indice_Zone
If indice_Zone > maxr Then
maxr = indice_Zone
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Zone" & indice_Zone
End If
Cells(ri, u) = Cells(i, "B")
Case "Cat"
indice_Cat = indice_Cat + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario + indice_Procedura + indice_Articolo + indice_Data_Ins + indice_Aggiornam + indice_Data_aggiudica + indice_Zone + indice_Cat
If indice_Cat > maxt Then
maxt = indice_Cat
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Cat" & indice_Cat
End If
Cells(ri, u) = Cells(i, "B")
Case "Aggiudicatario"
indice_Aggiudicatario = indice_Aggiudicatario + 1
u = 6 + indice_Ente_app + indice_Ogg + indice_Cdz_econom + indice_Importo + indice_Durata + indice_Oneri + indice_Onorario + indice_Procedura + indice_Articolo + indice_Data_Ins + indice_Aggiornam + indice_Data_aggiudica + indice_Zone + indice_Cat + indice_Aggiudicatario
If indice_Aggiudicatario > maxu Then
maxu = indice_Aggiudicatario
Cells(1, u).EntireColumn.Insert xlShiftToRight
Cells(1, u) = "Aggiudicatario" & indice_Aggiudicatario
End If
Cells(ri, u) = Cells(i, "B")
End Select
End If
i = j
Next 'riparte il ciclo for fino a che non trova Rif_RiGa
MsgBox "Done."
End Sub
|
ur = Range("A1").CurrentRegion.Rows.Count calcola il numero di righe presenti in tabella. La tabella è individuata a partire dalla cella A1. Il comando conta le righe della "regione corrente" intendendosi per tale quella zona di celle contigue non separate da righe o colonne vuote. In altre parole si individua un range di celle finchè non c'è almeno una riga vuota e almeno una colonna vuota. Il numero di righe della tabella è inserito nella variabile "ur", che serve dopo a scandire l'intero range di dati.
Rif_RiGa Rif_Gara Ente_app Cat Aggiudicatario
794642 11376971 Unione Dei Comuni Bassa Reggiana Di Novellara T-AF 315572 - VINCITORE NON
794642 11376971 Piazzale Marconi N. 1 M-OG1 - Vincitore:
794642 11376971 42017 Novellara (re) M-OG2
Option Explicit
Sub transform_VF2()
Dim dict() As Object
Dim headers As Object
Dim c As Range
Dim s As String, p As String
Dim i As Long
Dim co As Long, ur As Long
Dim ri As Long, idx As Long
Dim rr As Long, last_row As Long, j As Long
Dim v As Variant, vv As Variant, o As Variant
'selezione foglio e pulizia
Sheets("db").Select
Range("E1:EW5000").ClearContents
'calcolo ultima riga del database
ur = Range("A1").CurrentRegion.Rows.Count
'inserisco gli headers dei campi a partire da colonna E
'in un oggetto dizionario
Set headers = CreateObject("Scripting.Dictionary")
co = 5
For ri = 1 To ur
s = Cells(ri, "A")
If Not headers.exists(s) Then
headers(s) = s
Cells(1, co) = s
co = co + 1
End If
Next
'per memorizzare i dati utilizzo un oggetto "dizionario" ("dict")
'in cui possono essere inseriti dati associati a una chiave
'il dizionario ha forma diz = chiave, valore e i suoi dati
'vengono inseriti con l'istruzione dizionario(chiave)=valore
'il valore può essere costituito da qualunque oggetto, anche un
'array di dati, basta ricordarsi come è costruito :)
'in particolare creo una matrice di dizionari indicizzati da 1 in poi
'col discriminante costiuito da Rif_RiGa
'per ogni zona del database intervallata dal codice univoco Rif_RiGa,
'creo una voce del dizionario dict() dove memorizzo il valore del
'codice di riferimento (in Rif_RiGa) e il valore della voce singola
'per esempio la prima zona di dati (A1:B30) è chiamata dict(1)
'e ha chiavi corrispondenti ai campi della colonna A, e valori
'corrispondenti ai valori della singola riga; in caso di valori multipli
'questi sono memorizzati nella corrispondente chiave come singolo dato
'separato dal carattere speciale "|"; così alla fine abbiamo:
'dict(1)("Rif_RiGa") = 794642, 794642
'dict(1)("Rif_Gara") = 794642, 11376971
'dict(1)("Ente_app") = 794642, Unione dei Comuni|Piazzale Marconi|42017 Novellara
For i = 1 To ur
s = Cells(i, "A")
If s = "Rif_RiGa" Then
idx = idx + 1
ReDim Preserve dict(idx) As Object
Set dict(idx) = CreateObject("Scripting.Dictionary")
dict(idx)(s) = Array(Cells(i, "B"), Cells(i, "B"))
Else
If Not dict(idx).exists(s) Then
dict(idx)(s) = Array(dict(idx)("Rif_RiGa")(0), Cells(i, "B"))
Else
p = dict(idx)(s)(1) & "|" & Cells(i, "B")
If Left(p, 1) = "|" Then p = Mid(p, 2)
dict(idx)(s) = Array(dict(idx)("Rif_RiGa")(0), p)
End If
End If
Next
'ora che abbiamo riempito il dizionario di dati e valori possiamo
'recuperarli, scorrendo l'array di dizionari, e sistemandoli nelle corrette
'righe, colonne (a partire da E2)
'In caso di valori multipli per un campo, occorre ricordare l'indice di riga
'dell'ultimo valore posizionato epr poter ricominciare a piazzare il dato
'successivo nella giusta posizione di riga
'Per ogni riga è riportato, in colonna E, il codice chiave base (quello del
'campo Rif_RiGa relativo alla porzione del dizionario in esame)
ri = 2
For i = 1 To idx
For Each v In dict(i) 'etichetta header
s = dict(i)(v)(0) 'dict()=array(codice rif_RiGa, value)
Set c = Range("1:1").Find(v, lookat:=xlWhole)
p = dict(i)(v)(1) 'value
If InStr(p, "|") = 0 Then
Cells(ri, c.Column) = p
Else
rr = ri
For Each vv In Split(p, "|")
Cells(rr, c.Column) = vv
Cells(rr, "E") = dict(i)("Rif_RiGa")(1)
rr = rr + 1
Next
End If
If rr > last_row Then last_row = rr
Next
ri = last_row
Next
MsgBox "Finito!", vbInformation
End Sub
|
