XL 2016 Macro pour automatiser le nettoyage d'un fichier

  • Initiateur de la discussion Initiateur de la discussion kevint13
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

kevint13

XLDnaute Nouveau
Bonjour tout le monde,
Je sollicite votre aide pour établir une macro qui va changer ma vie !

Voici en détail mon besoin :

Pour chaque colonne du tableau :
- Vérifier que chaque cellule de la colonne ne contient pas de texte. S'il y a du texte (peu importe le texte) remplacer la valeur par la moyenne de la colonne en question :
1570024639374.png

Une fois la première colonne vérifiée, passer à la colonne suivante et répéter l'opération pour vérifier toutes les colonnes une par une.

Spécificités :
1) J'ai toujours une colonne avec des dates (généralement c'est la première), cette colonne ne doit pas être traitée ou ne doit pas changer.
2) Il m'arrive d'avoir plusieurs niveaux (ligne) de titre, il faudrait peut-être pouvoir indiquer à la macro à quel N° de ligne commencer ? :

1570024922594.png


J'espère avoir été assez explicite sur la problématique, merci encore pour votre aide !
 
Bonsoir le fil


Le grand nombre de réponses dans ton fil, prouve que tu as effectivement été explicite 😉

Blague en part, peut-être qu'en joignant un fichier exemple (allégé et anonymisé), on y verrait plus clair et ce serait plus facile pour nous de t'aider, non ?



Merci pour ton retour, en effet avec un exemple c'est plus parlant !
Dans le fichier joint il y a des textes (le texte peut varier du coup il faudrait idéalement qu'il remplace le texte peut importe ce qui est écrit dans la cellule) qui faudrait remplacer par la moyenne de la colonne en question sans toucher au texte en rouge (c'est les titres) ni à la première colonne (c'est la date)

Merci encore pour ton aide !
 

Pièces jointes

Re

Pas sur d'avoir tout compris
Je te laisse tester
VB:
Sub test()
Dim LG&
LG = Cells(Rows.Count, 1).End(3).Row
On Error Resume Next
Rows("5:" & LG).SpecialCells(xlCellTypeConstants, 2).Value = 0
Cells(LG + 1, 2).Resize(, 42).FormulaR1C1 = "=AVERAGE(R[-95]C:R[-1]C)"
End Sub
 
Re

Pas sur d'avoir tout compris
Je te laisse tester
VB:
Sub test()
Dim LG&
LG = Cells(Rows.Count, 1).End(3).Row
On Error Resume Next
Rows("5:" & LG).SpecialCells(xlCellTypeConstants, 2).Value = 0
Cells(LG + 1, 2).Resize(, 42).FormulaR1C1 = "=AVERAGE(R[-95]C:R[-1]C)"
End Sub


C'est un excellent début !

Ce qui a bien marché :
- Ne pas impacter la première colonne et les tires
- Remplacer toutes les valeurs textes

Ce qui n'a pas marché :
- remplacer les textes par la moyenne de la colonne en question (actuellement remplacé par 0)

Est ce qu'il faudrait pas faire le remplacement des valeurs colonne par colonne en partant de la 2ème jusqu'à la fin ?
Merci pour ton aide !
 
Bonjour le fil

kevint13
Si j'étais moi, je me convaincrais de te suggérer de mettre dans un fichier exemple, deux onglets
AVANT et APRES
On a déjà l'onglet AVANT
Et sur l'onglet APRES, on pourrait voir en ce dimanche matin pluvieux, le résultat (sur une colonne ou deux par exemple) que tu aurais réalisé manuellement.

Ce qui permettrai d'y voir plus clair 😉
 
Re

Et cette fois-ci, aprés un excellent début, est-ce une excellente fin ? 😉
VB:
Sub test_II()
Dim LG&, CL&, i&, PlG As Range
LG = Cells(Rows.Count, 1).End(3).Row
CL = Cells(5, 2).End(xlToRight).Column
On Error Resume Next
For i = 2 To CL
Set PlG = Cells(5, i).Resize(LG - 4)
PlG.SpecialCells(2, 2).Value = Application.Average(PlG)
Set PlG = Nothing
Next
End Sub
 
Re

Je penses qu'il est d'abord l'heure de l'apéro
Ensuite, je suis pour inciter le demandeur à mettre les mains dans le cambouis pour solutionner sa question.
Normalement avec les bouts de code que j'ai posté dans le fil (et avec l'aide de la touche F1 dans VBE, et du net)
tu devrais être en mesure de faire ce MsgBox 😉
Yercʼh mad !
(ou "à la tienne" pour les gens de France 😉)
 
Oui mais j'ai planté la macro .... je pense avoir fait une connerie ... :

Sub nettoyer_fichier()
Dim LG&, CL&, i&, PlG As Range
Dim Titre As Double
Titre = InputBox("Combien de ligne de titre : ", "Ligne de titre")
LG = Cells(Rows.Count, 1).End(Titre - 1).Row
CL = Cells(Titre + 1, 2).End(xlToRight).Column
On Error Resume Next
For i = 2 To CL
Set PlG = Cells(Titre + 1, i).Resize(LG - Titre)
PlG.SpecialCells(2, 2).Value = Application.Average(PlG)
Set PlG = Nothing
Next
End Sub
 
Re

Alors, pour te récompenser d'avoir mouillé le maillot et puisque mon verre est vide (et que j'ai plus de cahuètes)
😉
VB:
Sub liminal()
Dim i&, Ligne&
For i = 1 To 10
If IsDate(Cells(i, 1)) Then
Ligne = Cells(i, 1).Row
Exit For
End If
Next i
msgbox "Nombre de ligne de titre: " & Ligne - 1, vbInformation, "Fini l'apéro"
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
6
Affichages
534
Réponses
4
Affichages
243
  • Question Question
Microsoft 365 Complétude fichier
Réponses
8
Affichages
688
Retour