web-dev-qa-db-fra.com

Créer des plages Excel en utilisant des numéros de colonne dans vba?

Comment est-il possible de créer une plage dans vba en utilisant le numéro de colonne plutôt que la lettre?

36
mezamorphic

Vous trouverez ci-dessous deux solutions pour sélectionner la plage A1. 

Cells(1,1).Select '(row 1, column 1) 
Range("A1").Select

Consultez également ce lien.

Nous vous recommandons vivement d’utiliser Range au lieu de Cells pour travailler avec cellules et groupes de cellules. Cela rend vos phrases beaucoup plus claires et vous n'êtes pas obligé de vous rappeler que la colonne AE est la colonne 31.

La seule fois où vous utiliserez des cellules, c’est lorsque vous souhaitez tout sélectionner les cellules d'une feuille de calcul. Par exemple: Cells.Select Pour tout sélectionner puis videz toutes les cellules de valeurs ou de formules que vous utiliserez: Cells.ClearContents

-

"Cells" est particulièrement utile lors du réglage dynamique des plages et en boucle à travers les plages en utilisant des compteurs. Définir des plages en utilisant les lettres sous forme de numéros de colonne peuvent être plus transparentes à court terme, mais cela rendra également votre application plus rigide car ce sont des représentations "difficiles codées" - et non dynamiques.

Merci à Kim Gysen

30
CustomX

Pour référencer la plage de cellules, vous pouvez utiliser Range (Cell1, Cell2) , sample:

Sub RangeTest()
  Dim testRange As Range
  Dim targetWorksheet As Worksheet

  Set targetWorksheet = Worksheets("MySheetName")

  With targetWorksheet
    .Cells(5, 10).Select 'selects cell J5 on targetWorksheet
    Set testRange = .Range(.Cells(5, 5), .Cells(10, 10))
  End With

  testRange.Select 'selects range of cells E5:J10 on targetWorksheet

End Sub

enter image description here

49
dee

Range.EntireColumn

Oui! Vous pouvez utiliser Range.EntireColumnMSDN

dim column : column = 4

dim column_range : set column_range = Sheets(1).Cells(column).EntireColumn

Plage ("NomColonne: NomColonne")

Si vous recherchez une colonne spécifique, vous pouvez créer une plage de colonnes codée en dur avec la syntaxe, par exemple. Range("D:D").

Cependant, j'utiliserais une colonne entière car cela me donnerait plus de flexibilité pour changer cette colonne ultérieurement.

Feuille de travail. Colonnes

Worksheet.Columns fournit à Range l'accès à une colonne dans une feuille de calcul. MSDN

Si vous souhaitez accéder à la première colonne de la première feuille. Vous devriez.appeler la fonction Columns sur la feuille de calcul.

dim column_range: set column_range = Sheets(1).Columns(1)

La propriété Columns est également disponible sur toute RangeMSDN

EntireRow peut également être utile si vous avez une plage pour une cellule unique mais souhaitez atteindre d'autres cellules de la ligne, ce qui s'apparente à une LOOKUP

dim id : id = 12345


dim found : set found = Range("A:A").Find(id)

if not found is Nothing then
    'Get the fourth cell from the match
    MsgBox found.EntireRow.Cells(4)
end if
7
James Forbes

Voici un remplacement condensé de la fonction ConvertToLetter qui devrait théoriquement fonctionner pour tous les entiers positifs possibles. Par exemple, 1412 produit "BBH" comme résultat.

Public Function ColumnNumToStr(ColNum As Integer) As String
Dim Value As Integer
Dim Rtn As String
    Rtn = ""
    Value = ColNum - 1
    While Value > 25
        Rtn = Chr(65 + (Value Mod 26)) & Rtn
        Value = Fix(Value / 26) - 1
    Wend
    Rtn = Chr(65 + Value) & Rtn
    ColumnNumToStr = Rtn
End Function
3
Darin

Si vous souhaitez transformer votre numéro de colonne en une lettre:

Function ConvertToLetter(iCol As Integer) As String
    Dim iAlpha As Integer
    Dim iRemainder As Integer
    iAlpha = Int(iCol / 27)
    iRemainder = iCol - (iAlpha * 26)
    If iAlpha > 0 Then
        ConvertToLetter = Chr(iAlpha + 64)
    End If
    If iRemainder > 0 Then
        ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
    End If
End Function

De cette façon, vous pourriez faire quelque chose comme ça:

Function selectColumnRange(colNum As Integer, targetWorksheet As Worksheet)
    Dim colLetter As String
    Dim testRange As Range
    colLetter = ConvertToLetter(colNum)
    testRange = targetWorksheet.Range(colLetter & ":" & colLetter).Select
End Function

Cet exemple de fonction sélectionnerait la colonne entière (c'est-à-dire Range ("A: A"). Select)

Source: http://support.Microsoft.com/kb/833402

2
stackPusher

Ces réponses semblent étrangement compliquées. À moins que quelque chose me manque ... si vous voulez convertir des nombres en lettres, vous pouvez simplement les stocker dans un tableau en utilisant une boucle for, puis appeler le numéro associé à cette lettre de colonne. Ainsi

For intloop = 1 To 26
    colcheck(intloop) = Chr$(64 + intloop)
    For lenloop = 1 To 26
        colcheck((intloop * 26) + lenloop) = Chr$(64 + intloop) & Chr$(64 + lenloop)
        For terloop = 1 To 26
            colcheck((intloop * 676) + (lenloop * 26) + terloop) = Chr$(64 + intloop) & Chr$(64 + lenloop) & Chr$(64 + terloop)
            For qualoop = 1 To 26
                colcheck((intloop * 17576) + (lenloop * 676) + (terloop * 26) + qualoop) = Chr$(64 + intloop) & Chr$(64 + lenloop) & Chr$(64 + terloop) & Chr$(64 + qualoop)
            Next qualoop
        Next terloop
    Next lenloop
Next intloop

Ensuite, utilisez simplement colcheck (yourcolumnnumberhere) et vous obtiendrez l’en-tête de colonne associé à cette lettre (par exemple, colcheck (703) = AAA

1
Chahe

J'aime beaucoup la fonction ConvertToLetter de stackPusher en tant que solution. Cependant, en travaillant avec cela, j'ai remarqué plusieurs erreurs se produisant à des entrées très spécifiques en raison de quelques défauts de calcul. Par exemple, entrer 392 renvoie 'N \', 418 renvoie 'O \', 444 renvoie 'P \', etc.

J'ai retravaillé la fonction et le résultat produit la sortie correcte pour toutes les entrées jusqu'à 703 (qui est le premier index de colonne à trois lettres, AAA).

Function ConvertToLetter2(iCol As Integer) As String
    Dim First As Integer
    Dim Second As Integer
    Dim FirstChar As String
    Dim SecondChar As String

    First = Int(iCol / 26)
    If First = iCol / 26 Then
        First = First - 1
    End If
    If First = 0 Then
        FirstChar = ""
    Else
        FirstChar = Chr(First + 64)
    End If

    Second = iCol Mod 26
    If Second = 0 Then
        SecondChar = Chr(26 + 64)
    Else
        SecondChar = Chr(Second + 64)
    End If

    ConvertToLetter2 = FirstChar & SecondChar

End Function
1
JohannesKepler

Haha, Lovely - permettez-moi d'inclure également ma version du code de stackPusher :). Nous utilisons cette fonctionnalité en C #. Fonctionne bien pour toutes les gammes Excel .:

public static String ConvertToLiteral(int number)
{
        int firstLetter = (((number - 27) / (26 * 26))) % 26;
        int middleLetter = ((((number - 1) / 26)) % 26);

        int lastLetter = (number % 26);
        firstLetter = firstLetter == 0 ? 26 : firstLetter;
        middleLetter = middleLetter == 0 ? 26 : middleLetter;
        lastLetter = lastLetter == 0 ? 26 : lastLetter;
        String returnedString = "";
        returnedString = number > 27 * 26 ? (Convert.ToChar(firstLetter + 64).ToString()) : returnedString;
        returnedString += number > 26 ? (Convert.ToChar(middleLetter + 64).ToString()) : returnedString;
        returnedString += lastLetter >= 0 ? (Convert.ToChar(lastLetter + 64).ToString()) : returnedString;
        return returnedString;
}
0
Aleksander Fular