2009-02-08 8 views
5

Je suis nouveau à VBA et j'essaie de comprendre comment inverser l'ordre d'une plage sélectionnée de colonnes sans codage dur. Chaque exemple que je regarde soit code dur les colonnes pour inverser l'ordre, ou suppose que vous voulez inverser toutes les colonnes dans la feuille de calcul. Je n'essaie pas de demander à quelqu'un d'écrire ceci pour moi, mais aussi simple que cela devrait être, dès que quelqu'un explique ce que je manque, je devrais être OK.Comment faire pour inverser l'ordre d'une plage sélectionnée de colonnes Excel en utilisant VBA

Quelqu'un a-t-il des conseils?

Répondre

0

D'ici: Flipping Or Mirroring A Range:

Cette macro inverser l'ordre d'une plage de données. Vous pouvez inverser les données dans une seule ligne ou dans une seule colonne de données (c'est-à-dire, un tableau N par 1 ou un tableau 1 par N). Vous ne pouvez pas sélectionner et la ligne entière ou une colonne entière.

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 - vous donne le numéro de colonne de fin
Selection.Columns(1).Column - vous donne le numéro de colonne de départ

Vous pouvez faire un inverse pour la boucle en utilisant ce qui précède.

0

Enregistrez une macro avec des références de cellules relatives, puis examinez le code. Je le fais chaque fois que je me sens trop paresseux pour rechercher certaines fonctionnalités (parce que, permettez-moi, la documentation de MS est de pire en pire pour VBA).

1

ce code retourne toute une gamme horizontalement, une ligne à la fois est une douleur. profiter

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

Vous pouvez utiliser sorte pour le faire.

En utilisant cette méthode, vous pouvez organiser les colonnes comme vous le souhaitez.

Si vous avez des données qui ressemble à ceci:

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

Ajouter quelques chiffres à la première ligne:

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 

Ensuite, utilisez sorte, sans lignes d'en-tête, puis choisissez l'option pour trier de gauche à droite au lieu de haut en bas.

Tri par ligne 1, descendant:

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 vous voulez ce script, utilisez l'option pour trier par des lignes au lieu de colonnes.

J'ai écrit un.vbs qui fait cela ici:

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

+0

Génial, merci! Pour faire le tri dans Excel 2010, je devais aller comme ceci: _ (clic-droit) _ -> _Sort_ -> _Type personnalisé ... _ -> _ [Options ...] _ -> _Sort de gauche à droite - > _ [OK] _ -> _Sort by_ -> _ "Ligne 1" _ -> _Order_ -> _ "Du plus grand au plus petit" _ -> _ [OK] _ – akavel

0

Je crois que ce que vous voulez faire ressemble à quelque chose comme ceci:

A1 B1 C1 D1 E1 | E1 D1 C1 B1 A1

A2 B2 C2 D2 E2 | E2 D2 C2 B2 A2

Si c'est ce que vous essayez de faire, essayez cette fonction de feuille de calcul:

= INDEX ($ A $ 1: $ B $ 5, ROW (A1), 6 COLONNES (A1)

Où 6 vaut 1 + le nombre de colonnes de la plage que vous voulez inverser. Il y a probablement une meilleure façon de faire cette partie, mais je voulais simple ici.

Mettez cette fonction dans la cellule F1 et copiez/collez-la aux mêmes dimensions que la plage d'origine. Ensuite, vous pouvez simplement couper/coller des valeurs.