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?
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
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
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
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
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)
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
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
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;
}