
Quiero pasar de algo así como la primera tabla a la segunda tabla:
...Por el simple hecho de usarlo en una tabla dinámica. Me gustaría que la primera tabla estuviera en una hoja y que la segunda tabla fuera otra hoja, actualizando en vivo esta segunda tabla "explosionada". Lo he estado intentando durante un tiempo y no puedo hacer que esto funcione. ¿Alguna sugerencia? El formulario que estoy usando genera este tipo de lista de valores separados por comas en celdas individuales y, en este caso, no es práctico hacerlo manualmente, ya que habría miles de filas.
Respuesta1
Modifiqué el guióndesde el enlace proporcionado por gtwebb. Aquí está el guión:
Option Explicit
Sub Main()
Columns("B:B").NumberFormat = "@"
Dim i As Long, c As Long, r As Range, v As Variant
For i = 1 To Range("B" & Rows.Count).End(xlUp).Row
v = Split(Range("B" & i), ", ")
c = c + UBound(v) + 1
Next i
For i = 2 To c
Set r = Range("B" & i)
Dim arr As Variant
arr = Split(r, ", ")
Dim j As Long
r = arr(0)
For j = 1 To UBound(arr)
Rows(r.Row + j & ":" & r.Row + j).Insert Shift:=xlDown
r.Offset(j, 0) = arr(j)
r.Offset(j, -1) = r.Offset(0, -1)
r.Offset(j, 1) = r.Offset(0, 1)
Next j
Next i
Columns("C:C").NumberFormat = "@"
Dim k As Long, d As Long, s As Range, w As Variant
For k = 1 To Range("C" & Rows.Count).End(xlUp).Row
w = Split(Range("C" & k), ", ")
d = d + UBound(w) + 1
Next k
For k = 2 To d
Set s = Range("C" & k)
Dim arrb As Variant
arrb = Split(s, ", ")
Dim m As Long
s = arrb(0)
For m = 1 To UBound(arrb)
Rows(s.Row + m & ":" & s.Row + m).Insert Shift:=xlDown
s.Offset(m, 0) = arrb(m)
s.Offset(m, -1) = s.Offset(0, -1)
s.Offset(m, -2) = s.Offset(0, -2)
Next m
Next k
End Sub
Como solo necesitaba esto para dos columnas, no me molesté en realizar bucles. Lo único que se modifica es que el script se repite una segunda vez, se cambian las variables y Offset
se cambia el parámetro.