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

Résolu
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   -  
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   -
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.


A voir également:

16 réponses

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
- 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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
Magnifique ! :D
Merci !
0
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
Bonjour,

les deux sont-ils possibles ?
Oui.
Peux tu nous repasser les fichiers?
0
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
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 714 Date d'inscription   Statut Membre Dernière intervention   55
 
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   Statut Modérateur Dernière intervention   2 761
 
Renvoie nous donc les 2 fichiers pour tests...
0
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55
 
0
Evi
 
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