Formulaires vers BDD macro excel
Résolu/Fermé
Bl4do
-
15 sept. 2011 à 15:53
Bl4do Messages postés 37 Date d'inscription jeudi 15 septembre 2011 Statut Membre Dernière intervention 24 octobre 2011 - 20 sept. 2011 à 14:37
Bl4do Messages postés 37 Date d'inscription jeudi 15 septembre 2011 Statut Membre Dernière intervention 24 octobre 2011 - 20 sept. 2011 à 14:37
A voir également:
- Formulaires vers BDD macro excel
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Si et excel - Guide
- Aller à la ligne excel - Guide
- Word et excel gratuit - Guide
7 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
20 sept. 2011 à 09:44
20 sept. 2011 à 09:44
Salut,
Suite à cette relance, je te présente le nouveau bébé...
Les fichiers : BDD et : CRF
Les modifications :
Sub CollectInfos() : Lors du lancement de la macro "Import", une autre procédure se lance (CollectInfos). Celle ci boucle sur toutes les lignes de la base de données et stocke en mémoire (dans la variable tableau "Enregistrements") les couples Nom Prénom. Pour éviter les doublons dus à des fautes de saisie, elle stocke ces "couples" en majuscules, sans espaces.
Function EstPresent : A chaque ouverture de formulaire, cette fonction va renvoyer "True" si le couple NOMPRENOM dudit formulaire est trouvé dans la variable Enregistrements et False dans le cas contraire.
Si EstPresent = False, alors la procédure importe les données. Dans le cas contraire elle passe au formulaire suivant.
Les codes :
Utilisation :
- tous les fichiers dans le même répertoire,
- Ouvrir le fichier BDD,
- se placer sur la feuille "BDD"
- ALT + F8 !!! choisir "Import" !!! Il y a maintenant 2 procédures, ne lancer que celle appelée Import...
- Exécuter
A noter : l'utilisation d'une variable tableau Enregistrements() dont la portée est : tout le module car déclarée en tête dudit module.
Cela te convient il?
Suite à cette relance, je te présente le nouveau bébé...
Les fichiers : BDD et : CRF
Les modifications :
Sub CollectInfos() : Lors du lancement de la macro "Import", une autre procédure se lance (CollectInfos). Celle ci boucle sur toutes les lignes de la base de données et stocke en mémoire (dans la variable tableau "Enregistrements") les couples Nom Prénom. Pour éviter les doublons dus à des fautes de saisie, elle stocke ces "couples" en majuscules, sans espaces.
Function EstPresent : A chaque ouverture de formulaire, cette fonction va renvoyer "True" si le couple NOMPRENOM dudit formulaire est trouvé dans la variable Enregistrements et False dans le cas contraire.
Si EstPresent = False, alors la procédure importe les données. Dans le cas contraire elle passe au formulaire suivant.
Les codes :
Option Explicit Dim Enregistrements() Sub Import() 'sources : https://silkyroad.developpez.com/vba/boucles/ 'Nécessite d'activer la référence "Microsoft Scripting RunTime" 'Dans l'éditeur de macros (Alt+F11): 'Menu Outils 'Références 'Cochez la ligne "Microsoft Scripting RunTime". 'Cliquez sur le bouton OK pour valider. Dim Fso As Scripting.FileSystemObject Dim SourceFolder As Scripting.Folder Dim FileItem As Scripting.File Dim Repertoire As String, BaseDeDonnees As String, NomFeuil As String Dim Donnees(13) Dim DrLig As Long Dim Col As Byte 'Empêche le refraichissement de l'écran pour ne pas ralentir la procédure Application.ScreenUpdating = False 'Constantes : Nom du classeur "bdd", son répertoire et nom de la feuille Repertoire = ActiveWorkbook.Path BaseDeDonnees = ActiveWorkbook.Name NomFeuil = ActiveSheet.Name 'Va entrer dans la variable tableau "enregistrements" 'toutes les données contenues en Col B et Col C, en les concaténant 'de manière à obtenir un tableau des enregistrements sous la forme 'NomPrénom Call CollectInfos Set Fso = CreateObject("Scripting.FileSystemObject") Set SourceFolder = Fso.GetFolder(Repertoire) 'Boucle sur tous les fichiers du répertoire For Each FileItem In SourceFolder.Files If Left(FileItem.Name, 3) = "CRF" Then 'ouverture du classeur "formulaire" Workbooks.Open Repertoire & "/" & FileItem.Name With Sheets("Nouveau contrat") 'c'est pour cette ligne que le nom de 'la feuille est important!!! 'remplissage des variables avec les données à extraire Donnees(0) = .Range("D4") Donnees(1) = .Range("D6") Donnees(2) = .Range("D7") Donnees(3) = .Range("G11") Donnees(4) = .Range("G12") Donnees(5) = .Range("G13") Donnees(6) = .Range("G14") Donnees(7) = .Range("G15") Donnees(8) = .Range("D13") Donnees(9) = .Range("D14") Donnees(10) = .Range("D15") Donnees(11) = .Range("D16") Donnees(12) = .Range("G7") Donnees(13) = .Range("G9") End With 'fermeture du classeur "formulaire" ActiveWorkbook.Close 'Si le couple NomPrénom du formulaire n'est pas présent dans la bdd If EstPresent(UCase(Donnees(1) & Donnees(2))) = False Then 'restitution des données dans la base With Workbooks(BaseDeDonnees).Sheets(NomFeuil) DrLig = .Range("A" & Rows.Count).End(xlUp).Row + 1 For Col = 0 To 13 .Cells(DrLig, Col + 1) = Donnees(Col) Next End With End If End If Next FileItem 'réactive le refraichissement de l'écran 'pas sur que cela soit utile, mais dans le doute... Application.ScreenUpdating = True End Sub Sub CollectInfos() Dim Lig As Long, DrLig As Long With Sheets("BDD") DrLig = .Range("B" & Rows.Count).End(xlUp).Row For Lig = 0 To DrLig - 1 ReDim Preserve Enregistrements(Lig) Enregistrements(Lig) = UCase(.Cells(Lig + 1, 2) & .Cells(Lig + 1, 3)) Next End With End Sub Function EstPresent(Enreg As String) As Boolean Dim i As Long For i = 0 To UBound(Enregistrements) If Enreg = Enregistrements(i) Then EstPresent = True Exit Function End If Next EstPresent = False End Function
Utilisation :
- tous les fichiers dans le même répertoire,
- Ouvrir le fichier BDD,
- se placer sur la feuille "BDD"
- ALT + F8 !!! choisir "Import" !!! Il y a maintenant 2 procédures, ne lancer que celle appelée Import...
- Exécuter
A noter : l'utilisation d'une variable tableau Enregistrements() dont la portée est : tout le module car déclarée en tête dudit module.
Cela te convient il?
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
15 sept. 2011 à 16:17
15 sept. 2011 à 16:17
Bonjour,
Alors on va attendre les fichiers : un formulaire et la bdd.
informations importantes :
- tous les formulaires sont dans le même répertoire de ton ordi?
- les formulaires ont-ils tous la même structure? (feuille de saisie au nom identiques, mêmes cellules à remplir etc...)
Attention à nous joindre grâce à cjoint.com ou ci-joint.fr des fichiers enregistrés sous au format excel 97-2003 si tu as excel >=2007. Au format .xls quoi...
Alors on va attendre les fichiers : un formulaire et la bdd.
informations importantes :
- tous les formulaires sont dans le même répertoire de ton ordi?
- les formulaires ont-ils tous la même structure? (feuille de saisie au nom identiques, mêmes cellules à remplir etc...)
Attention à nous joindre grâce à cjoint.com ou ci-joint.fr des fichiers enregistrés sous au format excel 97-2003 si tu as excel >=2007. Au format .xls quoi...
Bl4do
Messages postés
37
Date d'inscription
jeudi 15 septembre 2011
Statut
Membre
Dernière intervention
24 octobre 2011
1
15 sept. 2011 à 16:37
15 sept. 2011 à 16:37
Bonjour à toi Pijaku,
Tout d'abord je te remercie pour cette réponse rapide!
J'ai donc téléchargé mes fichiers à partir de ci-joint.fr, et les voici:
Formulaire:
http://www.cijoint.fr/cjlink.php?file=cj201109/cijkSAAhJo.xls
BDD:
http://www.cijoint.fr/cjlink.php?file=cj201109/cijPEeeYaE.xls
Concrètement, je souhaiterai que chaque ligne dans le fichier base de données, la 1ère étant (A2:M2), corresponde aux données en orange du fichier formulaire.
Je ne sais pas si je suis très clair, je l'espère...
S'il s'avère indispensable que les formulaires soit tous dans le même répertoire, je ferais en sorte que ce soit le cas. Et effectivement, les formulaires seront les mêmes, puisque je suis en train d'en créer un standard.
Tout d'abord je te remercie pour cette réponse rapide!
J'ai donc téléchargé mes fichiers à partir de ci-joint.fr, et les voici:
Formulaire:
http://www.cijoint.fr/cjlink.php?file=cj201109/cijkSAAhJo.xls
BDD:
http://www.cijoint.fr/cjlink.php?file=cj201109/cijPEeeYaE.xls
Concrètement, je souhaiterai que chaque ligne dans le fichier base de données, la 1ère étant (A2:M2), corresponde aux données en orange du fichier formulaire.
Je ne sais pas si je suis très clair, je l'espère...
S'il s'avère indispensable que les formulaires soit tous dans le même répertoire, je ferais en sorte que ce soit le cas. Et effectivement, les formulaires seront les mêmes, puisque je suis en train d'en créer un standard.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
15 sept. 2011 à 17:04
15 sept. 2011 à 17:04
Je serais indisponible jusqu'à lundi.
Peut être qu'un bonne âme passera d'ici là.
Sinon, rdv lundi matin.
Pense à me relancer, si j'oublies...
Peut être qu'un bonne âme passera d'ici là.
Sinon, rdv lundi matin.
Pense à me relancer, si j'oublies...
Bl4do
Messages postés
37
Date d'inscription
jeudi 15 septembre 2011
Statut
Membre
Dernière intervention
24 octobre 2011
1
19 sept. 2011 à 09:39
19 sept. 2011 à 09:39
Bonjour,
Malheureusement personne n'a encore pu m'apporter de l'aide sur mon sujet, je me permets de vous resolliciter car j'ai vraiement besoin de trouver une solution. Je suis disponible tout le temps pour apporter un maximum d'informations et de précisions en cas de besoin.
J'espère que quelqu'un pourra m'accorder un peu de temps et m'eclairer!
Merci d'avance.
Malheureusement personne n'a encore pu m'apporter de l'aide sur mon sujet, je me permets de vous resolliciter car j'ai vraiement besoin de trouver une solution. Je suis disponible tout le temps pour apporter un maximum d'informations et de précisions en cas de besoin.
J'espère que quelqu'un pourra m'accorder un peu de temps et m'eclairer!
Merci d'avance.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
Modifié par pijaku le 19/09/2011 à 10:26
Modifié par pijaku le 19/09/2011 à 10:26
Bonjour,
Je suis sur le coup.
Indications supplémentaires :
1- Comment se nomme ton fichier "base de données",
2- Comment se nomment tes fichiers "formulaire",
3- Peux t'on placer tous ces fichiers (base de données + tous les formulaires) dans un seul répertoire?
4- quel est l'extension de tous tes fichiers? .xls? .xlsx? .xlsm? autre?
Je suis sur le coup.
Indications supplémentaires :
1- Comment se nomme ton fichier "base de données",
2- Comment se nomment tes fichiers "formulaire",
3- Peux t'on placer tous ces fichiers (base de données + tous les formulaires) dans un seul répertoire?
4- quel est l'extension de tous tes fichiers? .xls? .xlsx? .xlsm? autre?
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
19 sept. 2011 à 10:32
19 sept. 2011 à 10:32
5- Les fichiers "formulaires" ne sont composés que d'une feuille. A t'elle toujours le même nom? Formulaire?
Bl4do
Messages postés
37
Date d'inscription
jeudi 15 septembre 2011
Statut
Membre
Dernière intervention
24 octobre 2011
1
19 sept. 2011 à 12:47
19 sept. 2011 à 12:47
Le fichier base de données se nomme "BDD_formulaires".
Les formulaires se nomment "CRF_Nom_Prénom".
On peut bien sur tous les placer dans le même répertoire.
L'extension est surement .xls, sauf si j'utilise des macros, cela deviendrait .xlsx ? Mais c'est tout.
Les fichiers formulaires auront plusieurs onglets, mais les CRF n'etant pas encore finis, je ne sais pas la différence qu'il y aura entre les formulaires (4 onglets: nouveau contrat, extension(prolongation du contrat), amendment (modification d'une données du contrat), termination (fin du contrat)). Je pense que se focaliser sur un seul onglet serait plus simple pour commencer, après jessayerais de reproduire la macro pour les autres. Et l'onglet (feuille) classique, nouveau contrat aura toujours le même nom, pour rendre possible la recherche par macro pour la consolidation, appelons la "Nouveau contrat".
Les formulaires se nomment "CRF_Nom_Prénom".
On peut bien sur tous les placer dans le même répertoire.
L'extension est surement .xls, sauf si j'utilise des macros, cela deviendrait .xlsx ? Mais c'est tout.
Les fichiers formulaires auront plusieurs onglets, mais les CRF n'etant pas encore finis, je ne sais pas la différence qu'il y aura entre les formulaires (4 onglets: nouveau contrat, extension(prolongation du contrat), amendment (modification d'une données du contrat), termination (fin du contrat)). Je pense que se focaliser sur un seul onglet serait plus simple pour commencer, après jessayerais de reproduire la macro pour les autres. Et l'onglet (feuille) classique, nouveau contrat aura toujours le même nom, pour rendre possible la recherche par macro pour la consolidation, appelons la "Nouveau contrat".
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
19 sept. 2011 à 12:59
19 sept. 2011 à 12:59
Voici donc ma proposition.
Mise en place :
Tous les fichiers dans le même répertoire. Tous!
Renommer le fichier base de données : "BDD_formulaires"
Les noms des fichiers formulaires doivent tous commencer par "CRF"
Ils doivent tous avoir une feuille nommée "Nouveau contrat" (attention à l'orthographe et à la casse)... Cf remarque en gras dans le code pour adapter...
Cette feuille doit être construite sous le même format que celle que tu m'as transmise.
Fichiers :
BDD_Formulaires
CRF_Nom_Prénom
!!! J'ai ajouté une colonne "ville" dans la base de données...
Code :
A placer dans un module standard du classeur BDD_Formulaires :
Utilisation :
1- ouvrir la base de données
2- Se placer sur la feuille BDD (pour le cas ou vous auriez d'autres feuilles...)
3- ALT + F8, choisir "Import" et cliquer sur "Exécuter".
4- tester
5- re-tester
6- re re re tester.....
7- revenir nous dire quoi....
Mise en place :
Tous les fichiers dans le même répertoire. Tous!
Renommer le fichier base de données : "BDD_formulaires"
Les noms des fichiers formulaires doivent tous commencer par "CRF"
Ils doivent tous avoir une feuille nommée "Nouveau contrat" (attention à l'orthographe et à la casse)... Cf remarque en gras dans le code pour adapter...
Cette feuille doit être construite sous le même format que celle que tu m'as transmise.
Fichiers :
BDD_Formulaires
CRF_Nom_Prénom
!!! J'ai ajouté une colonne "ville" dans la base de données...
Code :
A placer dans un module standard du classeur BDD_Formulaires :
Sub Import() 'sources : https://silkyroad.developpez.com/vba/boucles/ 'Nécessite d'activer la référence "Microsoft Scripting RunTime" 'Dans l'éditeur de macros (Alt+F11): 'Menu Outils 'Références 'Cochez la ligne "Microsoft Scripting RunTime". 'Cliquez sur le bouton OK pour valider. Dim Fso As Scripting.FileSystemObject Dim SourceFolder As Scripting.Folder Dim FileItem As Scripting.File Dim Repertoire As String, BaseDeDonnees As String, NomFeuil As String Dim Donnees(13) Dim DrLig As Long Dim Col As Byte 'Empêche le refraichissement de l'écran pour ne pas ralentir la procédure Application.ScreenUpdating = False 'Constantes : Nom du classeur "bdd", son répertoire et nom de la feuille Repertoire = ActiveWorkbook.Path BaseDeDonnees = ActiveWorkbook.Name NomFeuil = ActiveSheet.Name Set Fso = CreateObject("Scripting.FileSystemObject") Set SourceFolder = Fso.GetFolder(Repertoire) 'Boucle sur tous les fichiers du répertoire For Each FileItem In SourceFolder.Files If Left(FileItem.Name, 3) = "CRF" Then 'ouverture du classeur "formulaire" Workbooks.Open Repertoire & "/" & FileItem.Name With Sheets("Nouveau contrat") 'c'est pour cette ligne que le nom de 'la feuille est important!!! 'remplissage des variables avec les données à extraire Donnees(0) = .Range("D4") Donnees(1) = .Range("D6") Donnees(2) = .Range("D7") Donnees(3) = .Range("G11") Donnees(4) = .Range("G12") Donnees(5) = .Range("G13") Donnees(6) = .Range("G14") Donnees(7) = .Range("G15") Donnees(8) = .Range("D13") Donnees(9) = .Range("D14") Donnees(10) = .Range("D15") Donnees(11) = .Range("D16") Donnees(12) = .Range("G7") Donnees(13) = .Range("G9") End With 'fermeture du classeur "formulaire" ActiveWorkbook.Close 'restitution des données dans la base With Workbooks(BaseDeDonnees).Sheets(NomFeuil) DrLig = .Range("A" & Rows.Count).End(xlUp).Row + 1 For Col = 0 To 13 .Cells(DrLig, Col + 1) = Donnees(Col) Next End With End If Next FileItem 'réactive le refraichissement de l'écran 'pas sur que cela soit utile, mais dans le doute... Application.ScreenUpdating = True End Sub
Utilisation :
1- ouvrir la base de données
2- Se placer sur la feuille BDD (pour le cas ou vous auriez d'autres feuilles...)
3- ALT + F8, choisir "Import" et cliquer sur "Exécuter".
4- tester
5- re-tester
6- re re re tester.....
7- revenir nous dire quoi....
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bl4do
Messages postés
37
Date d'inscription
jeudi 15 septembre 2011
Statut
Membre
Dernière intervention
24 octobre 2011
1
19 sept. 2011 à 13:42
19 sept. 2011 à 13:42
Ouahh, merci beaucoup, c'est parfait! Peu importe le repertoire, apparement je n'ai pas besoin de modifier le chemin d'acccès, il trouve automatiquement le repertoire de la BDD c'est ca? Sinon, j'aurai surement plusieurs feuilles après, j'essayerai d'intégrer les données a la macro, peut etre que je reviendrai vers toi pour un mini coup de main ;) Quelque colonne en plus correspondant aux qques critères supplémentaires des autres onglets, jespère m'en sortir!
Merci beaucoup!
A bientôt.
Merci beaucoup!
A bientôt.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
19 sept. 2011 à 13:54
19 sept. 2011 à 13:54
Peu importe le répertoire en effet.
Pour les colonnes et données supplémentaires, n'hésite pas...
Repertoire = ActiveWorkbook.PathRemplit la variable Repertoire avec le nom du chemin d'accès au répertoire du classeur base de données. D'ou l'importance qu'il soit dans le même répertoire que les formulaires...
Pour les colonnes et données supplémentaires, n'hésite pas...
Bl4do
Messages postés
37
Date d'inscription
jeudi 15 septembre 2011
Statut
Membre
Dernière intervention
24 octobre 2011
1
19 sept. 2011 à 17:12
19 sept. 2011 à 17:12
Par contre, petit detail (assez important). Quand je lance 2 fois la macro, cela me cré des doublons.
Est ce qu'il y a un moyen, pour que ca mette à jour? C'est a dire qu'il ne rajoute que ceux qui n'y sont pas encore.
Est ce qu'il y a un moyen, pour que ca mette à jour? C'est a dire qu'il ne rajoute que ceux qui n'y sont pas encore.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
19 sept. 2011 à 18:19
19 sept. 2011 à 18:19
Oui il y a moyen..........
Je regarde ça demain. N'hésite pas à me relancer, tu connais la chanson?
Je regarde ça demain. N'hésite pas à me relancer, tu connais la chanson?
Bl4do
Messages postés
37
Date d'inscription
jeudi 15 septembre 2011
Statut
Membre
Dernière intervention
24 octobre 2011
1
20 sept. 2011 à 09:25
20 sept. 2011 à 09:25
Quelle chanson? ^^
Bl4do
Messages postés
37
Date d'inscription
jeudi 15 septembre 2011
Statut
Membre
Dernière intervention
24 octobre 2011
1
20 sept. 2011 à 14:37
20 sept. 2011 à 14:37
Oui bien sur c'est parfait! J'ai testé, ça fonctionne très bien. Jespère que je ne me perdrait pas dans ce code un peu plus long quand j'intègrerai les données des autres onglets mais la macro correspond parfaitement à ce que je voulais. Merci mille fois!