Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA Excel 2003 Masquer les lignes lorsque quantité = 0. Pour 500 lignes c'est un peu long. Peut-on accélérer ?

7 réponses
Avatar
Céline Brien
Bonjour à tous,
Deuxième journée de soleil de suite. On n'a pas vu ça depuis des semaines !
C'est doux...
Vous trouverez ci-après des codes pour supprimer les lignes d'un bon de
commande lorsque les quantités sont à zéro.
Le tout fonctionne très bien, mais pour 500 lignes l'opération prend 30
secondes.
Auriez-vous des codes magiques pour accélérer le tout ???
Merci de votre aide précieuse,
Céline

-----------------------------------------------------------------------
' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de la
section est aussi masqué.
'


' Macros créées par D. Daigle, le 11 août 2001
' Commentaires ajoutés par Céline Brien en juillet 2006

' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de la
section est aussi masqué.
'

Sub HideZeroOrderLines()

Dim RowNumber As Integer
Dim PrevRowNum As Integer
Dim CellValue As String
Dim ColNum As Integer
Dim SectionHead As String
Dim HeadRowNum As Integer
Dim NeedHeader As Boolean

ActiveSheet.Protect UserInterfaceOnly:=True
Application.ScreenUpdating = False

CellValue = ""
' À adapter à votre bon de commande. Indique le numéro de la ligne du
premier en-tête de section
RowNumber = 32

' À adapter à votre bon de commande. Indique le nombre de lignes à vérifier.
' Le nombre peut être plus élevé que le nombre de lignes du bon de commande.
Do Until RowNumber = 500
NeedHeader = False
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne contenant
' le mot à vérifier et indiquant que la ligne est un en-tête de section.
SectionHead = ActiveSheet.Cells(RowNumber, 22).Value
' À adapter à votre bon de commande. Le mot entre guillemets est le mot dont
la présence
' indique que la ligne est un en-tête de section.
If SectionHead = "extension" Then
HeadRowNum = RowNumber
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
' Si la cellule est égale à zéro, la ligne est masquée.
' Sinon, la variable NeedHeader est égale à vrai et l'en-tête de la section
ne sera pas masqué.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Do While IsNumeric(CellValue)
If CellValue = "0" Then
Rows(RowNumber).Select
Selection.EntireRow.Hidden = True
Else
NeedHeader = True
End If
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Loop
If NeedHeader = False Then
Rows(HeadRowNum).Select
Selection.EntireRow.Hidden = True
NeedHeader = False
End If
Else
RowNumber = RowNumber + 1
End If
Loop
ActiveSheet.Cells(1, 1).Select
Application.ScreenUpdating = True

'
End Sub

7 réponses

Avatar
Jacky
Bonsoir

A première vue....
Suppression des "select"
exemple:
If NeedHeader = False Then
'Rows(HeadRowNum).Select ***a supprimer
Rows(HeadRowNum).EntireRow.Hidden = True
NeedHeader = False
End If

--
Salutations
JJ

"Céline Brien" a écrit dans le message de
news:
Bonjour à tous,
Deuxième journée de soleil de suite. On n'a pas vu ça depuis des semaines
! C'est doux...
Vous trouverez ci-après des codes pour supprimer les lignes d'un bon de
commande lorsque les quantités sont à zéro.
Le tout fonctionne très bien, mais pour 500 lignes l'opération prend 30
secondes.
Auriez-vous des codes magiques pour accélérer le tout ???
Merci de votre aide précieuse,
Céline

-----------------------------------------------------------------------
' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de la
section est aussi masqué.
'


' Macros créées par D. Daigle, le 11 août 2001
' Commentaires ajoutés par Céline Brien en juillet 2006

' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de la
section est aussi masqué.
'

Sub HideZeroOrderLines()

Dim RowNumber As Integer
Dim PrevRowNum As Integer
Dim CellValue As String
Dim ColNum As Integer
Dim SectionHead As String
Dim HeadRowNum As Integer
Dim NeedHeader As Boolean

ActiveSheet.Protect UserInterfaceOnly:=True
Application.ScreenUpdating = False

CellValue = ""
' À adapter à votre bon de commande. Indique le numéro de la ligne du
premier en-tête de section
RowNumber = 32

' À adapter à votre bon de commande. Indique le nombre de lignes à
vérifier.
' Le nombre peut être plus élevé que le nombre de lignes du bon de
commande.
Do Until RowNumber = 500
NeedHeader = False
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne contenant
' le mot à vérifier et indiquant que la ligne est un en-tête de section.
SectionHead = ActiveSheet.Cells(RowNumber, 22).Value
' À adapter à votre bon de commande. Le mot entre guillemets est le mot
dont la présence
' indique que la ligne est un en-tête de section.
If SectionHead = "extension" Then
HeadRowNum = RowNumber
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
' Si la cellule est égale à zéro, la ligne est masquée.
' Sinon, la variable NeedHeader est égale à vrai et l'en-tête de la
section ne sera pas masqué.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Do While IsNumeric(CellValue)
If CellValue = "0" Then
Rows(RowNumber).Select
Selection.EntireRow.Hidden = True
Else
NeedHeader = True
End If
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Loop
If NeedHeader = False Then
Rows(HeadRowNum).Select
Selection.EntireRow.Hidden = True
NeedHeader = False
End If
Else
RowNumber = RowNumber + 1
End If
Loop
ActiveSheet.Cells(1, 1).Select
Application.ScreenUpdating = True

'
End Sub




Avatar
AV
Vous trouverez ci-après des codes pour supprimer les lignes d'un bon de
commande lorsque les quantités sont à zéro.
Le tout fonctionne très bien, mais pour 500 lignes l'opération prend 30
secondes.
Auriez-vous des codes magiques pour accélérer le tout ???


Une méthode :
Les grandes lignes :
* Insérer une colonne pour mémoriser l'ordre des données
* Trier la colonne quantité
* Filtrer sur <> 0
* Supprimer les lignes filtrées
* Re-trier sur la colonne ajoutée pour remettre en ordre, et la supprimer

Voilà ... C'est fini et ça a duré une fraction de seconde !

Pour avoir une idée des temps d'exécution comparés des différentes méthodes,
dont celles utilisant une boucle, regarde le fil du 16/11/2006 22:35

AV

Avatar
Céline Brien
Bonjour à tous,
Bonjour Jacky,
Merci pour ta réponse.
J'ai ajouté une apostrophe aux deux lignes suivantes :
' Rows(RowNumber).Select
' Rows(HeadRowNum).Select
Toujours 30 secondes et les lignes ne sont pas masquées ;-(
Avez-vous d'autres suggestions ?
Merci,
Céline


"Jacky" a écrit dans le message de news:
%
Bonsoir

A première vue....
Suppression des "select"
exemple:
If NeedHeader = False Then
'Rows(HeadRowNum).Select ***a supprimer
Rows(HeadRowNum).EntireRow.Hidden = True
NeedHeader = False
End If

--
Salutations
JJ

"Céline Brien" a écrit dans le message de
news:
Bonjour à tous,
Deuxième journée de soleil de suite. On n'a pas vu ça depuis des semaines
! C'est doux...
Vous trouverez ci-après des codes pour supprimer les lignes d'un bon de
commande lorsque les quantités sont à zéro.
Le tout fonctionne très bien, mais pour 500 lignes l'opération prend 30
secondes.
Auriez-vous des codes magiques pour accélérer le tout ???
Merci de votre aide précieuse,
Céline

-----------------------------------------------------------------------
' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de la
section est aussi masqué.
'


' Macros créées par D. Daigle, le 11 août 2001
' Commentaires ajoutés par Céline Brien en juillet 2006

' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de la
section est aussi masqué.
'

Sub HideZeroOrderLines()

Dim RowNumber As Integer
Dim PrevRowNum As Integer
Dim CellValue As String
Dim ColNum As Integer
Dim SectionHead As String
Dim HeadRowNum As Integer
Dim NeedHeader As Boolean

ActiveSheet.Protect UserInterfaceOnly:=True
Application.ScreenUpdating = False

CellValue = ""
' À adapter à votre bon de commande. Indique le numéro de la ligne du
premier en-tête de section
RowNumber = 32

' À adapter à votre bon de commande. Indique le nombre de lignes à
vérifier.
' Le nombre peut être plus élevé que le nombre de lignes du bon de
commande.
Do Until RowNumber = 500
NeedHeader = False
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne contenant
' le mot à vérifier et indiquant que la ligne est un en-tête de section.
SectionHead = ActiveSheet.Cells(RowNumber, 22).Value
' À adapter à votre bon de commande. Le mot entre guillemets est le mot
dont la présence
' indique que la ligne est un en-tête de section.
If SectionHead = "extension" Then
HeadRowNum = RowNumber
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
' Si la cellule est égale à zéro, la ligne est masquée.
' Sinon, la variable NeedHeader est égale à vrai et l'en-tête de la
section ne sera pas masqué.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Do While IsNumeric(CellValue)
If CellValue = "0" Then
Rows(RowNumber).Select
Selection.EntireRow.Hidden = True
Else
NeedHeader = True
End If
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Loop
If NeedHeader = False Then
Rows(HeadRowNum).Select
Selection.EntireRow.Hidden = True
NeedHeader = False
End If
Else
RowNumber = RowNumber + 1
End If
Loop
ActiveSheet.Cells(1, 1).Select
Application.ScreenUpdating = True

'
End Sub








Avatar
Jacky
Re...
J'ai ajouté une apostrophe aux deux lignes suivantes :
Cela ne suffit pas , il faut modifier aussi les lignes directement en

dessous, comme montrer dans l'exemple.
'Rows(HeadRowNum).Select ***a supprimer
**** Selection.EntireRow.Hidden = True****

remplacer "Selection" par "Rows(HeadRowNum)"
Rows(HeadRowNum).EntireRow.Hidden = True


Et la proposition d'AV ??
--
Salutations
JJ

"Céline Brien" a écrit dans le message de
news:
Bonjour à tous,
Bonjour Jacky,
Merci pour ta réponse.
J'ai ajouté une apostrophe aux deux lignes suivantes :
' Rows(RowNumber).Select
' Rows(HeadRowNum).Select
Toujours 30 secondes et les lignes ne sont pas masquées ;-(
Avez-vous d'autres suggestions ?
Merci,
Céline


"Jacky" a écrit dans le message de news:
%
Bonsoir

A première vue....
Suppression des "select"
exemple:
If NeedHeader = False Then
'Rows(HeadRowNum).Select ***a supprimer
Rows(HeadRowNum).EntireRow.Hidden = True
NeedHeader = False
End If

--
Salutations
JJ

"Céline Brien" a écrit dans le message de
news:
Bonjour à tous,
Deuxième journée de soleil de suite. On n'a pas vu ça depuis des
semaines ! C'est doux...
Vous trouverez ci-après des codes pour supprimer les lignes d'un bon de
commande lorsque les quantités sont à zéro.
Le tout fonctionne très bien, mais pour 500 lignes l'opération prend 30
secondes.
Auriez-vous des codes magiques pour accélérer le tout ???
Merci de votre aide précieuse,
Céline

-----------------------------------------------------------------------
' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de la
section est aussi masqué.
'


' Macros créées par D. Daigle, le 11 août 2001
' Commentaires ajoutés par Céline Brien en juillet 2006

' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de la
section est aussi masqué.
'

Sub HideZeroOrderLines()

Dim RowNumber As Integer
Dim PrevRowNum As Integer
Dim CellValue As String
Dim ColNum As Integer
Dim SectionHead As String
Dim HeadRowNum As Integer
Dim NeedHeader As Boolean

ActiveSheet.Protect UserInterfaceOnly:=True
Application.ScreenUpdating = False

CellValue = ""
' À adapter à votre bon de commande. Indique le numéro de la ligne du
premier en-tête de section
RowNumber = 32

' À adapter à votre bon de commande. Indique le nombre de lignes à
vérifier.
' Le nombre peut être plus élevé que le nombre de lignes du bon de
commande.
Do Until RowNumber = 500
NeedHeader = False
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne contenant
' le mot à vérifier et indiquant que la ligne est un en-tête de section.
SectionHead = ActiveSheet.Cells(RowNumber, 22).Value
' À adapter à votre bon de commande. Le mot entre guillemets est le mot
dont la présence
' indique que la ligne est un en-tête de section.
If SectionHead = "extension" Then
HeadRowNum = RowNumber
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
' Si la cellule est égale à zéro, la ligne est masquée.
' Sinon, la variable NeedHeader est égale à vrai et l'en-tête de la
section ne sera pas masqué.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Do While IsNumeric(CellValue)
If CellValue = "0" Then
Rows(RowNumber).Select
Selection.EntireRow.Hidden = True
Else
NeedHeader = True
End If
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Loop
If NeedHeader = False Then
Rows(HeadRowNum).Select
Selection.EntireRow.Hidden = True
NeedHeader = False
End If
Else
RowNumber = RowNumber + 1
End If
Loop
ActiveSheet.Cells(1, 1).Select
Application.ScreenUpdating = True

'
End Sub












Avatar
Céline Brien
Bonjour à tous,
Bonjour Jacky,
Merci beaucoup pour le suivi.
Où avais-je la tête ?
Rows(RowNumber).Hidden = True
Rows(HeadRowNum).EntireRow.Hidden = True
Toujours 30 secondes ;-( mais les lignes sont masquées.
Je vous reviens après avoir tester la solution de AV.
Merci encore !
Céline


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

Re...
J'ai ajouté une apostrophe aux deux lignes suivantes :
Cela ne suffit pas , il faut modifier aussi les lignes directement en

dessous, comme montrer dans l'exemple.
'Rows(HeadRowNum).Select ***a supprimer
**** Selection.EntireRow.Hidden = True****

remplacer "Selection" par "Rows(HeadRowNum)"
Rows(HeadRowNum).EntireRow.Hidden = True


Et la proposition d'AV ??
--
Salutations
JJ

"Céline Brien" a écrit dans le message de
news:
Bonjour à tous,
Bonjour Jacky,
Merci pour ta réponse.
J'ai ajouté une apostrophe aux deux lignes suivantes :
' Rows(RowNumber).Select
' Rows(HeadRowNum).Select
Toujours 30 secondes et les lignes ne sont pas masquées ;-(
Avez-vous d'autres suggestions ?
Merci,
Céline


"Jacky" a écrit dans le message de news:
%
Bonsoir

A première vue....
Suppression des "select"
exemple:
If NeedHeader = False Then
'Rows(HeadRowNum).Select ***a supprimer
Rows(HeadRowNum).EntireRow.Hidden = True
NeedHeader = False
End If

--
Salutations
JJ

"Céline Brien" a écrit dans le message
de news:
Bonjour à tous,
Deuxième journée de soleil de suite. On n'a pas vu ça depuis des
semaines ! C'est doux...
Vous trouverez ci-après des codes pour supprimer les lignes d'un bon de
commande lorsque les quantités sont à zéro.
Le tout fonctionne très bien, mais pour 500 lignes l'opération prend 30
secondes.
Auriez-vous des codes magiques pour accélérer le tout ???
Merci de votre aide précieuse,
Céline

-----------------------------------------------------------------------
' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de
la section est aussi masqué.
'


' Macros créées par D. Daigle, le 11 août 2001
' Commentaires ajoutés par Céline Brien en juillet 2006

' La macro HideZeroOrderLines masque les lignes du bon de commande où
' la colonne contenant la somme des quantités contient un zéro.
' Lorsque toutes les lignes d'une section sont masquées, l'en-tête de
la section est aussi masqué.
'

Sub HideZeroOrderLines()

Dim RowNumber As Integer
Dim PrevRowNum As Integer
Dim CellValue As String
Dim ColNum As Integer
Dim SectionHead As String
Dim HeadRowNum As Integer
Dim NeedHeader As Boolean

ActiveSheet.Protect UserInterfaceOnly:=True
Application.ScreenUpdating = False

CellValue = ""
' À adapter à votre bon de commande. Indique le numéro de la ligne du
premier en-tête de section
RowNumber = 32

' À adapter à votre bon de commande. Indique le nombre de lignes à
vérifier.
' Le nombre peut être plus élevé que le nombre de lignes du bon de
commande.
Do Until RowNumber = 500
NeedHeader = False
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne contenant
' le mot à vérifier et indiquant que la ligne est un en-tête de
section.
SectionHead = ActiveSheet.Cells(RowNumber, 22).Value
' À adapter à votre bon de commande. Le mot entre guillemets est le mot
dont la présence
' indique que la ligne est un en-tête de section.
If SectionHead = "extension" Then
HeadRowNum = RowNumber
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
' Si la cellule est égale à zéro, la ligne est masquée.
' Sinon, la variable NeedHeader est égale à vrai et l'en-tête de la
section ne sera pas masqué.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Do While IsNumeric(CellValue)
If CellValue = "0" Then
Rows(RowNumber).Select
Selection.EntireRow.Hidden = True
Else
NeedHeader = True
End If
RowNumber = RowNumber + 1
' À adapter à votre bon de commande. Le chiffre indique le numéro de la
colonne
' contenant la somme des quantités.
CellValue = ActiveSheet.Cells(RowNumber, 22).Value
Loop
If NeedHeader = False Then
Rows(HeadRowNum).Select
Selection.EntireRow.Hidden = True
NeedHeader = False
End If
Else
RowNumber = RowNumber + 1
End If
Loop
ActiveSheet.Cells(1, 1).Select
Application.ScreenUpdating = True

'
End Sub
















Avatar
Céline Brien
Bonjour à tous,
Bonjour AV,
Merci pour ta réponse.
Je vais tester et je vous reviens.
Céline

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

Vous trouverez ci-après des codes pour supprimer les lignes d'un bon de
commande lorsque les quantités sont à zéro.
Le tout fonctionne très bien, mais pour 500 lignes l'opération prend 30
secondes.
Auriez-vous des codes magiques pour accélérer le tout ???


Une méthode :
Les grandes lignes :
* Insérer une colonne pour mémoriser l'ordre des données
* Trier la colonne quantité
* Filtrer sur <> 0
* Supprimer les lignes filtrées
* Re-trier sur la colonne ajoutée pour remettre en ordre, et la supprimer

Voilà ... C'est fini et ça a duré une fraction de seconde !

Pour avoir une idée des temps d'exécution comparés des différentes
méthodes, dont celles utilisant une boucle, regarde le fil du 16/11/2006
22:35

AV




Avatar
cousinhub
Bonsoir,
pour supprimer ou masquer les lignes :

sub essai()

For i = Cells(1, 1).CurrentRegion.Rows.Count To 1 Step -1
***ou Cells(1,3) si tes données sont dans la colonne C***
If Cells(i, 1).Value = "0" Then Cells(i, 1).EntireRow.Delete ' ou
If Cells(i, 1).Value = "0" Then Cells(i, 1).EntireRow.Hidden = True
Next

End Sub