2009-02-08 17 views
5

Soy nuevo en VBA y estoy tratando de encontrar la forma de invertir el orden de un rango seleccionado de columnas sin codificación. Cada ejemplo que observo o bien codifica las columnas para invertir el orden de, o asume que desea revertir todas las columnas en la hoja de trabajo. No estoy tratando de pedirle a alguien que escriba esto para mí, pero tan simple como debería ser, tan pronto como alguien me explique lo que me estoy perdiendo, debería estar bien.Cómo invertir el orden de un rango seleccionado de columnas de Excel usando VBA

¿Alguien tiene algún consejo?

Respuesta

0

Desde aquí: Flipping Or Mirroring A Range:

Esta macro invertir el orden de una serie de datos. Puede voltear datos en una sola fila o en una sola columna de datos (es decir, una matriz N por 1 o una matriz 1 por N). No puede seleccionar y toda la fila o una columna completa.

Public Sub FlipSelection() 

Dim Arr() As Variant 
Dim Rng As Range 
Dim C As Range 
Dim Rw As Long 
Dim Cl As Long 

On Error GoTo EndMacro 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 
Application.EnableEvents = False 

Set Rng = Selection 
Rw = Selection.Rows.Count 
Cl = Selection.Columns.Count 
If Rw > 1 And Cl > 1 Then 
    MsgBox "Selection May Include Only 1 Row or 1 Column", _ 
    vbExclamation, "Flip Selection" 
Exit Sub 
End If 

If Rng.Cells.Count = ActiveCell.EntireRow.Cells.Count Then 
    MsgBox "You May Not Select An Entire Row", vbExclamation, _ 
     "Flip Selection" 
    Exit Sub 
End If 
If Rng.Cells.Count = ActiveCell.EntireColumn.Cells.Count Then 
    MsgBox "You May Not Select An Entire Column", vbExclamation, _ 
     "Flip Selection" 
    Exit Sub 
End If 

If Rw > 1 Then 
    ReDim Arr(Rw) 
Else 
    ReDim Arr(Cl) 
End If 

Rw = 0 
For Each C In Rng 
    Arr(Rw) = C.Formula 
    Rw = Rw + 1 
Next C 

Rw = Rw - 1 
For Each C In Rng 
    C.Formula = Arr(Rw) 
    Rw = Rw - 1 
Next C 

EndMacro: 
Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
Application.EnableEvents = True 

End Sub 
0

Selection.Columns(Selection.Columns.Count).Column - le da el número de columna que termina
Selection.Columns(1).Column - le da el número de columna de partida

Puede hacer un reverso de bucle mediante los métodos anteriores.

0

Registre una macro con referencias relativas de celda y luego examine el código. Hago esto cada vez que me siento demasiado flojo para buscar alguna funcionalidad (porque, admitámoslo, la documentación de MS empeora cada vez más para VBA).

1

este código invierte toda una gama horizontalmente, una fila a la vez es un problema. disfrutar de

Sub FlipHorizontal() 

On Error GoTo EndMacro 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 
Application.EnableEvents = False 

Set Rng = Selection 
rw = Selection.Rows.Count 
cl = Selection.Columns.Count 

If Rng.Cells.Count = ActiveCell.EntireRow.Cells.Count Then 
    MsgBox "You May Not Select An Entire Row", vbExclamation, _ 
    "Flip Selection" 
    Exit Sub 
End If 
If Rng.Cells.Count = ActiveCell.EntireColumn.Cells.Count Then 
    MsgBox "You May Not Select An Entire Column", vbExclamation, _ 
    "Flip Selection" 
    Exit Sub 
End If 

ReDim Arr(rw, cl) 
For cc = 1 To cl ' = Rng.Columns.Count 
    For rr = 1 To rw 'rr = Rng.Rows.Count 
     Arr(rr, cc) = Rng.Cells(rr, cc) '.Formula 
     a = Arr(rr, cc) 
    Next 

Next 

'copy arry to range flippingnhorizontal 
cc = cl 

For a = 1 To cl ' to loop the columns 
    For rr = 1 To rw 'rr = Rng.Rows.Count 
     Rng.Cells(rr, cc) = Arr(rr, a) '= .Formula 

    Next 
    cc = cc - 1 
Next 

EndMacro: 
Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
Application.EnableEvents = True 

End Sub 
9

Usted puede utilizar tipo para hacer esto.

Con este método, puede organizar las columnas de la forma que desee.

Si tiene datos que tiene este aspecto:

A  B  C 
1 header1 header2 header3 
2 dataA dataE dataI 
3 dataB dataF dataJ 
4 dataC dataG dataK 
5 dataD dataH dataL 

añadir algunos números en la primera fila:

A  B  C 
1 1  2  3  
2 header1 header2 header3 
3 dataA dataE dataI 
4 dataB dataF dataJ 
5 dataC dataG dataK 
6 dataD dataH dataL 

A continuación, utilice especie, sin filas de cabecera, y luego elegir la opción para clasificar de izquierda a derecha en lugar de arriba hacia abajo.

Clasificación por la fila 1, descendiendo:

A  B  C 
1 3  2  1 
2 header3 header2 header1 
3 dataI dataE dataA 
4 dataJ dataF dataB 
5 dataK dataG dataC 
6 dataL dataH dataD 

Si desea escritura, utilice la opción de ordenar por filas en lugar de por columnas.

Escribí a.VBS que hace esto aquí:

http://gallery.technet.microsoft.com/ScriptCenter/en-us/f6085342-a1ae-49d8-acfc-38368256ee42?lc=1033

+0

¡Impresionante, gracias! Para hacer la clasificación en Excel 2010, necesitaba ir así: _ (clic con el botón derecho) _ -> _Sort_ -> _Custom sort ..._ -> _ [Opciones ...] _ -> _Sort de izquierda a derecha_ - > _ [OK] _ -> _Ordenar por_ -> _ "Fila 1" _ -> _Order_ -> _ "De mayor a menor" _ -> _ [OK] _ – akavel

0

Creo que lo que quiere hacer es como la siguiente:

A1 B1 C1 D1 E1 | E1 D1 C1 B1 A1

A2 B2 C2 D2 E2 | E2 D2 C2 B2 A2

Si eso es lo que estamos tratando de hacer, probar esta función de hoja:

= INDICE ($ A $ 1: $ B $ 5, ROW (A1), 6-columna (A1))

Donde 6 es 1 + la cantidad de columnas en el rango que desea invertir. Probablemente haya una mejor manera de hacer esa parte, pero me iba por simple aquí.

Ponga esa función en la celda F1 y cópiela/péguela en las mismas dimensiones que el rango original. Entonces puedes simplemente cortar/pegar valores.

Cuestiones relacionadas