Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Così adesso dovrebbe fare quello che vuoi, non è proprio perfetta come soluzione perché se hai un altro livello di distinta ti tocca entrare nel codice e cambiare le colonne UM e quantità (ti metto in grassetto il punto)... ma per il momento potresti accontentarti! ;-)
Ti posto qui sotto il codice! Ciao, Ste'
Sub Verticalizza()
Dim nRow, nCol As Long
Application.ScreenUpdating = False
'per comodità sposto le colonne g ed h all'inizio
Columns("G:H").Select Selection.Cut
Columns("A:A").Select
Selection.Insert shift:=xlToRight
Range("C1").Select
'prima richiamo la routine di copia dei valori
CopiaValori True, ""
'prendo la riga della cella in cui sono arrivata
nRow = ActiveCell.Row
'prendo la colonna dell'ultima cella compilata
nCol = ActiveCell.Offset(-1, 0).End(xlToRight).Column + 1
Range("C1").Select
'routine per eliminare le celle vuote
EliminaVuoti nRow, nCol
' risposto le colonne g ed h prima dell'articolo padre alla fine
Columns("A:B").Select
Selection.Cut
Columns("E:E").Select
Selection.Insert shift:=xlToRight
'dopo aggiungo le nuove colonne
Columns("E:E").Select
Selection.Insert shift:=xlToRight
Columns("E:E").Select
Selection.Insert shift:=xlToRight
'aggiungo una nuova riga davanti a tutto
Rows("1:1").Select
Selection.Insert
Selection.Font.Bold = True
'metto i titoli
Range("A1").Select
ActiveCell.Value = "Codice"
ActiveCell.Offset(0, 1).Value = "Descrizione"
ActiveCell.Offset(0, 2).Value = "UM"
ActiveCell.Offset(0, 3).Value = "Quantità"
ActiveCell.Offset(0, 4).Value = "Prezzo"
ActiveCell.Offset(0, 5).Value = "Commessa"
ActiveCell.Offset(0, 6).Value = "Kit"
Application.ScreenUpdating = True
End Sub
Function EliminaVuoti(ByVal nRowTot As Long, ByVal nColTot As Long)
Dim nCol, nRow, nCountCol As Long
Dim bStop As Boolean
For nRow = 1 To nRowTot - 1
nCountCol = 0
bStop = False
nCol = 1
While (nCol <= nColTot) And Not bStop
If IsNull(ActiveCell.Value) Or ActiveCell.Value = "" Then
If nCountCol < 4 Then
Selection.Delete shift:=xlToLeft
If Not (IsNull(ActiveCell.Value) _
Or ActiveCell.Value = "") Then
bStop = True
End If
End If
Else
nCountCol = nCountCol + 1
ActiveCell.Offset(0, 2).Select
End If
nCol = nCol + 1
Wend
Cells(nRow + 1, 3).Select
Next nRow
End Function
Function CopiaValori(ByVal bFirstCall As Boolean, ByVal sValToRip As String)
Dim sValCella As String
Dim bStopCurr As Boolean
If Not bFirstCall Then
'mi posiziono su due colonne dopo e riga successiva
ActiveCell.Offset(1, 2).Select
Else
'se primo richiamo prendo solo il valore da riportare
sValToRip = ActiveCell.Value
End If
While Not bStopCurr
If ActiveCell.Value = "" Then
'se nella cella successiva non c'è niente mi fermo
bStopCurr = True
Else
'imposto il codice e des. dell'art. precedente
ActiveCell.Offset(0, 2).Value = sValToRip
'mi prendo il codice e descr. dell'articolo successivo
sValCella = ActiveCell.Value
'richiamo la sottoroutine per l'articolo successivo (se ero in A1 passo in B3)
CopiaValori False, sValCella
'avanzo di una riga
ActiveCell.Offset(1, 0).Select
End If
Wend
If Not bFirstCall Then
'mi riposiziono sulla cella iniziale
ActiveCell.Offset(-1, -2).Select
End If
End Function