Modification de 3 classeurs
mir.kan
Messages postés
178
Date d'inscription
Statut
Membre
Dernière intervention
-
mir.kan Messages postés 178 Date d'inscription Statut Membre Dernière intervention -
mir.kan Messages postés 178 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un petit problème qui me tracasse depuis une semaine... n'étant pas énormément doué en VBA (et autres langages ), je fais appel à toute âme charitable ici présente...
Mon besoin : J'ai un classeur Excel (de plusieurs feuilles) et . On ajoute et modifie régulièrement des lignes à la première feuille du premier classeur qui contient 23 colonnes. Parmi ces 23 colonnes on a une colonne qui contient que les noms de domaines (RH,SM,SU) qui sont en effet séparés dans des classeurs différents et fermés.ET j'aimerais en cas de modification de mon domaine dans la feuille 1 de mon 1er classeur que ça modifie automatique le domaine dans les autres classeurs fermés en l'occurrence le classeur concerné par la modification.
exemple si le domaine était SM avant modification , et si il a été changé en RH j'aimerais qu'on l supprime sur SM et on le transfère sur RH
voici mon code mais ca m'affiche toujours une erreur
J'ai un petit problème qui me tracasse depuis une semaine... n'étant pas énormément doué en VBA (et autres langages ), je fais appel à toute âme charitable ici présente...
Mon besoin : J'ai un classeur Excel (de plusieurs feuilles) et . On ajoute et modifie régulièrement des lignes à la première feuille du premier classeur qui contient 23 colonnes. Parmi ces 23 colonnes on a une colonne qui contient que les noms de domaines (RH,SM,SU) qui sont en effet séparés dans des classeurs différents et fermés.ET j'aimerais en cas de modification de mon domaine dans la feuille 1 de mon 1er classeur que ça modifie automatique le domaine dans les autres classeurs fermés en l'occurrence le classeur concerné par la modification.
exemple si le domaine était SM avant modification , et si il a été changé en RH j'aimerais qu'on l supprime sur SM et on le transfère sur RH
voici mon code mais ca m'affiche toujours une erreur
Private Sub ModifierPlanDansBDD_Bouton_Click() If (Me.ReferencePlan_Champ = "" _ Or Me.SitePlan_Liste = "" _ Or Me.Entreprise_Liste = "" _ Or Me.DomainePlan_Liste = "" _ Or Me.DateDemandePlan_Champ = "") Then 'Message d'erreur de saisie MsgBox _ "Au moins l'un des champs suivants n'est pas rempli :" & vbCrLf & vbCrLf & _ "- Référence" & vbCrLf & _ "- Site " & vbCrLf & _ "- Entreprise " & vbCrLf & _ "- Domaine" & vbCrLf & _ "- Date de la demande de création/renouvellement", _ vbOKOnly + vbExclamation, _ "Champs critiques incomplets" Else 'Déclaration de la variable Confirmation de type VbMsgBoxResult 'Cette variable représente la réponse de l'utilisateur à la confirmation d'ajout de données Dim Confirmation As VbMsgBoxResult 'Demande de confirmation de la modification des informations et affectation de la valeur de la réponse à la variable Confirmation Confirmation = MsgBox( _ "Confirmez-vous la modification des informations saisies dans le formulaire dans la base de données ?", _ vbYesNo + vbQuestion, _ "Confirmation d'ajout des informations") End If 'Ajout des données si confirmation If (Confirmation = vbYes) Then Dim EtatAttenteDocuments As String If (Me.EnAttenteDocumentsOui_Option = True) Then EtatAttenteDocuments = "Oui" ElseIf (Me.EnAttenteDocumentsNon_Option = True) Then EtatAttenteDocuments = "Non" End If Dim EtatAttenteDateRDV As String 'Affectation de la valeur de l'état à la variable EtatAttenteDateRDV If (Me.EnAttenteDateRDVOui_Option = True) Then EtatAttenteDateRDV = "Oui" ElseIf (Me.EnAttenteDateRDVNon_Option = True) Then EtatAttenteDateRDV = "Non" End If 'Déclaration de la variable EtatARenouveler de type String 'Cette variable représente l'état au sujet du renouvellement du Plan Dim EtatARenouveler As String 'Affectation de la valeur de l'état à la variable EtatARenouveler If (Me.ARenouvelerOui_Option = True) Then EtatARenouveler = "Oui" ElseIf (Me.ARenouvelerNon_Option = True) Then EtatARenouveler = "Non" End If 'Déclaration de la variable EtatSigne de type String 'Cette variable représente l'état au sujet de la signature du Plan Dim EtatSigne As String 'Affectation de la valeur de l'état à la variable EtatSigne If (Me.PlanSigneOui_Option = True) Then EtatSigne = "Oui" ElseIf (Me.PlanSigneNon_Option = True) Then EtatSigne = "Non" End If 'Déclaration de la variable EtatArchive de type String Dim EtatArchive As String 'Affectation de la valeur de l'état à la variable EtatArchive If (Me.PlanArchiveOui_Option = True) Then EtatArchive = "Oui" ElseIf (Me.PlanArchiveNon_Option = True) Then EtatArchive = "Non" End If 'Déclaration de la variable VisiteSignatureConfondues de type String Dim VisiteSignatureConfondues As String 'Affectation de la valeur de l'état à la variable VisiteSignatureConfondues If (Me.VisiteSignatureConfonduesOui_Option = True) Then VisiteSignatureConfondues = "Oui" ElseIf (Me.VisiteSignatureConfonduesNon_Option = True) Then VisiteSignatureConfondues = "Non" End If 'Déclaration de la variable ReferenceAvantModification de type String 'Cette variable représente la valeur de la référence du Plan avant la modification Dim ReferenceAvantModification As String 'Affectation de la valeur de la référence avant la modification ReferenceAvantModification = ActiveCell 'Déclaration de la variable SiteAvantModification de type String Dim SiteAvantModification As String 'Affectation de la valeur du site avant la modification SiteAvantModification = ActiveCell.Offset(0, 1) Dim EntrepriseAvantModification As String 'Affectation de la valeur du nom de l'Entreprise avant la modification EntrepriseAvantModification = ActiveCell.Offset(0, 2) 'Déclaration de la variable DomaineAvantModification de type String 'Cette variable représente la valeur du domaine avant la modification Dim DomaineAvantModification As String 'Affectation de la valeur du domaine avant la modification DomaineAvantModification = ActiveCell.Offset(0, 3) 'Sélection de la feuille "Plans " LesPlans.Activate 'Déclaration de la variable LigneModifiee de Type Long 'Cette variable représente le numéro de la ligne de modification où l'on modifiera les données Dim LigneModifiee As Long 'Affectation du numéro de la ligne de modification à la variable LigneModifiee LigneModifiee = 10 + Me.PlanModifier_Liste.ListIndex If (Cells(LigneModifiee, 1) <> ReferenceAvantModification _ Or Cells(LigneModifiee, 2) <> SiteAvantModification _ Or Cells(LigneModifiee, 3) <> EntrepriseAvantModification _ Or Cells(LigneModifiee, 4) <> DomaineAvantModification) Then MsgBox "La sélection présente une erreur, aucune modification n'est faite par précaution de préservation des données.", _ vbOKOnly + vbInformation, _ "Modification annulée" Else With LesPlans .Cells(LigneModifiee, 1) = Me.ReferencePlanChamp If (Me.EmplacementPlan_Champ <> "") Then .Hyperlinks.Add .Cells(LigneModifiee, 1), Me.EmplacementPlan_Champ End If .Cells(LigneModifiee, 2) = Me.SitePlan_Liste .Cells(LigneModifiee, 3) = Me.Entreprise_Liste .Cells(LigneModifiee, 4) = Me.DomainePlan_Liste .Cells(LigneModifiee, 5) = Me.DateDebutPlan_Champ .Cells(LigneModifiee, 6) = Me.DateFinPlan_Champ .Cells(LigneModifiee, 7) = Me.LocauxConcernesPlan_Champ .Cells(LigneModifiee, 8) = Me.DescriptifInterventionPlan_Champ .Cells(LigneModifiee, 9) = Me.PremierContactEntreprise_Champ .Cells(LigneModifiee, 10) = Me.NumeroTelephonePremierContact_Champ .Cells(LigneModifiee, 11) = Me.NumeroPortablePremierContactEntreprise_Champ .Cells(LigneModifiee, 12) = Me.CourrielPremierContactEntreprise_Champ .Cells(LigneModifiee, 13) = Me.SecondContactEntreprise_Champ .Cells(LigneModifiee, 14) = Me.NumeroTelephoneSecondContactEntreprise_Champ .Cells(LigneModifiee, 15) = Me.NumeroPortableSecondChargeAffaires_Champ .Cells(LigneModifiee, 16) = Me.CourrielSecondContactEntreprise_Champ .Cells(LigneModifiee, 17) = Me.InformationsUtilesEntreprise_Champ .Cells(LigneModifiee, 18) = Me.ResponsableSite_Champ .Cells(LigneModifiee, 19) = Me.NumeroInterneResponsableSite_Champ .Cells(LigneModifiee, 20) = Me.NumeroPortableResponsableSiteChamp .Cells(LigneModifiee, 21) = Me.CourrielResponsableSite_Champ .Cells(LigneModifiee, 22) = Me.RepresentantSite_Champ End With 'Sélection de la nouvelle ligne ajoutée LesPlans.Cells(LigneModifiee, 1).EntireRow.Select 'Copie de la ligne sélectionnée Selection.Copy 'Déclaration de la variable Adressecréationdomaine de type String 'Cette variable représente l'adresse du fichier Excel des Plans en création par domaine dans l'arborescence Dim AdresseCréationDomaine As String 'Affectation de l'adresse de base à la variable AdresseCréationDomaine 'On affecte donc le chemin de l'emplacement du fichier puis on ajoute le domaine choisi pour le nom du fichier auquel on ajoute ensuite l'extension AdresseFichierEnCreationDomaine = "mi/desktop" & Me.DomainePlan_Liste & ".xlsm" 'Déclaration de la variable ClasseurEnCreationDomaine de type Workbook 'Cette variable représente le classeur dans lequel on va inscrire les données Dim ClasseurEnCreationDomaine As Workbook 'Affectation du bon classeur selon son domaine à la variable ClasseurEnCreationDomaine Set ClasseurEnCreationDomaine = Application.Workbooks.Open(AdresseCréationDomaine) 'Sélection du classeur ouvert ClasseurEnCreationDomaine.Activate 'Sélection de la feuille "Plans " du classeur ouvert ClasseurEnCreationDomaine.Sheets("Plans ").Activate 'Déclaration de la variable LigneCopieePlan de Type Long 'Cette variable représente le numéro de la ligne copiée où l'on copiera les données Dim LigneCopieePlan As Long 'Affectation du numéro de la ligne de début de données à la variable LigneCopieePlan LigneCopieePlan = 4 'Déclaration de la variable LigneFinDonneesDomaine de Type Long 'Cette variable représente le numéro de la ligne où finit le contenu des données du classeur des Plans en création par domaine Dim LigneFinDonneesDomaine As Long 'Affectation du numéro de la ligne où finit le contenu des données à la variable LigneDebutDonnees LigneFinDonneesDomaine = ClasseurEnCreationDomaine.Sheets("Plans ").[A1048576].End(xlUp).Row 'Recherche de la ligne correspondant au plan à modifier dans la feuille "Plans " du classeur par domaine While ((Cells(LigneCopieePlan, 1) <> ReferenceAvantModification _ Or Cells(LigneCopieePlan, 2) <> SiteAvantModification _ Or Cells(LigneCopieePlan, 3) <> EntrepriseAvantModification _ Or Cells(LigneCopieePlan, 4) <> DomaineAvantModification) _ And LigneCopieePlan <= LigneFinDonneesDomaine) LigneCopieePlan = LigneCopieePlan + 1 Wend 'Vérification que l'on a bien trouvé la correspondance dans la feuille "Plans If (LigneCopieePlan > LigneFinDonneesDomaine) Then MsgBox "Correspondance non trouvée dans la feuille [Plans] du classeur [Plans de Prévention " & DomaineAvantModification & "]" & vbCrLf & vbCrLf & _ "La modification ne s'est donc pas effectuée dans le fichier correspondant au domaine.", _ vbExclamation + vbOKOnly, _ "Pas de correspondance dans la feuille [Plans] du classeur [Plans " & DomaineAvantModification & "]" Else 'Sélection de la cellule correspondant à la référence du Plan de Prévention à dupliquer 'ClasseurEnCreationDomaine.Sheets("Plans ").Cells(LigneCopieePlan, 1).Select ActiveSheet("Plans ").Cells(LigneCopieePlan, 1).Select 'Collage des données sur la ligne Selection.PasteSpecial 'Fermeture du classeur Excel ClasseurEnCreationDomaine.Close (True) 'Sélection de la feuille "Suivis de visite et signature" LesSuivisVisiteSignature.Activate 'Affectation du numéro de la ligne de début des données à la variable LigneModifiee LigneModifiee = 10 'Déclaration de la variable LigneFinDonnees de Type Long 'Cette variable représente le numéro de la ligne où finit le contenu des données Dim LigneFinDonnees As Long 'Affectation du numéro de la ligne où finit le contenu des données à la variable LigneFinDonnees LigneFinDonnees = LesSuivisVisiteSignature.[A1048576].End(xlUp).Row While ((Cells(LigneModifiee, 1) <> ReferenceAvantModification _ Or Cells(LigneModifiee, 2) <> SiteAvantModification _ Or Cells(LigneModifiee, 3) <> EntrepriseAvantModification _ Or Cells(LigneModifiee, 4) <> DomaineAvantModification) _ And LigneModifiee <= LigneFinDonnees) LigneModifiee = LigneModifiee + 1 Wend 'Vérification que l'on a bien trouvé la correspondance dans la feuille "Suivis de visite et signature" If (LigneModifiee > LigneFinDonnees) Then MsgBox "Correspondance non trouvée dans la feuille [Suivis de visite et signature] du classeur [Gestion des Plans & vbCrLf & vbCrLf & _ "La modification ne s'est donc pas effectuée sur cette feuille.", _ vbExclamation + vbOKOnly, _ "Pas de correspondance dans la feuille [Suivis de visite et signature] du classeur [Gestion des Plans]" Else With LesSuivisVisiteSignature .Cells(LigneModifiee, 1) = Me.ReferencePlan_Champ If (Me.EmplacementPlan_Champ <> "") Then .Hyperlinks.Add .Cells(LigneModifiee, 1), Me.EmplacementPlanPrevention_Champ End If .Cells(LigneModifiee, 2) = Me.SitePlan_Liste .Cells(LigneModifiee, 3) = Me.Entreprise_Liste .Cells(LigneModifiee, 4) = Me.DomainePlan_Liste .Cells(LigneModifiee, 5) = EtatAttenteDocuments .Cells(LigneModifiee, 6) = EtatAttenteDateRDV .Cells(LigneModifiee, 7) = EtatARenouveler .Cells(LigneModifiee, 8) = EtatSigne .Cells(LigneModifiee, 9) = EtatArchive .Cells(LigneModifiee, 10) = Me.CommentaireEtatPlan_Champ .Cells(LigneModifiee, 11) = VisiteSignatureConfondues .Cells(LigneModifiee, 12) = Me.ContactEntreprisevisite_Champ .Cells(LigneModifiee, 13) = Me.ResponsableSiteVisite_Champ .Cells(LigneModifiee, 14) = Me.ChargeAffairesVisite_Champ .Cells(LigneModifiee, 15) = Me.DatePrevueVisiteSite_Champ .Cells(LigneModifiee, 16) = Me.AdresseVisiteSite_Champ .Cells(LigneModifiee, 17) = Me.CommentaireGestionVisiteSite_Champ .Cells(LigneModifiee, 18) = Me.ContactEntrepriseExterieureSignature_Champ .Cells(LigneModifiee, 19) = Me.ResponsableSiteSignature_Champ .Cells(LigneModifiee, 20) = Me.ChargeAffairesSignature_Champ .Cells(LigneModifiee, 21) = Me.DatePrevueSignature_Champ .Cells(LigneModifiee, 22) = Me.AdresseSignature_Champ .Cells(LigneModifiee, 23) = Me.CommentaireGestionSignature_Champ End With 'Sélection de la ligne modifiée LesSuivisVisiteSignature.Cells(LigneModifiee, 1).EntireRow.Select 'Copie de la ligne sélectionnée Selection.Copy 'Affectation du bon classeur selon son domaine à la variable ClasseurEnCreationDomaine Set ClasseurEnCreationDomaine = Application.Workbooks.Open(AdresseCréationDomaine) 'Sélection du classeur ouvert ClasseurEnCreationDomaine.Activate 'Sélection de la feuille "Suivis de visite et signature" du classeur ouvert ClasseurEnCreationDomaine.Sheets("Suivis de visite et signature").Activate 'Affectation du numéro de la ligne de début de données à la variable LigneCopieePlan LigneCopieePlan = 4 'Affectation du numéro de la ligne où finit le contenu des données à la variable LigneFinDonneesDomaine LigneFinDonneesDomaine = ClasseurEnCreationDomaine.Sheets("Suivis de visite et signature").[A1048576].End(xlUp).Row While ((Cells(LigneCopieePlan, 1) <> ReferenceAvantModification _ Or Cells(LigneCopieePlan, 2) <> SiteAvantModification _ Or Cells(LigneCopieePlan, 3) <> EntrepriseAvantModification _ Or Cells(LigneCopieePlan, 4) <> DomaineAvantModification) _ And LigneCopieePlan <= LigneFinDonneesDomaine) LigneCopieePlan = LigneCopieePlan + 1 Wend 'Vérification que l'on a bien trouvé la correspondance dans la feuille "Suivis de visite et signature" If (LigneCopieePlan > LigneFinDonneesDomaine) Then MsgBox "Correspondance non trouvée dans la feuille [Suivis de visite et signature] du classeur [Plans de Prévention " & DomaineAvantModification & "]" & vbCrLf & vbCrLf & _ "La modification ne s'est donc pas effectuée dans le fichier correspondant au domaine.", _ vbExclamation + vbOKOnly, _ "Pas de correspondance dans la feuille [Suivis de visite et signature] du classeur [Plans de Prévention " & DomaineAvantModification & "]" Else 'Sélection de la cellule correspondant à la référence du Plan à modifier ClasseurEnCreationDomaine.Sheets("Suivis de visite et signature").Cells(LigneCopieePlan, 1).Select 'Collage des données sur la ligne Selection.PasteSpecial 'Fermeture du classeur Excel ClasseurEnCreationDomaine.Close (True) End If End If End If End If 'Sélection de la feuille "Suivis de visite et signature" LesSuivisVisiteSignature.Activate [A10:ZZ1048576].Sort [A10] 'Sélection de la feuille "Plans de Prévention" LesPlansPrevention.Activate [A10:ZZ1048576].Sort [A10] Unload Me End If End Sub
A voir également:
- Modification de 3 classeurs
- Suivi de modification word - Guide
- Ai suite 3 - Télécharger - Optimisation
- Logiciel gratuit modification pdf - Guide
- Picasa 3 - Télécharger - Albums photo
- Photorecit 3 - Télécharger - Visionnage & Diaporama
1 réponse
Bonjour,
Lorsque tu mets du code, il faut utiliser les balises Code !!!
Voir : https://www.commentcamarche.net/infos/25911-ccm-astuces-et-conseils-pour-la-redaction/#code
Mais il est inutile de mettre un code aussi long : personne ne l'exploitera
Il est préférable de cibler le problème et de mettre un code simplifié qui y correspond ou de joindre le fichier via https://www.cjoint.com/
Rappel : Un code qui se base sur l'utilisation de la cellule active est une très grande source de dysfonctionnements !
L'emploi de Select, ActiveCell, Selection, ... est à bannir, il est préférable d'utiliser une référence à un objet déclaré qu'il soit actif ou non.
Lorsque tu mets du code, il faut utiliser les balises Code !!!
Voir : https://www.commentcamarche.net/infos/25911-ccm-astuces-et-conseils-pour-la-redaction/#code
Mais il est inutile de mettre un code aussi long : personne ne l'exploitera
Il est préférable de cibler le problème et de mettre un code simplifié qui y correspond ou de joindre le fichier via https://www.cjoint.com/
Rappel : Un code qui se base sur l'utilisation de la cellule active est une très grande source de dysfonctionnements !
L'emploi de Select, ActiveCell, Selection, ... est à bannir, il est préférable d'utiliser une référence à un objet déclaré qu'il soit actif ou non.
With ClasseurEnCreationDomaine.Sheets("Plans ")