Comment est-il possible de créer une plage dans vba en utilisant le numéro de colonne plutôt que la lettre?
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
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
Oui! Vous pouvez utiliser Range.EntireColumn
MSDN
dim column : column = 4
dim column_range : set column_range = Sheets(1).Cells(column).EntireColumn
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.
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 Range
MSDN
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
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
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)
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
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
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;
}