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?

35
demandé sur mezamorphic 2012-10-31 15:56:07

8 réponses

Voici 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 fortement D'utiliser Range au lieu de Cells pour travailler avec des cellules et des 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 est lorsque vous voulez tout sélectionner les cellules d'une feuille de calcul. Par exemple: les Cellules.Sélectionner pour tout sélectionner cellules puis vider toutes les cellules de valeurs ou de formules que vous utiliserez: Cellule.ClearContents

--

"Cells" est particulièrement utile lorsque vous définissez des plages dynamiquement et boucler les plages en utilisant des compteurs. Définition de plages à l'aide de les lettres comme numéros de colonne peuvent être plus transparentes à court terme, mais cela rendra également votre application plus rigide car elle est " dure coder" représentations - pas dynamique.

Grâce à Kim Gysen

30
répondu CustomX 2017-05-23 12:02:14

Pour référence gamme de cellules u peut utiliser gamme (Cell1, Cell2), échantillon:

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

entrez la description de l'image ici

47
répondu dee 2014-06-01 15:38:13

Plage.EntireColumn

Oui! Vous pouvez utiliser Range.EntireColumn MSDN

dim column : column = 4

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

Range("Nomcolonne:Nomcolonne")

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

Cependant, j'utiliserais la colonne entière car elle offre plus de flexibilité pour changer cette colonne plus tard.

Feuille de travail.Colonnes

Worksheet.Columns fournit un accès de plage à une colonne dans une feuille de calcul. MSDN

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

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

Le Columns la propriété est également disponible sur n'importe quel Range MSDN

EntireRow peut également être utile si vous avez une gamme pour une seule cellule, mais souhaitez rejoindre d'autres cellules de la ligne, qui s'apparente à un 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
6
répondu James Forbes 2015-05-05 08:09:42

Voici un remplacement condensé de la fonction ConvertToLetter qui, en théorie, devrait 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
répondu Darin 2016-07-13 16:33:30

Dans le cas où vous cherchiez à 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 pouvez faire quelque chose comme ceci:

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 la plage ("A:A").Sélectionnez)

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

2
répondu stackPusher 2014-12-11 17:16:59

J'aime vraiment la fonction ConvertToLetter de stackPusher en tant que solution. Cependant, en travaillant avec, j'ai remarqué plusieurs erreurs se produisant à des entrées très spécifiques en raison de quelques défauts dans les mathématiques. Par exemple, la saisie de 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
répondu JohannesKepler 2015-05-13 20:44:41

Ces réponses semblent étrangement alambiquées. Sauf si je suis en manque de quelque chose...si vous voulez convertir des nombres en lettres, vous pouvez simplement les stocker tous dans un tableau en utilisant une boucle for puis appeler le numéro associé à cette lettre de colonne. Comme ça

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 (c.-à-d. colcheck (703) = AAA

1
répondu Chahe 2016-06-21 10:42:23

Haha, Lovely-permettez-moi également d'inclure ma version du code de stackPusher :). Nous utilisons cette fonctionnalité en C#. Fonctionne très bien pour toutes les plages 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
répondu Aleksander Fular 2015-12-22 12:01:06