Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel
Excel Forum d'entraide sur Excel. Vos questions sur les fonctions, formules, manipulations, et tout sujet qui ne trouve pas sa place dans un sous-forum.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/09/2011, 12h33   #1
Membre du Club
 
Homme ilies
comptable
Inscription : octobre 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme ilies

Informations professionnelles :
Activité : comptable
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : octobre 2010
Messages : 109
Points : 40
Points : 40
Par défaut supprimer les valeurs zéro

Bonjour
J’ai une plage (A1:BA3000) qui contienne que des nombres.
J’ai essayé de supprimer les valeurs zéro avec le code suivant

Code :
1
2
3
Range("A1:ba3000").AutoFilter Field:=3, Criteria1:="0,00"
Range("c2:c3000").SpecialCells(xlCellTypeVisible).ClearContents
Range("A1:ba3000").AutoFilter Field:=3
Mon problème ce que je doit répéter ce code 53 fois et je change que le N° de Field (de 3 au 53) et la range ("c2:c3000") au range ("ba2:ba3000")
Question
SVP comment faire pour réduire ces 53 codes pour supprimer les valeurs zéro
iliesss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 13h39   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 894
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 894
Points : 7 178
Points : 7 178
Bonjour,

Si je comprend bien, tu veux mettre a blanc les cellules qui sont à 0 sur la plage A1 à BA3000

Code :
1
2
3
4
5
6
7
8
9
10
Sub sup()
Dim rg As Range
 
For Each rg In Range("A1:BA3000")
 
    If rg.Value = 0 Then rg.Value = ""
 
Next rg
 
End Sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 15h26   #3
Membre du Club
 
Homme ilies
comptable
Inscription : octobre 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme ilies

Informations professionnelles :
Activité : comptable
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : octobre 2010
Messages : 109
Points : 40
Points : 40
Par défaut bonjour

salut
merci pour ton code mais il est lent lorsque la plage est grande
j'ai posté le mémé problème dans un autre forum et Mr ERIC ma envoyé ce code il est rapide
Code :
1
2
3
4
5
6
7
8
9
10
11
12
Sub suppZero()
    Dim f As Long
    Application.ScreenUpdating = False
    For f = 3 To 53
        Range("A1:ba3000").AutoFilter Field:=f, Criteria1:="0,00"
        On Error Resume Next
        [C2].Offset(0, f - 3).Resize(2999, 1).SpecialCells(xlCellTypeVisible).ClearContents
        On Error GoTo 0
        Range("A1:ba3000").AutoFilter
    Next f
    Application.ScreenUpdating = False
End Sub
merci pour toi et merci pour Mr Eric
et si quelqu'un a une meilleure réponse la discussion est ouverte
iliesss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 16h17   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 894
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 894
Points : 7 178
Points : 7 178
Le code proposé te donne une méthode.

Si tu souhaites optimiser la vitesse il te faudra aussi neutraliser les calculs et l'affichage
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Sub sup()
Dim rg As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual 
 
For Each rg In Range("A1:BA3000")
 
    If rg.Value = 0 Then rg.Value = ""
 
Next rg
 
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 16h40   #5
Membre du Club
 
Homme ilies
comptable
Inscription : octobre 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme ilies

Informations professionnelles :
Activité : comptable
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : octobre 2010
Messages : 109
Points : 40
Points : 40
Par défaut salut

merci mon ami
mais mon code proposé est toujours rapide que ton nouveau code
iliesss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 23h14   #6
Membre habitué
 
Avatar de issoram
 
Homme Zeco
Développeur informatique
Inscription : janvier 2009
Messages : 219
Détails du profil
Informations personnelles :
Nom : Homme Zeco
Localisation : France, Saône et Loire (Bourgogne)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2009
Messages : 219
Points : 121
Points : 121
Envoyer un message via MSN à issoram
Bonjour,

C'est surtout le fait de travailler range par range (boucle For Each) qui ralentit le code.
Le gain d'efficacité est de l'ordre d'un facteur 20 en travaillant plutôt sur des tableaux.
Je cite cet excellent tutoriel sur la manipulation de tableaux en VBA:
Citation:
Sur les grandes collections, il convient d'éviter l'énumération qui est très lente.
Du coup le code de Jfontaine adapté:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Dim Tab As Variant, 
Dim i As Long, j As Long
 
Tab = Range("A1:BA3000").Value
 
For i = LBound(Tab, 1) To UBound(Tab, 1)
    For j = LBound(Tab, 2) To UBound(Tab, 2)
        IIf (Tab(i, j) = 0, "", Tab(i, j) )
    Next i
Next j
 
Range("A1:BA3000").Value = Tab
 
Application.ScreenUpdating = True  ' plus vraiment utile ici étant donné que l'affectation
'se fait d'un coup sur la plage entière. Mais ça ne coûte rien de le laisser.
Application.Calculation = xlCalculationAutomatic  ' idem
Cordialement.
issoram est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h11.


 
 
 
 
Partenaires

Hébergement Web