Variables et Range("A" & .Rows.Count).End(xlUp).Row

Bonjour,

Encore une fois, je viens chercher de l'aide auprès des experts en VBA de ce forum afin d'améliorer un autre de mes codes.

Comment faire pour compter le nombre de "rows" utilisé entre deux variables? Par exemple, entre a11 et a20 ou a15 et a50 avec

Range("a" & .Rows.Count).End(xlUp).Row

Merci

Bonjour,

a11 et a20 ne sont pas des variables mais des adresses de cellules.

Range("a" & .Rows.Count).End(xlUp).Row est utilisé pour déterminer le N° de ligne de la dernière ligne non vide de la colonne A , mais ne permettra pas de compter le nombre de ligne entre deux adresses.

Une solution pour déterminer le nombre de ligne de la plage A11:A20 :

MaVariable = Range("A11:A20").Row

Mais je ne sais pas si je réponds au soucis.

A+

Bonjour,

Une solution pour déterminer le nombre de ligne de la plage A11:A20 :

MaVariable = Range("A11:A20").Row

Ceci fonctionne si l'on souhaite connaitre le nombre total de lignes, mais ça ne nous donne pas les lignes utilisées. On peut faire appel à des fonctions Excel, par exemple :

MaVariable = Application.CountA(Range("A11:A20"))

COUNTA est l'équivalent anglais de NBVAL. Si la cellule contient une formule qui renvoie un résultat du type : "", elle sera aussi comptabilisée...

Je me suis mal exprimé, je crois.

En fait, c'est pour extraire des données entre deux adresses de cellules de la colonne A.

Bonjour Pedro22,

j'avais lu un peu trop vite.

Pour Starbuck:

Une solution possible. Pour la plage A11:A21

For i = 11 to 21
    MsgBox Cells( i, 1).value
Next

Extraire est plutôt vague, qu'est ce que tu veux faire exactement ?

A2+

À partir de la colonne A11, les numéros de 1 à X peuvent s'afficher ( tantôt 1 à 20, tantôt 1 à 30, etc). Ce qui laisse les autres cellules de la colonne vide. Cela permet à ma formule de ne tenir compte que des données s'affichant sur les cellules d'à côté de D11 à W20, par exemple. Il me semble que la formule range("a11" à "aXX" & .rows.count).end(xlup).row. peut traduire ces variations. J'ai essayé plusieurs variations pour ne tenir compte que de cet espace autour de :

Range("a11" & "aXX").rows.count.end(xlup).row

range(rows.count & "a11:aXX").end(xlup).row

etc

mais cela ne fonctionne pas.

Si j'ai bien compris, pour "sélectionner" la plage de A11 à la dernière ligne vide de la colonne A:

Range("A11:A" & Range("A" & Rows.Count).End(xlUp).Row)

Avec rattachement à une feuille :

With worksheets("Feuil1")
.Range("A11:A" & .Range("A" & Rows.Count).End(xlUp).Row)
End with

A+

Range("a11" & "aXX").rows.count.end(xlup).row

range(rows.count & "a11:aXX").end(xlup).row

Bonjour,

Je ne sais pas ce que tu espères obtenir avec cette syntaxe saugrenue ! Si on s'intéresse de plus près à chaque élément de l'instruction d'origine :

Range("A" & Rows.Count).End(xlUp).Row

Range : instruction désignant une plage de cellule(s)

On désigne la plage avec les références de la première et la dernière cellule qui la compose, comme dans Excel.

Par exemple : Range("A1") ou Range("A1:C10").

On peut aussi utiliser un indice de ligne variable :

Ligne = 100
Range("A" & Ligne) 'Correspond à A100
Range("A1:A" & Ligne) 'Correspond à A1:A100
Range("A" & Ligne - 10 & ":C" & Ligne) 'Correspond à A90:C100

Rows : collection désignant les lignes

.Count : propriété pour dénombrer des éléments

Rows.Count
'équivaut implicitement à :
ActiveSheet.Rows.Count
'Compte le nombre de ligne total d'une feuille (dépendant de la version d'Excel, soit 1048576 à partir des version 2007)

Donc Range("A" & Rows.Count) désigne la cellule "A1048576".

.End(xlUp) : équivaut à l'action CTRL + FLECHE HAUT en se plaçant en A1048576. Ce qui renvoie à la première cellule non vide rencontrée en remontant.

.Row : propriété qui renvoie un numéro de ligne d'un objet

Cette instruction a donc pour seule but de donner le n° de ligne de la dernière cellule non vide en colonne A !

Voici en partie le morceau de code en question:

dl = .Range("a" & .Rows.Count).End(xlUp).Row

tb = .Range("d11").Resize(dl - 10, 20).Value

For i = [ax7] To [ax8]

ctr(i, 1) = i

ctr(i, 2) = Application.WorksheetFunction.CountIf([d11].Resize(dl - 10, 20), i)

Next i

...etc.

Les lignes de la colonne A, à partir de A11, sont numérotés de 1 à plus de 200. Tantôt j'ai besoin de travailler avec les 20 premières, tantôt avec les 100 premières, etc. Si j'essaie de remplacer la formule après dl= par nb ou un numéro quelconque cela ne fonctionne pas. Si je change ma numérotation dans la colonne A, c'est-à-dire que j'efface les numéros de 21 à 200 ou 15 à 200 par exemple, alors cela fonctionne.

Plus il y a d'explications, moins je comprends....

et le code m'embrouille encore un peu plus.

Si on veut "travailler" , à partir de A11 sur les 20 premières lignes ( et 20 colonnes comme dans l'exemple):

dim T  ' déclaration de ce qui sera un tableau

T=Range("A11:T31")
ou 
T= Range("A11").resize(20 , 20)
ou 
n=20
T= Range("A11").resize(n , 20)

Si j'essaie de remplacer la formule après dl= par nb ou un numéro quelconque cela ne fonctionne pas.

Où ?

dans tb = .Range("d11").Resize(dl - 10, 20).Value qui est un tableau qu'on utilise pas par la suite ?

ou dans Application.WorksheetFunction.CountIf([d11].Resize(dl - 10, 20), i)

Si je change ma numérotation dans la colonne A, c'est-à-dire que j'efface les numéros de 21 à 200 ...

Là on parle du contenu des cellules ou des N° de lignes

Essaye de donner des explications précises sur ce que tu veux faire.

AlgoPlus,

Vraiment un gros A++ pour l'effort.

Juste une dernière fois...

La colonne A contient la numérotation de mes lignes qui se fait automatiquement à l'aide d'un algo. Ce ne sont pas des données. Juste les numéros de la ligne qui me permet de savoir combien j'en ai. J'ai plus de 200 lignes. Les données sont à côté des lignes ( date et numéros). J'ai essayé la formule .Range("A11:A" & .Range("A" & Rows.Count).End(xlUp).Row). Malheureusement, cela ne fonctionne pas. Et pourtant... Pour que cela fonctionne avec ma formule actuelle je dois triché et jouer d'astuce en effaçant mes numéros dans la colonne. Exemple, si je ne veux que la ligne de 1 à 20, j'efface les numéros 21 à 200. La formule commence à traiter les données à partir de 20 (A30) vers le 1 (A11) et non 200. Pas très pratique que de devoir effacer mes lignes pour traiter mes données. Je souhaite conserver mes numéros de lignes qui s'accumule avec le temps tout en pouvant jouer (variable) sur ma plage de données.

La colonne A contient la numérotation de mes lignes qui se fait automatiquement à l'aide d'un algo. Ce ne sont pas des données. Juste les numéros de la ligne qui me permet de savoir combien j'en ai. J'ai plus de 200 lignes. Les données sont à côté des lignes ( date et numéros). J'ai essayé la formule .Range("A11:A" & .Range("A" & Rows.Count).End(xlUp).Row). Malheureusement, cela ne fonctionne pas. Et pourtant... Pour que cela fonctionne avec ma formule actuelle je dois triché et jouer d'astuce en effaçant mes numéros dans la colonne. Exemple, si je ne veux que la ligne de 1 à 20, j'efface les numéros 21 à 200. La formule commence à traiter les données à partir de 20 (A30) vers le 1 (A11) et non 200. Pas très pratique que de devoir effacer mes lignes pour traiter mes données. Je souhaite conserver mes numéros de lignes qui s'accumule avec le temps tout en pouvant jouer (variable) sur ma plage de données.

.Range("A" & Rows.Count).End(xlUp).Row 

Cette instruction te donne la dernière ligne non vide, comme expliqué dans mon post précédent. Une ligne qui contient une formule qui renvoie "" n'est pas vide !

Plutôt que de te perdre dans de longues explications, le plus simple serait de nous transmettre un fichier type (commenté bien entendu)...

Bonjour Pedro,

À ta demande ci-joint le ficher en question que j'essaie de modifier pour le rendre plus rapide et efficace.

Merci

295test.xlsm (106.09 Ko)

Bonjour,

J'ai trouvé une astuce ou du moins ce que je crois en être une. Je soustrais le nombre total de lignes que j'additionne aux nombres de mes lignes de ma plage de recherche. Dans ce cas-ci de (a11 à a20) et si je veux une plage plus grande, je modifie le 10 pour un 20, 30, etc. dans ma feuille en utilisant les symboles [ ] dans mon code.

Dl = .Cells(Rows.Count, 1).End(xlUp).Row - 286 + 10

Merci à tous pour vos réponses.

Bonjour Pedro22

merci beaucoup j'ai pu résoudre mes deux problèmes

mais je viens d'avoir un autre, voici un bout du code

Private Sub CommandButton1_Click()

Dim ObjOutlook As Object

Dim oBjMail As Object

Dim i As Byte

i = Sheets("ALERTE").Range("A456541")

'Vidange

For i = 9 To ThisWorkbook.Worksheets("ALERTE").Range("E" & Rows.Count).End(xlUp).Row

If ThisWorkbook.Worksheets("ALERTE").Range("L" & i).Value = "URGENT" Then

Set ObjOutlook = New outlook.Application

Set oBjMail = ObjOutlook.CreateItem(olMailItem)

With oBjMail

.To = ThisWorkbook.Worksheets("ALERTE").Range("E" & i).Value

.Subject = "ALERTE VEHICULES"

.Body = "Bonjour Monsieur/Madame," & vbCrLf & vbCrLf _

& "Le délai pour votre Vidange est dans moins d'un mois. La prochaine Vidange est prévue pour:" & vbCrLf & vbCrLf _

& ThisWorkbook.Worksheets("ALERTE").Range("L" & i).Value & vbCrLf & vbCrLf _

& "Nous vous prions de rendre le Véhicule disponible pour cette période, merci de vous preparer en conséquence et de nous informer de l'état d'avancement" & vbCrLf & vbCrLf & vbCrLf _

& "Cordialement "

.Send

End With

ThisWorkbook.Worksheets("ALERTE").Range("L" & i).Value = "Message Envoyé"

End If

Next

MsgBox "Votre message a été bien envoyé."

End Sub

le Problème maintenant est que le mail n'est pas envoyé avec la bonne prochaine date

je pense que le problème vient d'ici

For i = 9 To ThisWorkbook.Worksheets("ALERTE").Range("E" & Rows.Count).End(xlUp).Row

je sais pas s'il faut poser la condition pour chaque ligne en clair je sais pas trop quoi faire

Un grand Merci à tous vraiment j'avais pas vu tous les autres messages sorry

Rechercher des sujets similaires à "variables range rows count end xlup row"