Effacer les formules des cellules dont la valeur est nulle

Bonjour,

Je cherche un moyen d'effacer des formules (RechecheV) des cellules dont la formule ne retourne aucune valeur.

Dans mon exemple, je souhaiterais effacer les formules de la ligne A16 à A52 avec un code VBA qui s'adapterait naturellement aux nombres d'articles sur le devis .

image

J'ai essayé différentes méthodes pour trouver la première ligne vide d'une colonne mais elles me renvoient toujours la ligne 53 du tableau.

Il y a effectivement une formule dans toutes les cellules jusqu'en A52...

Sub Effacer
'Effacer les formules RechechV des cellules sans article

'Méthode qui renvoie 53 
Ligne = Sheets("Devis").Range("A12").End(xlDown).Row + 1
MsgBox Ligne

'Méthode qui renvoie une erreur sur ClearContents
'Dim Cellule As Range
'    For Each Cellule In ActiveSheet.Range("A121:A52")
'        If Cellule Is Nothing Or Cellule.Value = "" Then
'            Cellule.ClearContents xlUp
'        End If
'    Next Cellule

Ligne = Sheets("Devis").Range("A12").End(xlDown).Row + 1
MsgBox Ligne

End Sub

Merci d'avance à tous pour vos idées lumineuses.

Bonjour

En général ou utilise une formule de type SI(Code="";"";RECHERCHEV(...))

BIdouiller par VBA va apporter plus de problème que de solutions notamment si tu as oublié un article et que tu veux l'ajouter

En plus tu as l'air d'utiliser un tableau structuré dont la règle est 1 colonne = 1 formule unique et tu risques de mettre le souk

Bonsoir,

je rejoins 78chris : c'est apparemment un tableau structuré sous Excel, donc il suffit de créer une formule sur la première cellule de donnée d'une colonne pour que celle-ci se répète sur toute la colonne. Une autre fonctionnalité est que le tableau s'agrandi automatiquement à l'ajout de nouvelles données sur la première ligne vide sous celui-ci, donc pas besoin de le dimensionner "par avance" qui fait que vous vous retrouvez avec des lignes vides qui vous posent problème.

Et lorsque l'on fait une recherche de dernière ligne utilisée sur un tableau structuré rempli de vide, on atterri sur la première ligne se trouvant en dessous si cette dernière est vide ce qui explique le "53".

Solution au vu de la photo et sans le fichier :

Sélectionnez les cellules de la ligne 16 à 52, puis clic droit, puis supprimer, puis ligne du tableau. Le tableau est raccourcie au juste besoin.
faites un test en inscrivant une donnée dans l'une des cellule du dessous, cette ligne est automatiquement intégrée au tableau avec recopie des formules, mise en formes etc...

@ bientôt

LouReeD

21devis-clients.xlsm (14.31 Ko)

Bonjour et merci de prendre du temps pour étudier mon problème.

Je suis novice en VBA, et je me suis lancé dans la construction d'un fichier pour établir des devis.

Jusque là, tout va bien. Dans la colonne A, je sélectionne un article dans une liste déroulante. Avec une formule RechecheV je vais chercher les informations de l'article dans un autre onglet.

Exemple en B12

=SIERREUR(RECHERCHEV($A12;Sources!$G$4:$K$9999;2;FAUX);"")

Je construit le devis ligne après ligne.

Quand tout est OK, je sauvegarde toutes les lignes dans un autre fichier (Devis_clients.xlsm) pour pouvoir le retrouver si je veux modifier ce devis. La macro fonctionne (Enregistrement_historique).

C'est là que tout se complique pour moi quand je veux rappeler un Devis sauvegardé (macro : Modif_Devis).

Pour aller chercher les informations stockées j'utilise des formules RechecheV que j'intégre en VBA dans toutes les cellules de A12 à A52

Exemple en A12

=SIERREUR(RECHERCHEV($B$2&"_"&K12;[Devis_Clients.xlsm]Détail_Devis!A:R;9;FAUX);"")

En mettant cette formule de A12 à A52 cela me permet de rappeler tous les articles du devis à modifier.

Je peux modifier les articles, en ajouter d'autres pas de problème.

En revanche, quand je veux sauvegarder les lignes de ce devis modifié, la macro (Enregistrement_historique) que j'utilisais pour sauvegarder les lignes lors de la création d'un devis vierge tourne en boucle et me rajoute les articles dans le devis et le fichier de sauvegarde jusqu'à la dernière ligne du tableau.

Avec mon niveau de débutant, la seule différence que j'ai vu, c'est que la formule ajoutée dans la colonne A pour retrouver les articles sauvegardés était responsable de cette boucle. D'où mon désir de vider ces formules de la colonne A pour qu'il n'y ait plus de boucle.

Je suis contient que cette solution est du bidouillage...

LouReed, je ne suis pas parvenu à ajouter une ligne dans le tableau après avoir raccourci le tableau au juste besoin. Les données entrées dans une cellule du dessous ne s'intègrent pas dans le tableau...

Ci-joint les fichiers avec les macros utilisées. Ce sera plus facile pour comprendre mon mode de penser quelque peu compliqué!!

Merci encore

Bonjour

J'ai modifié tes 2 classeurs (dont les noms ne correspondent pas à ce qu'il y a dans le code...)

devis-clients ne contenant pas de code est en xlsx.
Les 2 historiques sont sous forme de tableaux structurés nommés Devis_Histo et Devis_Detail ce qui :

  • évite la mise en forme puisque chaque ligne hérite de celle des précédentes
  • simplifie le code

saisie-de-devis-2021-2.xlsm : j'ai

  • nommé le tableau Devis,
  • modifié les formules comme on te l'avais proposé mais en tenant compte des tableaux structurés,
  • mis toutes les tables de références sous forme de tableaux structurés correctement nommés et adapté en conséquence les validations
  • recodé Nouveau_Devis()
  • recodé en grande partie Enregistrement_historique() (pas la partie pdf)

Il te reste à t'inspirer de cette logique pour corrigé tes autres codes, notamment Modif_Devis()

13devis-clients.xlsx (16.30 Ko)

Merci pour le temps passé à apporter les corrections à mes macros.

Quand je lis ton code, j'avoue ne pas tout comprendre mais c'est bien plus structuré que ce que j'avais pu écrire!!!

Dans Enregistrement_historique() j'ai une erreur d'exécution 91

  Dim WSais As Workbook, WHisto As Workbook, WSD As Worksheet, NL As Integer

    Set WSais = ThisWorkbook

'Ouverture classeur Devis_Clients

    WHisto = Application.Workbooks.Open("S:\Devis_Clients.xlsx")

Je ne vois pas pourquoi ça bloque, le chemin du fichier est bon...

J'ai essayé de m'inspirer de ton code pour modifier Modif_Devis() et insérer une formule du type SI(Code="";"";RECHERCHEV(...)) en A12 pour éviter le problème de boucle lors de l'enregistrement des lignes dans Detail_Devis.xlsx

=SI($A12="";"";RECHERCHEV($B$2&"_"&K12;[devis_clients.xlsx]Détail_Devis!A:R;9;FAUX))

me renvoie l'erreur

image

J'a essayé de passer par une table qui va pointer dans le classeur Devis_clients.xlsx

image
=SI($A12="";"";RECHERCHEV($B$2&"_"&K12;Rappel_Devis;9;FAUX))

Même problème

Je tourne moi aussi en boucle et ne parviens pas à trouver la bonne syntaxe pour rappeler mes articles sauvegardés, modifier le devis et le réenregistrer...

11devis-clients.xlsx (17.91 Ko)

RE

Comme je le disais tes noms de fichiers ne correspondent pas mais j'ai laissé en l'état. Si tu utilises les fichiers que j'ai joints il faut adapter les lignes qui s'y réfèrent

Attention on utlise des tableaux structurés. Le code comme les formules doivent s'y référer, pas de

devis_clients.xlsx]Détail_Devis!A:R

Tu n'as pas tiré parti du code : comme

Set WHisto = Application.Workbooks.Open("S:\Devis_Clients.xlsx")

WSais.Sheets("Devis").Activate

la suppression de tous les select inutiles et ralentissant le fonctionnement

l'utilisation des databodyrange des tableaux structurés et non des plages dont on ne connait pas la taille...

Quand tu dis que le nom de fichier ne correspond pas tu veux dire que dans

WHisto = Application.Workbooks.Open("S:\Devis_Clients.xlsx")

le nom du fichier Devis_Clients.xlsx ne correspond pas au nom du fichier qui est : devis_clients.xlsx ?

Pour la formule, si je comprends bien, ce qui bloque c'est la référence de la matrice qui est sur le fichier externe?

=SI($A12="";"";RECHERCHEV($B$2&"_"&K12;Rappel_Devis;9;FAUX))

J'ai essayé d'appeler le tableau structuré que tu as nommé Devis_Detail mais ça ne change rien...

Quelle est la syntaxe?

Rechercher des sujets similaires à "effacer formules valeur nulle"