. 27.04.17 #VBA Registro ordenado por burbuja
Buenas noches, Alan
Hay preguntas a las que respondo porque entiendo que sé la solución.
En cambio, hay otras que respondo -precisamente- por que no la sé. Y estas son las que más me gustan porque me obligan a aprender.
La tuya hubiese estado dentro de las primeras... si no hubieses pedido que el resultado saliese ordenado de menor a mayor.
Ví que ya obtuviste una respuesta del generoso Dante, pero me permito proponerte otra alternativa. Es una de las bondades de MS Excel y VBA que permiten múltiples soluciones a un mismo problema.
Esta variante se trata de un código que sólo necesita que le digas dónde empieza tu cuadro de números (en tu ejemplo la celda "A1") y donde quieres que empiece a dejar los valores (I2).
Luego la rutina se encarga de ver cuantas categorías hay y no importa hasta qué fila esté ocupada cada columna.
Para probarla, accede al Editor de VBA (Atajo: Alt + F11), allí inserta un módulo (Insertar-Módulo) y pega el siguiente código:
Option Base 1
Sub TrasponCat()
'---- Variables modificables ----
'=== ALAN, modifica estos datos de acuerdo a tu proyecto:
IniCuadro = "A1" 'celda donde inicia el cuadro a traponer
IniDest = "I2" ' celda donde iniciar la trasposición de datos.
'---- fin Variables
'
' VBA coding by FeJoAl
'
'---- inicio de rutina:
'
Dim ListaNums()
CantCols = Range(IniCuadro).CurrentRegion.Columns.Count
For LaColu = 0 To CantCols - 1
LaFila = 0
Elemento = 1
TitCat = Range(IniCuadro).Offset(LaFila, LaColu).Value
'carga de números a ordenar
'
LaFila = 1
Do While Not IsEmpty(Range(IniCuadro).Offset(LaFila, LaColu))
If Range(IniCuadro).Offset(LaFila, LaColu).Value <> 0 Then
ReDim Preserve ListaNums(Elemento + 1)
ListaNums(Elemento) = Range(IniCuadro).Offset(LaFila, LaColu).Value
Elemento = Elemento + 1
End If
LaFila = LaFila + 1
Loop
'Ordenamiento por Método de Burbuja
'
CantNums = UBound(ListaNums) - 1
For PrimEle = 1 To CantNums - 1
For SigEle = PrimEle + 1 To CantNums
If ListaNums(PrimEle) > ListaNums(SigEle) Then
auxiliar = ListaNums(PrimEle)
ListaNums(PrimEle) = ListaNums(SigEle)
ListaNums(SigEle) = auxiliar
End If
Next SigEle
Next PrimEle
'Contrucción del registro ordenado y transpuesto
'
ElTexto = ""
Eleme = 0
For Eleme = 1 To UBound(ListaNums) - 1
ElTexto = Trim(ElTexto & IIf(Eleme = 1, "", ",") & ListaNums(Eleme))
Next
Range(IniDest).Offset(LaColu, 0).Value = TitCat
Range(IniDest).Offset(LaColu, 1).Value = ElTexto
cont = cont + 1
Next
'Mensaje final
'
ElMensaje = IIf(cont = 0, "NO SE TRASLADO COLUMNA ALGUNA", "Se generaron: " & cont & " linea" & IIf(cont > 1, "s", ""))
TipoMens = IIf(cont = 0, vbCritical, vbInformation)
ElTitulo = IIf(cont = 0, "NO SE HIZO NADA", "TERMINADO!")
Application.ScreenUpdating = True
MsgBox ElMensaje, TipoMens, ElTitulo
End Sub
Espero que te sirva para tu objetivo.
Saludos
Fernando
.