mir.kan
Messages postés178Date d'inscriptionmardi 6 septembre 2016StatutMembreDernière intervention26 avril 2018
-
Modifié par crapoulou le 22/09/2016 à 16:31
mir.kan
Messages postés178Date d'inscriptionmardi 6 septembre 2016StatutMembreDernière intervention26 avril 2018
-
23 sept. 2016 à 16:53
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
PrivateSubModifierPlanDansBDD_Bouton_Click()If(Me.ReferencePlan_Champ ="" _
OrMe.SitePlan_Liste ="" _
OrMe.Entreprise_Liste ="" _
OrMe.DomainePlan_Liste ="" _
OrMe.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éesDim 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")EndIf'Ajout des données si confirmationIf(Confirmation = vbYes)ThenDim EtatAttenteDocuments AsStringIf(Me.EnAttenteDocumentsOui_Option =True)Then
EtatAttenteDocuments ="Oui"ElseIf(Me.EnAttenteDocumentsNon_Option =True)Then
EtatAttenteDocuments ="Non"EndIfDim EtatAttenteDateRDV AsString'Affectation de la valeur de l'état à la variable EtatAttenteDateRDVIf(Me.EnAttenteDateRDVOui_Option =True)Then
EtatAttenteDateRDV ="Oui"ElseIf(Me.EnAttenteDateRDVNon_Option =True)Then
EtatAttenteDateRDV ="Non"EndIf'Déclaration de la variable EtatARenouveler de type String'Cette variable représente l'état au sujet du renouvellement du Plan Dim EtatARenouveler AsString'Affectation de la valeur de l'état à la variable EtatARenouvelerIf(Me.ARenouvelerOui_Option =True)Then
EtatARenouveler ="Oui"ElseIf(Me.ARenouvelerNon_Option =True)Then
EtatARenouveler ="Non"EndIf'Déclaration de la variable EtatSigne de type String'Cette variable représente l'état au sujet de la signature du Plan Dim EtatSigne AsString'Affectation de la valeur de l'état à la variable EtatSigneIf(Me.PlanSigneOui_Option =True)Then
EtatSigne ="Oui"ElseIf(Me.PlanSigneNon_Option =True)Then
EtatSigne ="Non"EndIf'Déclaration de la variable EtatArchive de type StringDim EtatArchive AsString'Affectation de la valeur de l'état à la variable EtatArchiveIf(Me.PlanArchiveOui_Option =True)Then
EtatArchive ="Oui"ElseIf(Me.PlanArchiveNon_Option =True)Then
EtatArchive ="Non"EndIf'Déclaration de la variable VisiteSignatureConfondues de type StringDim VisiteSignatureConfondues AsString'Affectation de la valeur de l'état à la variable VisiteSignatureConfonduesIf(Me.VisiteSignatureConfonduesOui_Option =True)Then
VisiteSignatureConfondues ="Oui"ElseIf(Me.VisiteSignatureConfonduesNon_Option =True)Then
VisiteSignatureConfondues ="Non"EndIf'Déclaration de la variable ReferenceAvantModification de type String'Cette variable représente la valeur de la référence du Plan avant la modificationDim ReferenceAvantModification AsString'Affectation de la valeur de la référence avant la modification
ReferenceAvantModification = ActiveCell
'Déclaration de la variable SiteAvantModification de type StringDim SiteAvantModification AsString'Affectation de la valeur du site avant la modification
SiteAvantModification = ActiveCell.Offset(0,1)Dim EntrepriseAvantModification AsString'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 modificationDim DomaineAvantModification AsString'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éesDim LigneModifiee AsLong'Affectation du numéro de la ligne de modification à la variable LigneModifiee
LigneModifiee =10+Me.PlanModifier_Liste.ListIndex
If(Cells(LigneModifiee,1)<> ReferenceAvantModification _
OrCells(LigneModifiee,2)<> SiteAvantModification _
OrCells(LigneModifiee,3)<> EntrepriseAvantModification _
OrCells(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"ElseWith LesPlans
.Cells(LigneModifiee,1)=Me.ReferencePlanChamp
If(Me.EmplacementPlan_Champ <>"")Then.Hyperlinks.Add .Cells(LigneModifiee,1),Me.EmplacementPlan_Champ
EndIf.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
EndWith'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'arborescenceDim AdresseCréationDomaine AsString'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éesDim ClasseurEnCreationDomaine As Workbook
'Affectation du bon classeur selon son domaine à la variable ClasseurEnCreationDomaineSet 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éesDim LigneCopieePlan AsLong'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 domaineDim LigneFinDonneesDomaine AsLong'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 domaineWhile((Cells(LigneCopieePlan,1)<> ReferenceAvantModification _
OrCells(LigneCopieePlan,2)<> SiteAvantModification _
OrCells(LigneCopieePlan,3)<> EntrepriseAvantModification _
OrCells(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).SelectActiveSheet("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éesDim LigneFinDonnees AsLong'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 _
OrCells(LigneModifiee,2)<> SiteAvantModification _
OrCells(LigneModifiee,3)<> EntrepriseAvantModification _
OrCells(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]"ElseWith LesSuivisVisiteSignature
.Cells(LigneModifiee,1)=Me.ReferencePlan_Champ
If(Me.EmplacementPlan_Champ <>"")Then.Hyperlinks.Add .Cells(LigneModifiee,1),Me.EmplacementPlanPrevention_Champ
EndIf.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
EndWith'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 ClasseurEnCreationDomaineSet 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 _
OrCells(LigneCopieePlan,2)<> SiteAvantModification _
OrCells(LigneCopieePlan,3)<> EntrepriseAvantModification _
OrCells(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)EndIfEndIfEndIfEndIf'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 MeEndIfEndSub
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.
d'accord merci pour la précision. Le problème se trouve ici en faite. Merci d'avance
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éesDim ClasseurEnCreationDomaine As Workbook
'Affectation du bon classeur selon son domaine à la variable ClasseurEnCreationDomaineSet 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éesDim LigneCopieePlan AsLong'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 domaineDim LigneFinDonneesDomaine AsLong'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 domaineWhile((Cells(LigneCopieePlan,1)<> ReferenceAvantModification _
OrCells(LigneCopieePlan,2)<> SiteAvantModification _
OrCells(LigneCopieePlan,3)<> EntrepriseAvantModification _
OrCells(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).SelectActiveSheet("Plans ").Cells(LigneCopieePlan,1).Select'Collage des données sur la ligne
Selection.PasteSpecial
'Fermeture du classeur Excel
ClasseurEnCreationDomaine.Close(True)
Patrice33740
Messages postés8556Date d'inscriptiondimanche 13 juin 2010StatutMembreDernière intervention 2 mars 20231 779 22 sept. 2016 à 14:50
Sans Select :
'Déclaration des variables'classeur dans lequel on va inscrire les donnéesDim ClasseurEnCreationDomaine As Workbook
'numéro de la ligne copiée où l'on copiera les donnéesDim LigneCopieePlan AsLong'numéro de la ligne où finit le contenu des données'du classeur des Plans en création par domaineDim LigneFinDonneesDomaine AsLong
AdresseFichierEnCreationDomaine ="mi/desktop"& _
Me.DomainePlan_Liste &".xlsm"'Affectation du bon classeur selon son domaine à'la variable ClasseurEnCreationDomaineSet ClasseurEnCreationDomaine = _
Application.Workbooks.Open(AdresseCréationDomaine)'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 LigneDebutDonneesWith ClasseurEnCreationDomaine.Sheets("Plans ")
LigneFinDonneesDomaine =.[A1048576].End(xlUp).Row
'Recherche de la ligne correspondant au plan à modifier'dans la feuille "Plans " du classeur par domaineWhile((.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
EndWith'Vérification que l'on a bien trouvé la correspondance'dans la feuille "Plans'....
mir.kan
Messages postés178Date d'inscriptionmardi 6 septembre 2016StatutMembreDernière intervention26 avril 2018 22 sept. 2016 à 15:19
j'ai essayé votre code mais il me met en jaune la ligne suivante
With ClasseurEnCreationDomaine.Sheets("Plans ")
mir.kan
Messages postés178Date d'inscriptionmardi 6 septembre 2016StatutMembreDernière intervention26 avril 2018 22 sept. 2016 à 15:21
Et ça ne modifie pas les autres classeurs comme prévu
Modifié par crapoulou le 22/09/2016 à 16:31
Modifié par crapoulou le 22/09/2016 à 16:31
22 sept. 2016 à 14:50
22 sept. 2016 à 15:19
With ClasseurEnCreationDomaine.Sheets("Plans ")
22 sept. 2016 à 15:21