Macro plusieurs feuille

Bonjour le forum

Je viens vers vous pour trouver un peu d'aide

Voila j'ai plusieurs feuille (un dizaine) qui on les 5 premières colonnes identique, sur chaque feuille il y a un bouton qui appel un UF afin de remplir les colonnes C, D, E j'ai bien trouvé un code qui fonctionne pour une feuille mais j'aimerai avoir un code pour toutes les feuilles.

J'ai tenté ce code,

Private Sub CommandButton1_Click()
 Dim Ligne As Long 

  'On Error Resume Next
With ActiveSheet        '("Visite médicale")
  Ligne = .Range("C" & Rows.Count).End(xlUp).Row + 1
   .Range("C" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
   .Range("D" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 1)
   .Range("E" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 2)
End With
  Me.Hide
End Sub

Cela fonctionne mais est très long dans sa procédure, je sent bien que quelque chose ne va pas, je vois pas quoi.

si quelqu'un pouvait m'éclaircir le souci ça serai sympa.

Merci par avance

Cdlt

Bonjour

mais j'aimerai avoir un code pour toutes les feuilles.

Il faut compléter sur toutes les feuilles du fichier ou il y a des feuilles à éviter ?

Crdlt

Bonjour,

Bonjour Dan,

Pour le principe, en attendant le complément d'informations demandé par Dan.

Cdlt.

Option Explicit

Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim Ligne As Long

    Application.ScreenUpdating = False

    For Each ws In ActiveWorkbook.Worksheets
        With ws
            Ligne = .Range("C" & Rows.Count).End(xlUp).Row + 1
            .Range("C" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
            .Range("D" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 1)
            .Range("E" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 2)
        End With
    Next ws

    Me.Hide

End Sub

Bonjour Dan

il y a des feuille à éviter mais cela ne devrai pas géner car la macro va sur un bouton que je met en place ou pas sur les feuilles de mon choix.

Cdlt

Bonjour Jean-Eric, Re Dan

Jean-Eric, merci de ta proposition que je viens de tester mais en lisant ta macro je me suis rendu compte que j'ai du mal m'expliquer précédemment car je vois que tu fais une boucle sur toutes les feuilles.

Mon idée est d'avoir un seul UF afin de pourvoir compléter certaines feuilles individuellement dans les colonnes C, D, E.

exemple :

1) j'ouvre feuille 2, click sur bouton afficher UF, sélectionne un nom dans la liste, Valide et l'info s'enregistre seulement dans feuille2.

2) j'ouvre feuille 5, click sur bouton afficher UF, sélectionne un nom dans la liste, Valide et l'info s'enregistre seulement dans feuille5.

Toutes mes excuses

Cdlt

Bonjour,

Oui ! Tu t'expliques mal et tu ne mets pas de fichier, et tu fournis un code qui n'est pas concerné !

Ton problème consiste simplement à appeler le même Userform à partir de chaque feuille concernée : tu mets donc sur chaque feuille un bouton (de formulaire), et tu affectes à tous tes boutons la même macro (une ligne pour ouvrir le Userform).

Cordialement

Bonjour MFerrand

Ca sert à rien de s'énerver comme ça !! mais qu'est ce vous avez sur ce forum à s'énerver pour un rien c'est le changement de temps qui fais ça !!

Désolé si j'essai d'apprend.

Ce dont tu m'explique, c'est déjà fais !! la macro sur chaque bouton et mon code concerne bien l'aide que je veux.

Sur un UserForm il y a un ListBox (à 3 colonnes) qui est déjà alimenté que j'ouvre avec mes boutons sur 5 feuilles différentes (pour le moment)

une fois sur une feuille de mon choix (ex Visite médicale) je click sur le bouton pour ouvrir le formulaire avec la ListBox alimenté , Sélectionne une ligne de la ListBox, Click sur un bouton Valider.

pour une feuille j'ai fais ce code qui marche.

Private Sub CommandButton1_Click()
 Dim Ligne As Long

With Sheets ("Visite médicale")
  Ligne = .Range("C" & Rows.Count).End(xlUp).Row + 1
   .Range("C" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
   .Range("D" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 1)
   .Range("E" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 2)
End With
  Me.Hide
End Sub

Ce que je demande (Si c'est possible) est de savoir si on peux améliorer ce code afin de m'en servir sur les autres feuilles ou il y a un bouton pour ce UserForm et que l'enregistrement se fasse seulement sur la feuille activé.

c'est à dire exemple :

1) j'ouvre feuille 2, click sur bouton afficher UF (déjà en place), sélectionne un nom dans la liste (déjà en place), Valide et l'info s'enregistre seulement dans feuille2.

2) Idem pour les 5 autres feuilles (pour le moment).

Toutes mes excuses, toutes mes excuses et toutes mes excuses.

Merci par avance.

Cdlt

Tu fournis au départ un code qui servait la feuille active. Rien ne l'empêche de fonctionner sur la feuille active lorsque celle-ci change.

S'il y a problème, cela vient d'ailleurs. Et difficile de voir sans fichier !

Reconnais qu'il n'est guère plaisant de travailler dans le vide...

Cordialement, toujours !

Re MFerrand

Chacun ses méthodes mais je comprend tout à fais.

Repartons sur de bonne base !!!

j'aimerai me servir du UserForm1 dans plusieurs feuilles individuellement. J'ai bien essayé le code avec <ActiveSheet> mais les cellules se remplisse une à une et très lentement, Pourquoi ?

Je mets un modèle de mon fichier en PJ.

Cdlt toujours aussi.

21classeur1.xlsm (32.63 Ko)

Fonctionne parfaitement ! Aucune lenteur.

Tu devrais juste ajouter avant Me.Hide

Me.ListBox1.ListIndex = -1

pour désélectionner la ligne du ListBox précédemment inscrite.

Cordialement

ben !! je ne comprend pas alors de mon côté toujours la lenteur présente !!

Dans mes tableaux il y a des MFC avec formule, ça ne serai pas ça qui provoquerai cette lenteur ??

Je voulais éviter, mais je me lance je joint le fichier original, j'ai peu être fais une connerie ailleurs.

fichier original en PJ

Merci

Cdlt

Re,

En effet, la première affectation se fait bien mais les suivantes paraissent temporisées.

J'ai fait divers essais, dont affectation à partir de la feuille d'origine : la temporisation double entre la première et les 2 suivantes !

Je ne saurais te dire à quoi c'est dû.

Cordialement

[si j'ai une idée, je reviens]

Re

ça me rassure que tu confirme qu'il y ai un souci !!

bien pris pour [si j'ai une idée, je reviens], merci.

de mon côté je vais essayer de chercher également d'où viens le hic.

Dans l'attente bonne nuit.

Cdlt

Bonjour

Une piste à suivre ?

Des formules, lesquelles that is the question ?

Accélère l'inscription des données mais temps de latence lors du retour en automatique

Private Sub CommandButton1_Click()
 Dim Ligne As Long
  Application.Calculation = xlCalculationManual

With ActiveSheet
  Ligne = .Range("C" & Rows.Count).End(xlUp).Row + 1
   .Range("C" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
   .Range("D" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 1)
   .Range("E" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 2)
End With
 ActiveSheet.Cells(Rows.Count, "F").End(xlUp)(1).Select
  Application.Calculation = xlCalculationAutomatic

Unload Me
End Sub

Re

Désolé pour le retard. Le ralentissement vient du calcul dans la colonne B Alerte de chaque feuille

A vérifier mais ce serait peut être intéressant de passer par VBA

Sinon solution identique à celle proposée par Banzai mais avec deux modifications

Private Sub CommandButton1_Click()
 Dim Ligne As Long
Application.Calculation = xlCalculationManual
With ActiveSheet
  Ligne = .Range("C" & .Rows.Count).End(xlUp).Row + 1
   .Range("C" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
   .Range("D" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 1)
   .Range("E" & Ligne) = Me.ListBox1.List(Me.ListBox1.ListIndex, 2)
   .Range("F" & Ligne).Select
End With
Unload Me
Application.Calculation = xlCalculationAutomatic
End Sub

Cordialement

Bonjour Banzai et Dan

Vos propositions sont très intéressante, je viens de les tester, cela fonctionne beaucoup mieux qu'avant mais reste toujours une légère lenteur en fin de procédure pour la fermeture du formulaire. (cela me permet déjà de pouvoir avancer dans d'autres améliorations dans mon projet).

Dan tu dis

A vérifier mais ce serait peut être intéressant de passer par VBA

J'y ai bien pensé !! je trouve le principe de tableau automatique facile d'utilisation puisqu'il recopie automatiquement la ligne du dessus mais c'est vrai on arrive très vite à ces limites une fois qu'on n'y intègre des formules.

Pour être franc, les macros avec calcul n'est pas très mon fort donc suis parti au plus simple.

Je veux bien tenter de supprimer les formules en colonne B et passer en VBA si cela améliore et donne plaisir à l'utilisation à ce programme (qui est le but).

La !! j'aurai vraiment besoin d'une grande aide.

Merci à vous, je compte vraiment sur vous sur ce coup.

Cdlt.

Re

j'ai testé le fichier en supprimant les formules en colonne B et la ça à l'aire de fonctionner correctement, Dan tu as raison le VBA est recommandé.

Cdlt

Bonjour

personne pour m'aiguiller sur un modèle de macro afin de remplacer les formules en colonne B.

ça serai sympa de votre part.

Merci d'avance.

Cdlt

Bonsoir,

Il suffit de faire le calcul que faisait la formule... (mais quelque chose me chiffonne dans ta formule, c'est qu'elle aboutit à 0 lorsque la cellule en K n'est pas servie... Est-ce voulu ?)

Par ailleurs la mise à jour de la colonne B devrait intervenir lorsqu'on sert la colonne K ou L. Ce qui plaide pour une évènementielle.

Comme cela concerne nombre de feuilles, la procédure devrait donc aller dans ThisWorkbook.

Cordialement

Bonjour MFerrand

Merci d'avoir pris de ton temps pour mon post.

Concernant le 0 en cellule K n'est pas voulu, c'est juste que je suis arrivé à faire cette formule comme ça.

désolé je ne vois pas ce que veux dire pour la mise à jour de la colonne B.

Pour l'évènementielle, la je plane complétement en cela fais 2 jours que j'essai des choses et à la force je m'y emmêle les pinceaux, je ne sait plus en j'en suis. .

il va falloir que je reprenne tout de zéro. grrrrrrrrr.

il se fait tard les yeux ce ferme je vais quitter et te souhaiter bonne continuation à toi et vive la réunion .

à bientôt

Cdlt

Rechercher des sujets similaires à "macro feuille"