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é

J'ai oublié le fichier joint.

Le voici :

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&"*"))

image pour forum

Bonjour

Moi aussi j'ai une image

liste deroulante

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

image pour forum 2

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

Rechercher des sujets similaires à "effacer vba"