OVH Cloud OVH Cloud

Un AND qui remonte

33 réponses
Avatar
Comres.metz
Bonjour à toutes et à tous,

Je voudrais combiner ces 2 formules :

For lin = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row To 1
Step -1
If Cells(lin, 1) = " " Then Rows(lin).Delete shift:=xlUp
Next lin

Pour remonter de la derniere ligne à la premiere et

teste = Range("E26") = "3 mois") AND Range("A26") = " "
if teste = True then
Range("N26") = "1"
end if
qui me teste 2 conditions sur la ligne et qui retourne1 si les 2 conditions
sont bonnes.
Je voudrais pouvoir tester ces 2 conditions ligne par ligne en remontant.
Merci d'avance.

10 réponses

1 2 3 4
Avatar
Jacky
Bonjour,

Je voudrais pouvoir tester ces 2 conditions ligne par ligne en remontant.
Rien à voir avec la boucle

ceci devrait suffir.
'----
If [E26] = "3 mois" And [A26] = " " Then [N26] = "1"
'----
Ps : je ne crois pas que ce soit une bonne idée de travailler avec une
cellule contenant un espace.

Salutations
JJ

"Comres.metz" a écrit dans le message de
news:42ce7bf4$2$25045$
Bonjour à toutes et à tous,

Je voudrais combiner ces 2 formules :

For lin = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row To
1

Step -1
If Cells(lin, 1) = " " Then Rows(lin).Delete shift:=xlUp
Next lin

Pour remonter de la derniere ligne à la premiere et

teste = Range("E26") = "3 mois") AND Range("A26") = " "
if teste = True then
Range("N26") = "1"
end if
qui me teste 2 conditions sur la ligne et qui retourne1 si les 2
conditions

sont bonnes.
Je voudrais pouvoir tester ces 2 conditions ligne par ligne en remontant.
Merci d'avance.




Avatar
Hervé
Bonjour,
Il faut être prudent en utilisant "UsedRange" car la plage ne correspond pas
toujours à ce que l'on pense. Il vaut mieux utiliser la fonction
"PlageUtilisee" qui retourne réellement la plage de cellules utilisée. Pour
tester, formate une cellule un peu éloignée de la plage de cellules utilisée
sans inscrire de valeur et exécute cette proc en ayant pris soins de mettre
la fonction "PlageUtilisee" dans le même module :
'-------------------
Sub Test_UsedRange()
MsgBox PlageUtilisee(ActiveSheet).Address _
& vbCrLf _
& ActiveSheet.UsedRange.Address
End Sub
'-------------------

Regarde si cela te convient, il te faudra malgré tout adapter :
Sub Tester()
Dim Test As Boolean
Dim Lin As Integer
Dim Plg As Range

Set Plg = PlageUtilisee(ActiveSheet)

For Lin = Plg.Rows.Count To 1 Step -1
Test = Plg(Lin, 1) = "3 mois" And Plg(Lin, 5) = " "
'pour supprimer la ligne entière
'If Test = True Then Plg(Lin, 1).EntireRow.Delete
If Test = True Then Range("N" & Plg(Lin, 1).Row) = 1
Next Lin

Set Plg = Nothing
End Sub

Function PlageUtilisee(Fe As Worksheet) As Range
With Fe
Set PlageUtilisee = .Range(.Cells( _
.Cells.Find("*", .[A1], -4123, , 1, 1).Row, _
.Cells.Find("*", .[A1], -4123, , 2, 1).Column), _
.Cells( _
.Cells.Find("*", .[A1], -4123, , 1, 2).Row, _
.Cells.Find("*", .[A1], -4123, , 2, 2).Column))
End With
Set Fe = Nothing
End Function

Hervé.

"Comres.metz" a écrit dans le message news:
42ce7bf4$2$25045$
Bonjour à toutes et à tous,

Je voudrais combiner ces 2 formules :

For lin = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row To
1

Step -1
If Cells(lin, 1) = " " Then Rows(lin).Delete shift:=xlUp
Next lin

Pour remonter de la derniere ligne à la premiere et

teste = Range("E26") = "3 mois") AND Range("A26") = " "
if teste = True then
Range("N26") = "1"
end if
qui me teste 2 conditions sur la ligne et qui retourne1 si les 2
conditions

sont bonnes.
Je voudrais pouvoir tester ces 2 conditions ligne par ligne en remontant.
Merci d'avance.




Avatar
AV
Il faut être prudent en utilisant "UsedRange" car la plage ne correspond pas
toujours à ce que l'on pense.


Depuis que je me tue à le répéter...
C'est bien qu'il y en ai un qui prenne la relève !
;-)

AV

Avatar
AV
PS : dans ta fonction, la syntaxe du find
Set PlageUtilisee = .Range(.Cells(.Cells.Find("*", .[A1],
pose problème car, comme le find commence toujours sa recherche après la cellule

donnée comme 2° argument (A1 dans ton code), il peut y avoir quelque soucis en
cas de plage discontinue
Exemple :
Dans une feuille vierge, renseigner seulement la plage A1 et C3:C5
Réponse attendue : A1:C6
Ta fonction --> C3:C6 !

Personnellement j'utilise la syntaxe suivante :
Sub Adresse_UsedRange()
L1 = Cells.Find("*", [IV65536], , , xlByRows).Row
C1 = Cells.Find("*", [IV65536], , , xlByColumns).Column
Lx = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Cx = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
MsgBox Range(Cells(L1, C1), Cells(Lx, Cx)).Address
End Sub

AV

Avatar
Lolo
C'est génial, c'est exactement ce que je voulais.
Je suis maintenant en train d'étudier le mecanisme. Je débute en VBA.
Merci pour tout.


Bonjour,
Il faut être prudent en utilisant "UsedRange" car la plage ne correspond pas
toujours à ce que l'on pense. Il vaut mieux utiliser la fonction
"PlageUtilisee" qui retourne réellement la plage de cellules utilisée. Pour
tester, formate une cellule un peu éloignée de la plage de cellules utilisée
sans inscrire de valeur et exécute cette proc en ayant pris soins de mettre
la fonction "PlageUtilisee" dans le même module :
'-------------------
Sub Test_UsedRange()
MsgBox PlageUtilisee(ActiveSheet).Address _
& vbCrLf _
& ActiveSheet.UsedRange.Address
End Sub
'-------------------

Regarde si cela te convient, il te faudra malgré tout adapter :
Sub Tester()
Dim Test As Boolean
Dim Lin As Integer
Dim Plg As Range

Set Plg = PlageUtilisee(ActiveSheet)

For Lin = Plg.Rows.Count To 1 Step -1
Test = Plg(Lin, 1) = "3 mois" And Plg(Lin, 5) = " "
'pour supprimer la ligne entière
'If Test = True Then Plg(Lin, 1).EntireRow.Delete
If Test = True Then Range("N" & Plg(Lin, 1).Row) = 1
Next Lin

Set Plg = Nothing
End Sub

Function PlageUtilisee(Fe As Worksheet) As Range
With Fe
Set PlageUtilisee = .Range(.Cells( _
.Cells.Find("*", .[A1], -4123, , 1, 1).Row, _
.Cells.Find("*", .[A1], -4123, , 2, 1).Column), _
.Cells( _
.Cells.Find("*", .[A1], -4123, , 1, 2).Row, _
.Cells.Find("*", .[A1], -4123, , 2, 2).Column))
End With
Set Fe = Nothing
End Function

Hervé.

"Comres.metz" a écrit dans le message news:
42ce7bf4$2$25045$

Bonjour à toutes et à tous,

Je voudrais combiner ces 2 formules :

For lin = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row To


1

Step -1
If Cells(lin, 1) = " " Then Rows(lin).Delete shift:=xlUp
Next lin

Pour remonter de la derniere ligne à la premiere et

teste = Range("E26") = "3 mois") AND Range("A26") = " "
if teste = True then
Range("N26") = "1"
end if
qui me teste 2 conditions sur la ligne et qui retourne1 si les 2


conditions

sont bonnes.
Je voudrais pouvoir tester ces 2 conditions ligne par ligne en remontant.
Merci d'avance.









Avatar
Hervé
Bonjour Alain,
Effectivement, tu as raison, je n'ai pas testé avec valeur en A1 :o(( donc,
d'après ton code, ma fonction devient :

Function PlageUtilisee(Fe As Worksheet) As Range
With Fe
Set PlageUtilisee = .Range(.Cells( _
.Cells.Find("*", .[IV65536], , , 1, 1).Row, _
.Cells.Find("*", .[IV65536], , , 2, 1).Column), _
.Cells( _
.Cells.Find("*", .[A1], , , 1, 2).Row, _
.Cells.Find("*", .[A1], , , 2, 2).Column))
End With
Set Fe = Nothing
End Function

J'ai testé avec valeur en A1 et en IV65536 et le retour est sans lettre de
colonne ? ne devrait-il pas être $A$1:$IV$65536 ? alors qu'il est $1:$65536
??? bizarre

Merci encore et bon week-end à toi et à tout le monde !
Hervé.

"AV" a écrit dans le message news:
ew7$
PS : dans ta fonction, la syntaxe du find
Set PlageUtilisee = .Range(.Cells(.Cells.Find("*", .[A1],
pose problème car, comme le find commence toujours sa recherche après la

cellule

donnée comme 2° argument (A1 dans ton code), il peut y avoir quelque
soucis en

cas de plage discontinue
Exemple :
Dans une feuille vierge, renseigner seulement la plage A1 et C3:C5
Réponse attendue : A1:C6
Ta fonction --> C3:C6 !

Personnellement j'utilise la syntaxe suivante :
Sub Adresse_UsedRange()
L1 = Cells.Find("*", [IV65536], , , xlByRows).Row
C1 = Cells.Find("*", [IV65536], , , xlByColumns).Column
Lx = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Cx = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
MsgBox Range(Cells(L1, C1), Cells(Lx, Cx)).Address
End Sub

AV





Avatar
AV
J'ai testé avec valeur en A1 et en IV65536 et le retour est sans lettre de
colonne ? ne devrait-il pas être $A$1:$IV$65536 ? alors qu'il est $1:$65536
??? bizarre


Exact, j'avais constaté (mais j'ai pas de réponse) ce "phénomène" étrange mais
bon ...$A$1:$IV$65536 ou $1:$65536 c'est bonnet blanc/blanc bonnet

AV

Avatar
Hervé
c'est bonnet blanc/blanc bonnet
Effectivement, c'est comme $A:$IV

Hervé.

"AV" a écrit dans le message news:

J'ai testé avec valeur en A1 et en IV65536 et le retour est sans lettre
de


colonne ? ne devrait-il pas être $A$1:$IV$65536 ? alors qu'il est
$1:$65536


??? bizarre


Exact, j'avais constaté (mais j'ai pas de réponse) ce "phénomène" étrange
mais

bon ...$A$1:$IV$65536 ou $1:$65536 c'est bonnet blanc/blanc bonnet

AV





Avatar
ChrisV
c'est bonnet blanc/blanc bonnet



Heu...
fait pas très clean quand même... :-(


Sub zaza()
On Error Resume Next
Set derC = Cells.Find("*", , , , , xlPrevious)
Set preC = Cells.FindNext(derC)
If Err.Number <> 0 Then
MsgBox "Aucune saisie présente !"
Else
If derC.Address <> preC.Address Then
MsgBox preC.Address & ":" & derC.Address
Else: MsgBox preC.Address
End If
End If
Set derC = Nothing
Set preC = Nothing
End Sub


ChrisV


"Hervé" a écrit dans le message de news:

c'est bonnet blanc/blanc bonnet
Effectivement, c'est comme $A:$IV

Hervé.

"AV" a écrit dans le message news:

J'ai testé avec valeur en A1 et en IV65536 et le retour est sans lettre
de


colonne ? ne devrait-il pas être $A$1:$IV$65536 ? alors qu'il est
$1:$65536


??? bizarre


Exact, j'avais constaté (mais j'ai pas de réponse) ce "phénomène" étrange
mais

bon ...$A$1:$IV$65536 ou $1:$65536 c'est bonnet blanc/blanc bonnet

AV









Avatar
AV
fait pas très clean quand même... :-(


Hum.hum pour la Sub zaza() avec le FindNext
Test : cellules renseignées :
A1 - B3 - C2
Réponse attendue : A1:C3
Réponse retournée : A1:B3

Là c'est "bonnet noir" !
;-)
AV

1 2 3 4