Compléter lignes depuis autre classeur (base de données ?)

Résolu/Fermé
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 - 12 août 2014 à 11:25
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 - 15 oct. 2014 à 13:03
Bonjour tout le monde !

Je cherche à faire quelque chose, en vain. Mes recherches sont restées infructueuses. Peut-être n'ai-je tout simplement pas utilisé les bons mots... M'enfin

J'ai crée deux fichiers :
- Le premier contient les cellules vides que je souhaite remplir... https://www.cjoint.com/?DHmlmYTa2JF
- Avec le deuxième fichier contenant les données que je souhaite ajouter. https://www.cjoint.com/c/DHmltrrhok1

Ainsi, je souhaite que lorsque je tape M en A10 du premier fichier, s'affiche la liste des noms commençants par la lettre M du fichier "base de données".

Puis, si je clique sur MARTIN, que les trois cellules de MARTIN (du fichier de la base de données) soient ajoutées aux trois cellules jusqu'alors vide du fichier à remplir.

Il est important que seules les trois cellules horizontales soient ajoutées, puisque dans le fichier de réception, la quatrième cellule est utilisée (voir le fichier joint).

Aussi, si le fichier "base de données' n'existe pas, ne pas prendre en compte tout ceci.

Il doit falloir créer un lien, ou quelque chose du genre, mais impossible de trouver :/

Je vous remercie d'avance de votre aide !

Excel 2010.


16 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
12 août 2014 à 12:53
Bonjour,

La base de donnée est elle ouverte lors de la saisie dans l'autre classeur ?

Ou souhaitez vous qu'apparaisse la liste de saisie semi-automatique? Dans une ListBox?
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
12 août 2014 à 13:21
La base de données n'est pas forcément ouverte. Une ListBox, c'est pas mal je pense. Cela évite-t-il d'avoir à ouvrir le classeur manuellement ?

Evi, désolé mais je n'ai pas compris :$
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
12 août 2014 à 13:33
Voici la première version de ton fichier feuille de présence.

Le code de la macro est accessible depuis le module de la feuille "feuille de présence".
Il nécessite, dans la feuille, deux contrôles :
1 textbox
1 listbox

Pour tester, ouvre les deux classeurs, vérifie que le nom du classeur base_de_donnee.xlsx est le même que celui indiqué dans la macro à cette ligne :
With Workbooks("base_de_donnee.xlsx").Sheets("Feuil1")

Si tout ok, essaie une saisie dans le textbox.

La base de données n'est pas forcément ouverte
Dans le code donné ici, il faut qu'elle le soit. Si cela ne te convient pas, dis le.
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
12 août 2014 à 14:00
Merci pijaku pour ta rapidité !
Ca fonctionne, mais pas partout.

Si je souhaite ajouter une personne ligne 11, ça m'édite la ligne 10... En la sélectionnant, pas de succès non plus.

En effet, s'il était possible de faire cela sans que la base de données soit ouverte, ce serait cool (le débogage m'a fait beugé :D )

Aussi, je ne pensais pas vraiment à une case de recherche, mais plutôt à la colonne A dont les cellules seraient des "chercheuses".
Exemple : En A10, je tape la lettre J, la cellule me propose JEAN, JORIS, JAURES. Si je clique sur JEAN, il m'ajoute en A10, B10 et C10 les cellules correspondantes de la base de données.
En A11, je tape la lettre P, la cellule propose PIERRE, PAUL. Si je clique sur PAUL, etc...

Je sais pas si c'est claire cette affaire :p
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
12 août 2014 à 14:22
C'est clair, mais...
L'événement Change de la feuille de calcul ne se déclenche pas à la saisie des lettres dans une cellule. De plus, tu ne peux pas cliquer sur une partie de la cellule.
Ce que je t'ai bricolé est la meilleure solution : un textbox et une listbox. Tu peux jouer sur l'esthétique si tu le désires...
Pour l'insertion de ligne, je regarde ça de suite.
Egalement pour travailler avec le classeur base de données fermé...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
12 août 2014 à 15:42
Voici : https://www.cjoint.com/c/DHmpOJNCMvm

Le classeur base de données doit être fermé absolument.
Il doit également être dans le même répertoire que celui-ci.

Si ça ne va pas comme fonctionnement, dis le

Attention, si tu passes en mode création ou que tu va dans l'éditeur VBA, il te faudra fermer puis ré-ouvrir le classeur pour que cela fonctionne...
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
14 août 2014 à 19:43
Merci et désolé pour le délais.

Ca fonctionne, merci ! Mais... (évidemment :p )
Impossible d'ajouter des données manuellement (donc sans la base de données) après avoir ajouté une ligne. Le tout, sans retirer la protection. Dans mon VBA de départ, les colonnes A, B et C (NOM, Prénom, Date de naissance) n'étaient pas protégées, et permettaient l'ajout de données. Là, non. Aussi, tu as retiré la ligne concernant les enfants en dehors des tranches d'âge prévues, la tranche "???", mais bon, je le remettrais, mais je me suis dis qu'il y avait peut-être une raison ?

Encore, à l'ajout d'une nouvelle ligne, les formules ne prennent plus en compte cette insertion :/ J'ai remédié en incluant la ligne 9, bonne idée ou pas ?

Je ne parviens pas à modifier le champ de recherche. Je trouve qu'il n'est pas assez visible. Je voudrais l'encadrer et, mieux, ajouter un texte : "Ajouter un enfant depuis la base de donné" qui disparaîtrait au clic, possible ?

Encore merci pour l'attention que tu porte à ma demande !

Bien à toi,
Naï.
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
20 sept. 2014 à 01:29
Merci pour ton aide Pijaku ! :)

Il me reste simplement le problème cité plus haut :/
Celui pouvant être résolu si l'enfant est ajouté dans la base de donné.
En l'absence de celle-ci, tant pis :D
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
22 sept. 2014 à 07:56
Bonjour,

Je ne comprends pas bien (clairement) ce que tu souhaites réaliser.
Pourrais tu être un peu plus explicite et nous repasser un fichier?
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
22 sept. 2014 à 13:05
Bonjour Pijaku :)
Voici le fichier servant de base de donnée : https://www.cjoint.com/c/DIwm7n4RhzX
Et le fichier qui l'appelle : https://www.cjoint.com/c/DIwm7RNGv74

En ouvrant le classeur Effectif, feuille "Feuille de présence".
Je clique sur Ajouter une ligne enfant.
Maintenant, en A10, je souhaite ajouter un enfant n'apparaissant pas dans la base de donnée.

Là, j'ai deux possibilité :
1) Ajouter l'enfant directement dans l'onglet Feuille de présence du classeur Effectif
2) Ajouter l'enfant à la base de donnée (donc, fermer le fichier effectif, ajouter l'enfant dans la base de donnée, fermer cette dernière et rouvrir l'effectif. Puisque le classeur base de donnée ne doit pas être ouvert en même temps que l'effectif, si j'ai bien compris.).

La première solution. Je n'y arrive pas. Je dois déprotéger la feuille pour ajouter un môme.
La deuxième solution est un soupçon contraignante :D

Le top du top serait qu'un enfant ajouté directement dans le classeur effectif soit ajouté à la base de donnée, mais j'en demande beaucoup, d'autant qu'en l'état actuel je ne peux pas ajouter d'enfant manuellement dans le classeur Effectif ;)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
23 sept. 2014 à 09:13
Bonjour,

Je t'ai préparé une petite interface de saisie.
Celle-ci s'ouvre lors d'un clic sur le bouton NOUVEL ENFANt.
Elle te permettra d'enregistrer un nouvel enfant dans la base de données.
Cet enfant sera disponible immédiatement après son enregistrement...

J'en ai profité également pour enlever 2 petits bugs :
- lorsque tu sortais du textbox sans rien saisir, la listbox restait affichée... Plus maintenant.
- il n'y a plus de message d'alerte "voulez-vous enregistrer les changements..."

Voici ton classeur en retour
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
23 sept. 2014 à 17:36
- lorsque tu sortais du textbox sans rien saisir, la listbox restait affichée... Plus maintenant.
Magnifique !

il n'y a plus de message d'alerte "voulez-vous enregistrer les changements..."
Parfait ! Je m'en sortais en acceptant l'enregistrement :)

Merci pour le bouton ajouter un enfant à la base de donnée ! C'est fort pratique !

Un petit soucis, lorsque je saisi la lettre L (ou une autre) dans la zone de recherche, je ne parviens à voir plus d'un enfant dont le nom commence par cette lettre. Impossible de descendre, ni avec la molette de la souris, ni en cliquant sur la petite flèche du bas :/
Peut-être que j'utilise mal la zone ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 sept. 2014 à 07:55
Salut,

Il est possible qu'une action décharge la base de données qui est placée en mémoire.
Je n'ai pas pu observer ce bug, mais j'ai ajouté un bouton "recharger base"...
https://www.cjoint.com/?DIzh6kgkTdA
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
25 sept. 2014 à 23:42
Bonsoir,
Cela ne résous pas le problème... Voir : https://imageshack.com/i/hjxynEKap
Je pense (pense seulement) que la taille de la listbox est petite. Je n'ai pas trouvé où est écrit la taille.
En tout cas, recharger la base de données ne fonctionne pas :/
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
26 sept. 2014 à 07:46
Salut,

Si ça n'est que ça, augmente sa taille...
Pour cela :
- déprotège ta feuille,
- passe en mode création (onglet développeur, icône en forme d'équerre)
- clic sur la listbox
- augmente la autant que de besoin
- refait toutes les opérations à l'envers (enlève le mode création et reprotège ta feuille)
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
26 sept. 2014 à 13:46
Tout simplement :D

En fait, ce sont les flèches qui ne semblent pas fonctionner...
J'ai beaucoup d'enfants dont le nom commence par LAL, ainsi, si je tape L, j'ai fait en sorte, via le mode création, d'afficher au moins deux enfants. Avec ce L, j'ai plein de mômes, et je ne peux pas descendre.
En gros, je dois faire en sorte, dans ma recherche, d'être si précis que je dois faire afficher deux enfants max.
Alors, je pourrais en effet étirer la zone bien plus bas, mais visuellement, ça me plait moins :p

Pourquoi ces flèches ne fonctionne pas ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
26 sept. 2014 à 13:49
Les flèches fonctionnent. Mais...
lorsque tu sortais du textbox sans rien saisir, la listbox restait affichée... Plus maintenant.
A chaque fois que tu sors du textbox, la liste disparait. Donc, en gros, tu n'as pas le temps de voir l'action de ton clic sur la flèche...
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
1 oct. 2014 à 21:58
Ah, c'est embêtant :/
Comment corriger cela ?
Est-ce qu'on peut élargir la zone de clique qui ne fait pas disparaître la liste ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
2 oct. 2014 à 07:37
Essaye, dans le code de la feuille "feuille de présence", de remplacer :
Private Sub TextBox1_LostFocus()
TextBox1 = ""
ListBox1.Visible = False
End Sub

par :
Private Sub TextBox1_LostFocus()
If TextBox1 = "" Then ListBox1.Visible = False Else ListBox1.Visible = True
End Sub
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
3 oct. 2014 à 12:05
Magnifique ! :D
Merci !
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
14 oct. 2014 à 22:11
Me revoilà !
Bonsoir !

https://forums.commentcamarche.net/forum/oldest/30645995-completer-lignes-depuis-autre-classeur-base-de-donnees#7
Le classeur base de données doit être fermé absolument.

Je me rend compte qu'en pratique, il pourrait être intéressant que le classeur base de données soit indifféremment ouvert ou fermé. Pijaku parlait de l'un ou de l'autre, mais les deux sont-ils possibles ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
15 oct. 2014 à 08:13
Bonjour,

les deux sont-ils possibles ?
Oui.
Peux tu nous repasser les fichiers?
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
15 oct. 2014 à 10:56
Voici le classeur : https://www.cjoint.com/c/DJplapDO0IW
Merci de m'indiquer les macros et le texte modifié. J'ai une version 4 semaines à mettre à jour également :)
Merci encore !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
15 oct. 2014 à 11:07
Alors, tu n'as qu'une ligne de code à modifier dans la procédure Workbook_Open :
Private Sub Workbook_Open()
    Dim derlig As Long
    On Error GoTo sortie
'ICI LA LIGNE MODIFIEE :
    If FichierOuvert("bdd.xlsx") = False Then Workbooks.Open ThisWorkbook.Path & "\bdd.xlsx" 'la ligne qui pose problème
    With Workbooks("bdd.xlsx").Sheets("Feuil1")
        derlig = .Range("A" & Rows.Count).End(xlUp).Row
        Sources = .Range("A2:C" & derlig).Value
    End With
    ActiveWorkbook.Close SaveChanges:=True
    With Sheets("Feuille de présence")
        .ListBox1.Visible = False
    End With
    supervision
    Exit Sub
sortie:
        MsgBox "Désolé mais la base de données n'a pas été trouvé." & vbLf & "Pour utiliser une base de données, merci de placer le fichier bdd.xlsx dans le dossier : " & ThisWorkbook.Path & "" & vbLf & "Plus d'aide : www.lanimetvous.com"
    On Error GoTo 0
End Sub


Et ajouter cette fonction, en dessous du Workbook_Open (par exemple) :
Function FichierOuvert(NomFic As String) As Boolean
Dim Wbk As Workbook
FichierOuvert = False
For Each Wbk In Application.Workbooks
    If Wbk.Name = NomFic Then FichierOuvert = True: Exit For
Next Wbk
End Function


Ce qui nous donne le module ThisWorkbook suivant :
Option Explicit

Private Sub Workbook_Open()
    Dim derlig As Long
    On Error GoTo sortie
    If FichierOuvert("bdd.xlsx") = False Then Workbooks.Open ThisWorkbook.Path & "\bdd.xlsx" 'la ligne qui pose problème
    With Workbooks("bdd.xlsx").Sheets("Feuil1")
        derlig = .Range("A" & Rows.Count).End(xlUp).Row
        Sources = .Range("A2:C" & derlig).Value
    End With
    ActiveWorkbook.Close SaveChanges:=True
    With Sheets("Feuille de présence")
        .ListBox1.Visible = False
    End With
    supervision
    Exit Sub
sortie:
        MsgBox "Désolé mais la base de données n'a pas été trouvé." & vbLf & "Pour utiliser une base de données, merci de placer le fichier bdd.xlsx dans le dossier : " & ThisWorkbook.Path & "" & vbLf & "Plus d'aide : www.lanimetvous.com"
    On Error GoTo 0
End Sub

Function FichierOuvert(NomFic As String) As Boolean
Dim Wbk As Workbook
FichierOuvert = False
For Each Wbk In Application.Workbooks
    If Wbk.Name = NomFic Then FichierOuvert = True: Exit For
Next Wbk
End Function

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    finSupervision
End Sub


Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh.Type = xlWorksheet Then
        Sh.Protect "alsh", DrawingObjects:=True, Contents:=True, Scenarios:=True _
            , AllowInsertingColumns:=True, AllowInsertingRows:=True, _
              AllowInsertingHyperlinks:=True
    Else ' Graph
        Sh.Protect "alsh", DrawingObjects:=True, Contents:=True, Scenarios:=True
    End If
End Sub
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
15 oct. 2014 à 11:35
Tout petit problème : Si la bdd est ouverte avant le classeur principal, impossible d'ouvrir le classeur.
Je pense qu'il s'ouvre, puis se referme, d'après le visuel.
Je pense que c'est cette ligne qui dit de ferme le classeur si bdd est ouvert :
If Wbk.Name = NomFic Then FichierOuvert = True: Exit For

En modifiant True en False, pas mieux. Presque pire en fait :D
Il me propose de rouvrir bdd.xlsx mais que toutes modifications seront perdues. Si j'accepte de rouvrir, il le ferme :D
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
15 oct. 2014 à 12:33
Renvoie nous donc les 2 fichiers pour tests...
0
Nai Messages postés 711 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 25 août 2023 54
15 oct. 2014 à 13:03
0
Pour créer un lien avec un autre classeur Excel, il faut utiliser une aadresse de cellule de cette forme dans ta formule :

'C:\Rapports\[Budget.xls]Annuel'!C10

Le schéma :

' adresse_dossier [ nom_fichier ] feuille ' ! cellule
-1