Amélioration code, amélioration codeur

Bonjour à tous et merci de me lire,

J'ai un code sur un fichier, que je vous joins ici. Ce n'est que du code dans un module, mon code fonctionne mais j'aimerai avec un peu d'aide améliorer l'écriture du code et par conséquent m'améliorer dans l'écriture de celui ci.

Pouvez vous me dire ce qu'il est possible de supprimer, upgrader. Mon but est que le code soit moins long a se lancer.

Merci pour vos retours et votre aide.

21classeur1.xlsm (18.91 Ko)

Mika

Bonjour

Comme on n'a pas votre vrai fichier, c'est moins simple

Faites un test sur cette première macro

Sub Tableau()
'Fonction ajouter une page type tableau à la suite de l'analyse de risques
Dim derniereligne As Integer

'Mettre la feuille des modèles visible
Sheets("Modèles").Visible = True

'Copier les lignes correspondant au tableau type de l'analyse de risques
With Sheets("Analyse de risques")
    'Rechercher la denière ligne non vide
    derniereligne = .Cells(.Rows.Count, 1).End(xlUp).Row + 3
    'Coller valeur
    Sheets("Modèles").Rows("31:45").Copy .Rows(derniereligne)
    'Mise a jour pagination
    .Range("AB" & Ligne + 1).FormulaR1C1 = "=NumPage() & "" sur "" & Totpage()"
End With
'Remettre en masquer la feuille modèles
Sheets("Modèles").Visible = False
End Sub

Pour la variable ligne, je ne vois pas comment vous la récupérez. A moins que je n'aie pas tout le code, je pense qu'il devrait y avoir un bug sur cette macro.

Aussi une chose, comme je le dis souvent, évitez les accents et espaces dans le nom des feuilles et onglets

Cordialement

Bonjour et merci

Cela fonctionne et effectivement dans le code il y avait un problème il manquait une partie de code

'recherche de la ligne ou est placé le bouton pour calculé la ou doit être inséré le tableau<br>Ligne = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row<br>y = (Int(Ligne / 30))

Peux tu m'expliquer pour que je puisse dupliquer cette façon de faire ? Bien cordialement, Mika

Peux tu m'expliquer pour que je puisse dupliquer cette façon de faire ? Bien cordialement, Mika

Expliquer par rapport à ces deux lignes ?

Ligne = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row
y = (Int(Ligne / 30))

Si oui, Activesheet correspond à la feuille analyse de risque ?

Non concernant les deux lignes c'est Ok pour moi

Mais sur la façon que tu as regroupé tout dans la macro comment as tu procédé ?

A quoi correspond la boucle ? (je ne la connais pas du tout)

C'est pour que je puisse modifier le reste de mes macros et comme cela simplifier mon code

Merci

A quoi correspond la boucle ? (je ne la connais pas du tout)

Il n'y a pas de boucle dans le code. C'est juste que j'évite les sélect ou activate qui ne servent en général à rien si ce n'est à faire des opérations qui ralentissent l'exécution du code. D'où ma question au sujet de Activesheet dans mon post précédent.

Non concernant les deux lignes c'est Ok pour moi

Ce serait bien de voir le fichier (sans données confidentielles) parce que repérer une ligne sur base d'un bouton situé sur une feuille ?? C'est un peu comme si on cherchait la hauteur où est situé un post-it sur un frigo. Si le post-it bouge... Donc au risque de me répéter, lesobjets sur les feuilles... c'est à éviter tant que l'on peut le faire.

OK

je joins ici un fichier pour que cela soit peut etre plus simple

7essai.xlsm (166.62 Ko)

effectivement je comprend ce que tu me dis mais j'essaie de trouver des solutions que je connais pour que mon code fonctionne comme je le souhaite. J'évite de demandé de l'aide constamment

Il manque les deux lignes de codes Ligne et Y non ?

Si oui, ma question précédente est restée sans réponse... Activesheet = quelle feuille ?

Pardon je ne suis pas doué :(

ces lignes ne sont pas dans la première macros c'était une erreur d'écriture le code est comme ceci :

Sub Tableau()

'Fonction ajouter une page type tableau à la suite de l'analyse de risques
Dim derniereligne As Integer

'Mettre la feuille des modèles visible
Sheets("Modèles").Visible = True

'Copier les lignes correspondant au tableau type de l'analyse de risques

With Sheets("Analyse de risques")
    'Rechercher la denière ligne non vide
    derniereligne = .Cells(.Rows.Count, 1).End(xlUp).Row + 3
    'Coller valeur
    Sheets("Modèles").Rows("31:45").Copy .Rows(derniereligne)
    'Mise a jour pagination
    .Range("AB" & derniereligne + 1).FormulaR1C1 = "=NumPage() & "" sur "" & Totpage()"
End With
'Remettre en masquer la feuille modèles
Sheets("Modèles").Visible = False

End Sub

il n'y a donc pas ces lignes de code

par contre activesheet correspond à la page ou se trouve le bouton qui sera activé; soit analyse de risque soit protocole

ces lignes ne sont pas dans la première macros c'était une erreur d'écriture le code est comme ceci :

Ok. Si l'on exécute le code via le bouton Tableau, la dernière ligne est située à la ligne 100, alors que cela devrait être la ligne 104.

Cela pédale pas mal lorsque l'on exécute le code...

oui cela pédale pas mal c'est pour cela que je cherche a optimiser ce que j'ai fais pour que cela soit plus fluide

je suis désolé je cherche a m'améliorer mais ce n'est pas simple ... Je pars de loin.

Pour ma part quand je lance le code via le bouton il me détecte bien la ligne 104 (si je l'ai remplie préalablement)

Pour ma part quand je lance le code via le bouton il me détecte bien la ligne 104 (si je l'ai remplie préalablement)

Ok si vous avez complété. Donc vous n'utilisez jamais la macro Tableau si les lignes ne sont pas toutes complétées. Donc ici de la ligne 99 à 104
ensuite si vous appliquez le code Tableau, cela supprime le bouton Saut de page ?

Ce qui fait ramer ce sont les codes Function. Quel était le but premier de ces codes ?

Effectivement tant que le tableau n'est pas complété on n'appuie pas sur le bouton pour ajouter un nouveau tableau

Les fonctions sont la pour mettre un système de pagination je les ai mis dans le code pour qu'il s'actualise (cela ne se fessait pas tant que ce n'était dans le code)

le but est d'avoir sur chaque page

numéro de page sur nombre total de page

Dans le fichier, je vois que les lignes 39 à 60 sont vides. Est-ce normal ?

Si oui, je comprends que les lignes 1 à 60 ne changent pas et que l'on ajoute toujours le même tableau et cela uniquement à partir de la ligne 62

Ce qui veut dire que le document de base contient au minimum 3 pages. Juste ?

effectivement à l'instant T elle ne sont pas remplies mais peuvent l'être

on ajout le même tableau qu'après la ligne 76 et c'est a partir de 62 que l'on a un tableau

cependant il est possible que cette dernière évolue car il est possible d'ajouter 30 ligne après la ligne 30 et après la ligne 61

donc avec ce système tout peux bouger tout le temps

oui cela veut qu'au mini il y a 3 pages

Je tente de vous trouver une solution sans la macro Function car il faut comprendre qu'excel exécute ce code à chaque fois que vous modifiez quelque chose dans la feuille.

Mais plus simple, pourquoi ne mettez vous pas votre pagination dans le pied de page ou l'en tete de page. De là cela se fait automatiquement.

Okay je comprend mieux la latence lors d'une modification dans une page. Je ne connaissais pas les functions avant.

Le mettre en entête ou pied de page cela est gênant dans le sens que la mise en page n'est pas modifiable ...

Elle se fait automatiquement en fonction du nombre de feuilles. Là vous êtes toujours sûr d'être juste

Sinon on doit passer à une autre méthode mais c'est plus complexe et le risque d'erreur existe. Ou alors il faut comprendre comment vous fonctionnez avec la feuille analyse. Là je suppose que vous repartez d'une feuille vierge de données suivant une nouvelle analyse. Dites moi

en gros je prépare une trame sous excel (elle est sous word avec un tas de tableau d'ou ma volonté de passer sous excel)

Je n'ai pas le choix la pagination doit se trouver comme l'exemple fournit

Re

Faites un test à faire après avoir effectué les modifications suivantes:

1. Désactiver les deux Sub FUNCTION dans le module 1
2. Remplacez la sub Tableau par celle ci-dessous

Sub Tableau()
'Fonction ajouter une page type tableau à la suite de l'analyse de risques
Dim derniereligne As Integer

'Mettre la feuille des modèles visible
Sheets("Modèles").Visible = True
'Copier les lignes correspondant au tableau type de l'analyse de risques
With Sheets("Analyse de risques")
    'Rechercher la denière ligne non vide
    derniereligne = .Cells(.Rows.Count, 1).End(xlUp).Row ' + 3
    'Controle si la dernière ligne ne contient pas le mot Risque
    If .Range("A" & derniereligne) = "Risque" Then Exit Sub
    'Coller valeur
    Sheets("Modèles").Rows("31:45").Copy .Rows(derniereligne + 3)
    'mise en page pour impression
    .PageSetup.PrintArea = "$A$1:$AD$" & derniereligne + 15
    'Mise a jour pagination
    Call Numeroterpage
End With
'Remettre en masquer la feuille modèles
Sheets("Modèles").Visible = False
End Sub

3. Ajouter la macro ci-dessous dans un module

Sub Numeroterpage()
Dim WS As Worksheet
Dim VC As Integer, HC As Integer
Dim Totpage As Byte

Set WS = Sheets("Analyse de risques")
HC = WS.HPageBreaks.Count + 1
VC = WS.VPageBreaks.Count + 1
Totpage = HC * VC

Dim prem As String
Dim cel As Range
Dim i As Byte

With WS.Cells
Set cel = .Find("Pagination", LookIn:=xlValues, lookat:=xlPart)
    If Not cel Is Nothing Then
    prem = cel.Address
    i = 1
        Do
        WS.Range("AB" & cel.Row) = i & " sur " & Totpage
        i = i + 1
        Set cel = .FindNext(cel)
        Loop While Not cel Is Nothing And prem <> cel.Address
    End If
End With
End Sub

J'ai considéré que vous ne cliquez sur le bouton tableau que si la dernière ligne en colonne A (Risque) est complétée. Ligne 104 dans votre fichier posté

Crdlt

Rechercher des sujets similaires à "amelioration code codeur"