web-dev-qa-db-fra.com

VBA pour sélectionner un certain nombre de colonnes dans un tableau Excel

Comme j'ai appris ici (aussi cité dans SO ) le code suivant peut être utilisé pour sélectionner le corps de données de la colonne 3 dans Table1:

ActiveSheet.ListObjects("Table1").ListColumns(3).DataBodyRange.Select

J'ai besoin d'aide pour sélectionner un certain nombre de colonnes ensemble - disons les colonnes 3 à 5 ou les colonnes X à X + 3.

En utilisant les réponses à cette question, j'ai réussi à aller à mi-chemin en utilisant les noms de colonnes réels:

Range("Table1[[Column3]:[Column5]]").Select

Mais je dois pouvoir utiliser des numéros de colonne au lieu de noms, car ils seront le résultat d'une fonction (c'est-à-dire les colonnes X à X + d).

8
eli-k

Pour une plage contiguë, redimensionnez simplement une seule colonne.

ActiveSheet.ListObjects("Table1").ListColumns(3).DataBodyRange.Resize(, 3).Select

Pour une sélection plus complexe, utilisez Union pour les collecter avant le processus .Select.

With ActiveSheet.ListObjects("Table1")
    Union(.ListColumns(3).DataBodyRange, _
          .ListColumns(4).DataBodyRange, _
          .ListColumns(5).DataBodyRange).Select
End With

Voir Comment éviter d'utiliser Select dans les macros VBA Excel pour de meilleures méthodes.

13
user4039065

Utilisez la méthode Columns sur DataBodyRange qui peut prendre une plage de table relative telle que "A:B"

Donc, si vous vouliez les deux premières colonnes, vous pourriez écrire: ActiveSheet.ListObjects("Table1").DataBodyRange.Columns("A:B").Select

Mais que se passe-t-il si vous souhaitez sélectionner en fonction d'un numéro de colonne relatif? Créez quelques fonctions pour convertir des nombres en cette chaîne:

Sub selectMultipe()
    ActiveSheet.ListObjects("Table1").DataBodyRange.Columns(getRangeStr(1, 2)).Select
End Sub

'Get Range String
Function getRangeStr(startColNum As Long, endColNum As Long) As String
    startCol = ColLtr(startColNum)
    endCol = ColLtr(endColNum)

    getRangeStr = startCol + ":" + endCol
End Function

'Convert column number to letter
Function ColLtr(iCol As Long) As String
    If iCol > 0 And iCol <= Columns.Count Then ColLtr = Replace(Cells(1, iCol).Address(0, 0), 1, "")
End Function

Remarque: Le numéro de colonne à la fonction lettre a été trouvé ici

2
jspek