Effacer cellules = "" (VBA)
Bonjour,
J'ai besoin d'aide.
J'aimerais sélectionner toutes les cellules dont la valeur est égale à "" en faisant la fonction clear.
J'explique le fond de mon problème :
J'ai 8 colonnes à analyser et allant sur 1000 lignes.
J'ai dans chacune de ces colonnes des formules que j'ai copier/coller en valeur.
Cependant même lorsque la cellule est vide, elle est tout de même considérée comme ayant une valeur.
Voici mon code :
Sheets("PIECES POUR ACHATS").Select
T1 = Range("I6").End(xlDown).Row + 1
Range(Cells(6, "H"), Cells(T1, "I")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
Range("BG6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Et donc dans mon cas, il va me copier jusqu'à la ligne 1001. Or ce n'est pas ce que je cherche.
Ce que je cherche à ajouter donc dans ma formule c'est que mon range soit de I6 à la cellule au-dessus de la première cellule dont la valeur est égale à "".
Par exemple si j'ai :
I6 : pomme
I7 : jus de fruits
I8 : orange
I9 :
I10 :
J'aimerais que ma sélection efface par une fonction clear toutes les cellules dont la valeur est égale à "" donc ici effacer toutes les cellules de I9 à I1000 et ensuite prendre en sélection mes cellules I6 à I8
J'ai essayé une fonction qui pouvait marcher mais qui durait une plombe vu qu'elle analyse cellule par cellule (un total de quasi 8 000 cellules analysées une à une) et qui était la suivante (si cela peut donner une piste) :
For each cell in selection
If cell <> "" Then Else Cell.clear
Next cell
Je remercie toute personne qui prendra le temps de m'aider.
Cordialement
Bonjour
Je ne comprends pas trop où se situe le problème
Dans ta page "PIECES POUR ACHATS" tu as des cellules avec des formules que tu copies dans la page "RECAPACHATS" en valeurs
Donc dans la page "RECAPACHATS" il n'y a plus de formule, donc les cellules qui n'avaient pas de résultat sont bien vides
En quoi cela gène de copier tout ton tableau ?
Tu as bien la place pour tout récupérer ?
Fournis un fichier dans lequel tu indiques le problème
Bonjour,
Merci d'avoir pris le temps de lire mon post.
Afin de mieux comprendre : la macro dans son intégralité :
Sub COPIERCOLLERPIECES()
Sheets("PIECES POUR ACHATS").Select
Range("B6").Select
Range("B6:C1000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("E6").Select
Range("E6:F1000").Select
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("H6").Select
Range("H6:I1000").Select
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveWindow.ScrollColumn = 7
Range("M6").Select
Range("M6:N1000").Select
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select
Sheets("PIECES POUR ACHATS").Select
x1 = Range("C1000").End(xlUp).Row
Range(Cells(6, "B"), Cells(x1, "C")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
ActiveWindow.SmallScroll Down:=-18
Range("BC6").Select
Range("BC6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("PIECES POUR ACHATS").Select
T = Range("F6").End(xlDown).Row + 1
Range(Cells(6, "E"), Cells(T, "F")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
Range("BE6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("PIECES POUR ACHATS").Select
T1 = Range("I6").End(xlDown).Row + 1
Range(Cells(6, "H"), Cells(T1, "I")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
Range("BG6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("PIECES POUR ACHATS").Select
T1 = Range("N6").End(xlDown).Row + 1
Range(Cells(6, "M"), Cells(T1, "N")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
Range("BI6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("PIECES POUR ACHATS").Select
Range("E6").Select
ActiveCell.FormulaR1C1 = _
"=(IF(RC1<>""TRAD"",IF(RC[-3]<>"""",RC[-3],""""),""""))"
Range("E6").Select
Selection.AutoFill Destination:=Range("E6:E75"), Type:=xlFillDefault
Range("E6:E75").Select
Range("E76").Select
ActiveCell.FormulaR1C1 = _
"=(IF(R[70]C1<>""TRAD"",IF(R[70]C[-3]<>"""",R[70]C[-3],""""),""""))"
Range("E76").Select
Selection.AutoFill Destination:=Range("E76:E1000")
Range("E76:E1000").Select
Range("E6").Select
Selection.AutoFill Destination:=Range("E6:F6"), Type:=xlFillDefault
Range("E6:F6").Select
Range("F6").Select
Selection.AutoFill Destination:=Range("F6:F75"), Type:=xlFillDefault
Range("F6:F75").Select
Range("E76").Select
Selection.AutoFill Destination:=Range("E76:F76"), Type:=xlFillDefault
Range("E76:F76").Select
Range("F76").Select
Selection.AutoFill Destination:=Range("F76:F1000")
Range("F76:F1000").Select
Range("H6").Select
ActiveCell.FormulaR1C1 = _
"=(IF(OR(R[70]C1=""TRAD"",R[70]C1=""CATEGORIEL""),IF(R[70]C[-6]<>"""",R[70]C[-6],""""),""""))"
Range("H6").Select
Selection.AutoFill Destination:=Range("H6:H1000")
Range("H6:H1000").Select
Range("H6").Select
Selection.AutoFill Destination:=Range("H6:I6"), Type:=xlFillDefault
Range("H6:I6").Select
Range("I6").Select
Selection.AutoFill Destination:=Range("I6:I1000")
Range("I6:I1000").Select
Range("M6").Select
ActiveCell.FormulaR1C1 = _
"=(IF(R[140]C1=""CATEGORIEL"",IF(R[140]C[-11]<>"""",R[140]C[-11],""""),""""))"
Range("M6").Select
Selection.AutoFill Destination:=Range("M6:M1000")
Range("M6:M1000").Select
Range("M6").Select
Selection.AutoFill Destination:=Range("M6:N6"), Type:=xlFillDefault
Range("M6:N6").Select
Range("N6").Select
Selection.AutoFill Destination:=Range("N6:N1000")
Range("N6:N1000").Select
Sheets("PIECES POUR ACHATS").Select
Cells(1, 1).Select
End Sub
En vert, il va bien jusqu'à la dernière ligne remplie (162) par contre en rouge, dû aux copies des formules plus haut, il va jusqu'à la valeur 1001.
Cordialement
Bonjour
Tu es en train de me noyer et je ne vais pas suivre longtemps
J'ai essayé ta macro mais elle plante
Plus aucun rapport avec ton 1er message
Que faut il faire ?
J'ai bien copié la page PIECES POUR ACHATS (2) dans la page PIECES POUR ACHATS
ensuite j'ai relancé la macro, mais je vois pas ce qui gène
Bonsoir,
Désolé pour le délai de réponse de ma part.
Ma macro est composée de 3 étapes :
la voici avec explications :
Sub COPIERCOLLERPIECES()
Sheets("PIECES POUR ACHATS").Select
Call PIECESVALEUR
Sheets("PIECES POUR ACHATS").Select
x1 = Range("C1000").End(xlUp).Row
Range(Cells(6, "B"), Cells(x1, "C")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
ActiveWindow.SmallScroll Down:=-18
Range("BC6").Select
Range("BC6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("PIECES POUR ACHATS").Select
T = Range("F6").End(xlDown).Row + 1
Range(Cells(6, "E"), Cells(T, "F")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
Range("BE6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("PIECES POUR ACHATS").Select
T1 = Range("I6").End(xlDown).Row + 1 ICI MON PROBLEME
Range(Cells(6, "H"), Cells(T1, "I")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
Range("BG6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("PIECES POUR ACHATS").Select
T1 = Range("N6").End(xlDown).Row + 1
Range(Cells(6, "M"), Cells(T1, "N")).Select
Selection.Copy
Sheets("RECAPACHATS").Select
Range("BI6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("PIECES POUR ACHATS").Select
Call CALCULPIECES
Sheets("PIECES POUR ACHATS").Select
Cells(1, 1).Select
End Sub
Dans ma première partie, j'enlève toutes mes formules afin de définir chaque cellule comme ayant une valeur.
Copier --> Coller valeurs (aux mêmes endroits) pour chaque colonne jusqu'à la ligne 1000
Ensuite, là où ça coince c'est que même les lignes où il n'y a aucune valeur sont considérées comme ayant une valeur.
Je cherche à copier UNIQUEMENT les valeurs différentes de "", donc copier toutes les cellules non vides.
Mon problème est que cela marche pour la première colonne mais pas pour les autres.
Je ne sais pas comment m'y prendre.
Pourquoi je fais ça ?
Dans le but de copier/coller uniquement des valeurs sur l'autre feuille et avec une liste qui utilisera toutes les cellules non vides.
Donc pour le moment quand je l'utilise (à moins de sélectionner toutes les cellules vides et d'appuyer sur la touche "Suppr"), le fichier me considère qu'il y a des valeurs.
Donc ma liste contient environ 150 lignes de noms + les environ 850 lignes vides.
Je cherche à enlever de ma liste les 850 lignes vides.
Et ma dernière étape de ma macro consiste à remettre les formules sur ma feuille de départ (si jamais).
Merci pour l'aide.
Cordialement
Bonjour,
Et avec le paramètre SkipBlanks :=True ça donne quoi ?
Sinon essaie de faire un fichier de travail réduit à l'essentiel pour reproduire le problème.
eric
Bonsoir
Remplace la macro actuelle par celle-ci
Plus besoin d'enlever les formules au début et les remettre à la fin
Sub COPIERCOLLERPIECES()
Dim WsS As Worksheet, WsD As Worksheet
Dim I As Integer
Set WsS = Sheets("PIECES POUR ACHATS")
Set WsD = Sheets("RECAPACHATS")
Application.ScreenUpdating = False
WsS.Range("B6:C1000").Copy
WsD.Range("BC6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
WsS.Range("E6:F1000").Copy
WsD.Range("BE6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
WsS.Range("H6:I1000").Copy
WsD.Range("BG6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
WsS.Range("M6:N1000").Copy
WsD.Range("BI6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
' Pour nettoyer les cellules vides
' Si un autre moyen partagez le
With WsD
.Rows(6).Insert
.Range("BC6:BJ6").Value = Array("A", "B", "C", "D", "E", "F", "G", "H")
For I = 55 To 61 Step 2
With .Cells(6, I).Resize(1001, 2)
.AutoFilter Field:=1, Criteria1:="="
.SpecialCells(xlCellTypeVisible).ClearContents
End With
Next I
.Rows(6).Delete
End With
End Sub
Bonjour,
Merci pour vos réponses.
J'ai essayé les deux solutions et mon problème est toujours présent.
Donc j'ai refait une trame complète avec l'essentiel de ce qu'il me faut.
J'ai modifié ma formule en m'inspirant de ce que tu m'as proposé :
Sub COPIERCOLLERPIECES()
Dim WsS As Worksheet, WsD As Worksheet
Dim I As Integer
Set WsS = Sheets("PIECES POUR ACHATS")
Set WsD = Sheets("RECAPACHATS")
Application.ScreenUpdating = False
WsS.Range("B6:C1000").Copy
WsD.Range("BC6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
WsS.Range("E6:F1000").Copy
WsD.Range("BE6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
WsS.Range("H6:I1000").Copy
WsD.Range("BG6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
WsS.Range("M6:N1000").Copy
WsD.Range("BI6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
Application.CutCopyMode = False
' Ce qui suit est la tentative de suppression des cellules vides
Sheets("RECAPACHATS").Select
Selection.AutoFilter
Sheets("RECAPACHATS").Select
Range("BC6:BJ1001").Select
Selection.AutoFilter
ActiveSheet.Range("$BC$6:$BJ$1001").AutoFilter Field:=1, Criteria1:="="
Cells(6, "BC").Resize(1001, 2).SpecialCells(xlCellTypeVisible).ClearContents
ActiveSheet.Range("$BC$6:$BJ$1001").AutoFilter Field:=2, Criteria1:="="
Cells(6, "BD").Resize(1001, 2).SpecialCells(xlCellTypeVisible).ClearContents
ActiveSheet.Range("$BC$6:$BJ$1001").AutoFilter Field:=3, Criteria1:="="
Cells(6, "BE").Resize(1001, 2).SpecialCells(xlCellTypeVisible).ClearContents
ActiveSheet.Range("$BC$6:$BJ$1001").AutoFilter Field:=4, Criteria1:="="
Cells(6, "BF").Resize(1001, 2).SpecialCells(xlCellTypeVisible).ClearContents
ActiveSheet.Range("$BC$6:$BJ$1001").AutoFilter Field:=5, Criteria1:="="
Cells(6, "BG").Resize(1001, 2).SpecialCells(xlCellTypeVisible).ClearContents
ActiveSheet.Range("$BC$6:$BJ$1001").AutoFilter Field:=6, Criteria1:="="
Cells(6, "BH").Resize(1001, 2).SpecialCells(xlCellTypeVisible).ClearContents
ActiveSheet.Range("$BC$6:$BJ$1001").AutoFilter Field:=7, Criteria1:="="
Cells(6, "BI").Resize(1001, 2).SpecialCells(xlCellTypeVisible).ClearContents
ActiveSheet.Range("$BC$6:$BJ$1001").AutoFilter Field:=8, Criteria1:="="
Cells(6, "BJ").Resize(1001, 2).SpecialCells(xlCellTypeVisible).ClearContents
Selection.AutoFilter
Range("C5:R9999").Select
Selection.AutoFilter
Application.ScreenUpdating = True
Donc j'ai mes listes de noms présentes de BC6 à BJ1000 et dans la ligne 5 de BD, BF, BH, BJ les noms de mes listes
En O1 j'ai ma liste avec les titres présents dans ces 4 cellules
Et a partir de F6 jusqu'à F9999 j'aimerais avoir la liste indirecte et décaler (pour éviter les vides).
Je m'explique en fonction de ma valeur présente en O1 (par exemple O1 égale la valeur BD5) alors présenter la liste BD5àBD1000 mais sans les cellules (non vides pour excel) mais qui sont égales à "" dans mes cellules F6àF9999
Ma liste marche mais comme je l'avais dit précédemment, j'ai l'ensemble des valeurs vides présentes dans ma liste
Voici mon problème.
Merci encore de m'aider, c'est très aimable.
Cordialement
Dédoublement de message.
Désolé
Bonjour
mynameisjeff a écrit :J'ai essayé les deux solutions et mon problème est toujours présent.
Ah si tu avais donné CE fichier au départ
A tester
Oui banzai,
Tu vois, le problème est que ma liste TRAD_LS marche très bien (donc sans les vides) mais si tu essaies de changer la valeur de O1 pour la valeur "CATEGORIEL" par exemple (ou LS ou TRAD) tu verras que dans ma liste d'une cellule de la colonne F (F6 à F9999), j'ai toujours mes propositions de noms dits vides (j'ai bien mes noms présents mais avec les éléments vides que je souhaiterais enlever).
Oui j'aurais dû faire parvenir la dernière version plus tôt, on aurait sûrement gagner du temps.
Merci pour ton aide.
Cordialement
Bonjour
Mais non cela fonctionne très bien
Une fois la macro exécutée
O1 : TRAD_LS ---> En F6 liste de AXAXA1 à CATEGORIEL AXAXA 17
O1 : CATEGORIEL ---> En F6 liste CATEGORIEL AXAXA 1 à CATEGORIEL AXAXA 17
Ou alors il y a quelque chose que je ne comprends pas
Oui banzai la liste fonctionne très bien, là n'est pas la problème.
Le problème est que je souhaite avoir ma liste de ma colonne F sans les choix vides (regarde en bas de la liste, tu verras des centaines de choix vides)
voir image ci-joint.
Ou alors, il faudrait tout simplement modifier la formule de la validation de données à savoir :
=DECALER(DECALER(INDIRECT($O$1);0;0;NBVAL(INDIRECT($O$1)));EQUIV(F6&"*";DECALER(INDIRECT($O$1);0;0;NBVAL(INDIRECT($O$1)));0)-1;0;NB.SI(DECALER(INDIRECT($O$1);0;0;NBVAL(INDIRECT($O$1)));F6&"*"))
Bonjour banzai,
Tu vois, je ne comprends pas comment cela se fait que chez toi cela fonctionne et non chez moi.
J'ai retéléchargé la version que tu as mis.
J'ai lancer la macro en cliquant sur le bouton "actualiser" dans la feuille pièces pour achats
Et quand je regarde sur ma feuille recapachats, j'ai mes noms vides.
En fait, on le voit clairement sur cette image, les cellules vides sont considérées comme "non vides" (indication tout en bas à droite).
Cependant, je dois avouer qu'en sélectionnant manuellement de la ligne vide jusqu'à la ligne 1000 et qu'en appuyant sur la touche "Suppr" ma liste ne contient en effet que ma liste de nom (telle que sur ton image).
Mais mon objectif était que ma macro me le fasse automatiquement.
Après, je ne sais pas si tu peux m'aider plus que ce que tu as déjà fait étant donné que cela fonctionne sur ta version excel.
Merci pour toute l'aide que tu m'as déjà apporté.
Cordialement
Bonjour
Pour essayer de comprendre (ce qui n'est pas sur)
mynameisjeff a écrit :J'ai lancer la macro en cliquant sur le bouton "actualiser" dans la feuille pièces pour achats
Ce bouton (du moins dans la version que j'ai) pointe vers une macro ... d'un autre classeur
'H:\Trame rendements JUIN 3.xlsm'!COPIERCOLLERPIECES
Fais le pointer vers la macro du classeur actuel et vérifie