0
votes

Excel VBA: colonnes d'échange avec plage

J'ai un problème sur la colonne A à la colonne B de la colonne B de la colonne A, les deux colonnes ont un nombre de lignes de 2563. Existe-t-il un code VBA pour résoudre ce problème?

J'essaie déjà ce code: < / p> xxx

mais il ne peut échanger que la rangée 1 des deux colonnes ...


0 commentaires

4 Réponses :


1
votes

Vous pouvez les échanger tous par une boucle. Pour votre cas, la boucle devrait aller pour 2563 fois. XXX


1 commentaires

Je ne voulais pas claquer votre réponse. J'aurais posté quelque chose comme le vôtre il n'y a pas trop longtemps. J'ai inclus le détail de la raison pour laquelle le mien est plus efficace pour aider les autres à apprendre les valeurs des tableaux. Je souhaite que quelqu'un me ait aidé à comprendre cela plus tôt. Je t'ai donné une uppote.



1
votes

L'utilisation d'un tableau serait beaucoup plus rapide que la boucle. Dans cet exemple, la colonne A est copiée dans un tableau hold_rng code>. Ensuite, la colonne B est copiée sur la colonne A, puis la matrice est copiée dans la colonne B.

Sub SwapCOlumns()
    Dim hold_rng() As Variant
    Dim rowsToinclude As Long, WS As Worksheet

    Set WS = ActiveSheet '<--- make sure this is correct worksheet
    rowsToinclude = 2563 '<----- might want to make more dynamic

    With WS

        hold_rng = .Range("A1:A" & rowsToinclude)

        .Range("A1:A" & rowsToinclude).Value = .Range("B1:B" & rowsToinclude).Value
        .Range("B1:B" & rowsToinclude).Value = hold_rng

    End With

End Sub


0 commentaires

0
votes

juste pour l'ajouter dans le mélange, il y a une troisième voie.

Insérez une colonne après B. Copier A à C. Supprimer A. P>

With ThisWorkbook.Worksheets(1)
    .Columns(3).Insert
    .Columns(1).Copy .Columns(3)
    .Columns(1).Delete
End With


0 commentaires

1
votes

Je préfère utiliser les tableaux code> car est beaucoup plus rapide.

Option Explicit

Sub test()

    Dim i As Long
    Dim arrA As Variant, arrB As Variant
    Dim ValueA As Double, ValueB As Double

    'Cahng if needed
    With ThisWorkbook.Worksheets("Sheet1")

        arrA = .Range("A1:A2563")
        arrB = .Range("B1:B2563")

        For i = 1 To 2563

            ValueA = arrA(i, 1)
            ValueB = arrB(i, 1)

            arrA(i, 1) = ValueB
            arrB(i, 1) = ValueA

        Next i

            .Range("A1").Resize(UBound(arrA), 1) = arrA
            .Range("B1").Resize(UBound(arrB), 1) = arrB

    End With

End Sub


2 commentaires

Ne pas être territorial, mais cela semble être une réponse faible. Oui, les tableaux sont plus rapides, mais votre approche passe ensuite à des mises à jour individuelles à chaque cellule en boucle. L'avantage de la matrice est qu'il n'aboutit que le classeur une fois. Votre réponse n'est pas différente en ce qui concerne la performance que le code de Reza que le vôtre est inutilement complexe. Si je suis négligeant quelque chose, n'hésitez pas à me corriger puisque vous avez pratiquement doubler ma note. J'ai inclus vos résultats dans l'événement de chronométrage que j'ai posté et cela fait comme je m'attends à être similaire à Reza. Pastebin.com/n5ubyigy


Je vois le changement. Cela a plus de sens, mais je suppose que je ne vois pas comment c'est une grande partie d'une amélioration du mien. J'ai donné une hausse juste parce que c'est dimanche.