Mise à jour de macro

Bonjour,

Je cherche à savoir si il y a moyen de mettre à jour automatiquement une macro ?

Malheureusement dans mes recherche je ne te tombe que sur des tuto "comment mettre une case/tableau à jour avec une macro"...

J'ai une macro qui remplace les valeur d'une colonne par 0 et supprime celle d'une autre sur plusieurs plages de cellules (disons A1 à B5 et A7 à B10).

Lorsque que je rajoute un ligne au milieu de ces sélections, ma macro ne change pas et je n'obtient donc pas les changements attendu, je dois modifier ma macro avec les nouvelles valeurs.

C'est un fichier en constante évolution donc il m'est compliqué de juste mettre à jour la macro à la fin de mon travail.

Voici le contenue actuel de ma macro (même si je ne pense pas que ça aidera à répondre à ma question).

Sub Reset()

Range( _

"A1:A5,A7:A10" _

).Select

Selection.Value = 0

Range( _

"B1:B5,B7:B10" _

).Select

Selection.ClearContents

End sub

Merci d'avance pour vos réponses !

Bonjour et bienvenue

Faute de fichier, je répondrai d'une façon générale.

Il est possible de remplacer

Range("A1:A5,A7:A10").Select
Selection.Value = 0

par

Range("A1:A5,A7:A" & i).Select
Selection.Value = 0

avec i une ligne, il s'agit d'une variable qui prendra la valeur calculée en scrutant ton fichier

par exemple

i=cells(rows.count,1).end(xlup).row

Merci de votre réponse !

Range("A1:A5,A7:A" & i).Select
Selection.Value = 0

avec i une ligne, il s'agit d'une variable qui prendra la valeur calculée en scrutant ton fichier

par exemple

i=cells(rows.count,1).end(xlup).row

Pourriez m'indiquer ce que signifie la dernière, ligne ? Quelle valeur va prendre i ?

Je n'ai pas précisé qu'entre ces plages il y a des sous totaux et que tout en bas il y a un total.

Je joins mon tableur. (très vide car j'ai enlevé ce qui était confidentiel et le format pour réduire sa taille)

7chiffrage.xlsm (110.77 Ko)

Je n'ai pas précisé qu'entre ces plages il y a des sous totaux et que tout en bas il y a un total.

Il eut fallu préciser ... cela change la donne.

La réponse "générique" reste valable : tu peux dans une Range("A2:Z99") remplacer 2 et 99 par des variables i et j comme je l'ai fait plus haut. Mais dans ton cas le calcul des i et des j est un peu complexe.

Il faut donc balayer toutes les lignes, repérer celles qui contiennent les sous-totaux, appliquer ton code aux autres lignes ...

Sub Reset()
    If MsgBox("Are you sure you want to reset the content of the sheet?", vbYesNo, "Reset confirmation") = vbYes Then
        For i = 9 To Cells(Rows.Count, "N").End(xlUp).Row
            If Range("N" & i) <> "" Then
                Range("O" & i).Value = 0
                Range("P" & i).ClearContents
            End If
        Next
    End If
End Sub

(je n'ai pas testé)

Bonjour,

La macro que tu m'as donné marche mais met 10 minutes à s'exécuter, pendant lesquels excel ne répond pas. Si je veux reprendre le contrôle je dois fermer l'excel avec un clique droit "fermer la fenêtre" dans le menu démarré, ce qui ne ferme pas le document mais arrête la macro, dans ce cas la macro n'est effectuée que partiellement.

Mon PC pro n'est pas très performant mais des macro plus simples comme celle que j'avais indiqué ne prenait que quelques secondes.

Je me doute que je ne peux pas tout avoir, une macro adaptée à mon cas et qui soit très rapide à exécuter ^^

Dans tous les cas merci pour la réponse.

Si tu as d'autres solution je suis ouvert.

Bonjour, salut Steelson,

Un ajout pour accélérer l’exécution de la macro :

Sub Reset()
    If MsgBox("Are you sure you want to reset the content of the sheet?", vbYesNo, "Reset confirmation") = vbYes Then
        Application.ScreenUpdating = False 'Désactive l'affichage
        Application.Calculation = xlCalculationManual 'Désactive le recalcul auto des formules à chaque modification
        For i = 9 To Cells(Rows.Count, "N").End(xlUp).Row
            If Range("N" & i) <> "" Then
                Range("O" & i).Value = 0
                Range("P" & i).ClearContents
            End If
        Next
        Application.Calculation = xlCalculationAutomatic
    End If
End Sub

On passe à 2 minutes, c'est bien mieux !

Merci à tous les 2, si vous avez d'autres astuces pour raccourcir le temps que prends la macro, je suis preneur !

Pourriez-vous m'expliquer ce que signifie la ligne :

For i = 9 To Cells(Rows.Count, "N").End(xlUp).Row

Je ne comprends pas exactement ce qu'il se passe à ce niveau.

On passe à 2 minutes, c'est bien mieux !

Merci à tous les 2, si vous avez d'autres astuces pour raccourcir le temps que prends la macro, je suis preneur !

Pourriez-vous m'expliquer ce que signifie la ligne :

For i = 9 To Cells(Rows.Count, "N").End(xlUp).Row

Je ne comprends pas exactement ce qu'il se passe à ce niveau.

For i = 1 to 1000 <-- boucle où l'on fait prendre à i la valeur 1, puis 2, 3, ... jusqu'à 1000 dans cet exemple

Cells(1, 1) <-- syntaxe pour définir une cellule en fonction de son numéro de ligne et de colonne (ici, ça correspond à A1), ou de la lettre de colonne (exemple : Cells(1, "A"))

Rows.Count <-- Compte le nombre total de ligne de la feuille, le résultat dépend de ta version d'Excel (1048576 après 2007)

CelluleDépart.End(xlUp) <-- pour se positionner pour la première cellule non vide à partir d'un point de départ, identique à CTRL + FLECHE HAUT pour un utilisateur

Cellule.Row <-- Renvoie l'indice de ligne de "cellule"

En clair, on se place dans la dernière cellule de la colonne N (N1048576), puis on cherche la première cellule non vide en remontant, dont on renvoie la position. Telle qu'elle est écrite, il s'agit de déterminer où doit s'arrêter la boucle.

La macro que tu m'as donné marche mais met 10 minutes à s'exécuter, pendant lesquels excel ne répond pas.

En effet, tu dois avoir des formules liées à ces données. Donc Pedro t'a donné la solution en passant en calcul manuel le temps que la macro s'exécute.

On peut aller plus vite : pour cela évite les sous-totaux et passe en tableau croisé dynamique.

Et dans ce cas, la solution globale que tu indiquais au départ fonctionnera elle aussi.

Merci pour les explications, elles étaient clair même pour un débutant comme moi.

Existerait-il d'autres moyen, moins gourmand en ressources, de faire ces actions ?

Du type sélectionner les valeur numérique ou tout sélectionner puis désélectionner les formule.

J'ai vu des choses du type IsNumeric, IsNumber, UsedRange.SpecialCells(xlCellTypeFormulas) mais je n'ai pas réussi à les utiliser (je débute en VBA).

J'ai testé par exemple :

Range("O18:O300,SpecialCells(xlCellTypeFormulas)").Select

En me basant sur la ligne suivante

Range("O18:O300,O19:O30").Select

Bien sur ça ne marche pas, mais vous voyez l'idée, sélectionner un plage plus large que mon tableau puis sélectionner une autre plage à l'intérieur de la 1ère qui donc déselectionne celle-ci, j'ai essayé de le faire avec une fonction de sélection des formules mais je ne maîtrise pas du tout l'outils VBA

Ou encore :

If IsNumeric(Range("O9:O22")) Then Range("O9:O22").Value = 1

Existerait-il d'autres moyen, moins gourmand en ressources, de faire ces actions ?

Oui surtout si ...

je ne maîtrise pas du tout l'outils VBA

il faut enlever toutes les formules intermédiaires, tous les sous-totaux et faire un TCD.

Je vais voir ce que je peux faire.

Malheureusement je ne suis qu'un stagiaire dont l'une des taches est d'améliorer les outils de chiffrage d'une gamme de produit, je ne peux pas décidé de changer le format de ces outils de chiffrages.

Si je ne peux pas faire cette modif et qu'il n'existe pas d'alternative, je resterai sur une macro à mettre à jour manuellement à chaque changement

Je pense qu'une alternative possible est d'utiliser une plage nommée et de modifier celle-ci à chaque changement plutôt que la macro.

Je travail encore sur le sujet, je mettrai mon sujet comme résolu dans quelques jours, après avoir trouvé (ou non) une autre solution

Merci beaucoup pour votre aide en tout cas !

Je n'ai pas trouvé d'autres solution me permettant d'adapter la macro (du type sélection des valeur numérique seulement ou désélection des formules). Et malheureusement les solutions proposées était trop complexe et longues à exécuter pour servir de solution dans mon cas.

Je préciserai donc pour les futur visiteurs que les solutions exposé peuvent mettre quelques minutes à s'exécuter mais sont très adapté à un tableau changeant constamment de taille.

Dans mon cas, on parlait de rajouter quelques lignes de temps à autre, pas de de modification énorme du nombre de lignes.

Ma solution a donc était de faire en sorte que mes totaux ne soient plus dans les colonnes à nettoyer et j'ai utilisé un macro nettoyant toute les colonnes.

Ex: Je devais nettoyer les colonnes O & P et mes sous totaux étaient des case fusionnés de O à R, j'ai donc laissé les totaux dans les cases fusionnés Q à R, c'est beaucoup moins esthétique (pas centré sur les 4 colonnes) mais plus simple.

Je nettoie donc de O9 (début des valeurs) à P300 (après la fin de mon tableau afin d’anticiper les futurs ajouts de lignes).

Pour les zéro qui apparaitrait dans des cellules vide j'ai simplement mis la même couleur en écriture et en fond.

Cela marchera donc pas si vous avez des cases à ne pas effacer !

Macro :

Sub reset ()

Range("o9:o300").Value = 0

Range("P9:P300").ClearContents

End Sub

Je vous inviter à mettre une check box pour ce genre de macro qui supprime du contenue (car un ctrl+Z n'y fera rien), par ex :

Sub 'nom de la macro

If MsgBox("Êtes-vous sur de vouloir remettre à zéro la feuille ?", vbYesNo, "Reset confirmation") = vbYes Then

'reste de la macro

End if

End Sub

Merci pour vos réponses, même si j'ai dû me résoudre à utiliser une solution plus simple, j'aurai appris des choses que la sélection dynamique et sur comment réduire le temps d'une macro.

Rechercher des sujets similaires à "mise jour macro"