Mise à jour base de donnée

Bonjour à vous,

Je me suis mis récemment au vba et je bloque sur quelque chose de sûrement évident pour des utilisateurs normalement avancés (et je rirai certainement de moi-même quand vous aurez éclairé ma lanterne :

Je suis sur un projet de gestion de personnel déjà bien avancé, horaires de travail, plannings, gestion des absences, et des postes de travail, mais qui ne nécessitait jusqu'à maintenant pas de modifications dans la base de données.

J'ai une feuille BDD contenant ID, nom, prénom, ..., ..., Poste.

Sur cette même feuille et à droite j'ai une extraction d'une sélection faite à partir d'une listbox. (même pas sûr que ça serve à quelque chose, n'ayant pas réussi en vba, j'ai pour l'instant juste réussi à extraire ma sélection pour la coller à droite de ma bdd.)

Le but : dans un userform, sélectionner dans une liste filtrée du personnel (par poste/service/etc) les personnes changeant de poste et mettre à jour la base de données.

Exemple : sélectionner certaines personnes dans la liste qui doivent passer en poste "journée" par exemple et modifier ces enregistrements dans la bdd par lots.

Je cherche juste une piste de travail, j'ai ratissé pas mal les différents sujets d'ici et d'ailleurs, mais il me manque la réponse à "quoi chercher"

Et vu que vous semblez super réactifs ici et efficaces, ben je me suis inscrit

Un petit fichier en pj si ça peut vous aider à mieux comprendre mon problème.

Merci pour votre attention et réflexion

8classeur1.xlsm (10.56 Ko)

Bonjour Oliv, bonjour le forum,

Tant que Franck Zappa reste en 1, ça me va

Essaie comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TB As Variant 'déclare la variable TB (Tableau de la Base)
Dim TE As Variant 'déclare la variable O (Tableau de l'Extraction)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
TB = O.Range("B2").CurrentRegion 'définit le tableau de la base TB
TE = O.Range("H2").CurrentRegion 'définit le tableau de l'extraction TE

For I = 2 To UBound(TE, 1) 'boucle 1 : sur toutes les lignes I du tableau de l'extraction TE (en partant de la seconde)
    For J = 2 To UBound(TB, 1) 'boucle 2 : sur toutes les lignes J du tableau de la base TB (en partant de la seconde)
        If TB(J, 1) = TE(I, 1) Then 'condition : si les données des deux boucles correspondent
            'renvoie dans la cellule J+1 colonne B de l'onglet O la ligne I du tableau TE
            O.Cells(J + 1, "B").Resize(1, UBound(TB, 2)).Value = Application.Index(TE, I)
            Exit For 'sort de la boucle 2
        End If 'fin de la condition
    Next J 'prochaine ligne de la boucle 2
Next I 'prochaine ligne de la boucle 1
End Sub

Ah ah

Je me doutais bien qu' il y aurait un fan dans le coin

Merci pour ta rapidité, peux pas tester de suite mais je m'y recolle tout à l'heure et je te dis quoi !

Et gloire à FZ 😎

Bonjour,

Autre proposition via utilisation de l'objet tableau et d'une référence de nom "extraction" .

Voir la procédure modif_base.

8classeur2.xlsm (22.92 Ko)

Nickel !!!

Les deux propositions sont parfaites !

Vous m'enlevez une fière chandelle du pied

Mon cerveau a un peu de mal avec cet esprit logique, je vais décortiquer les deux pour bien assimiler !

And ... I'll be back...

Merci à vous 2 !!!

En bonus pour chacune des 2 propositions, après modifications, comment supprimer facilement cette zone d'extraction pour accueillir la suivante ?

Oui je sais, j'abuse

Re,

Avec ma proposition :

O.Range("H2").CurrentRegion.Clear 'ou ClearContents

Parfait !

Merci encore

Toc toc... Haem...

En fait l'extraction est une sélection de la base et a donc les mêmes valeurs.

Alors ça marche si après l'extraction je modifie les données et que je lance la macro ensuite.

Mais il est surement possible de sauter cette étape.

J'ai besoin de modifier les postes en 8 différents (1, 2, 3, 4, M, J, S, N), je sélectionne dans la listbox et j'extrais la liste des personnes devant aller dans le poste X

Les solutions que vous m'avez aimablement indiqué recopient à l'identique l'extraction.

Qu'est-ce qui est le mieux ?

Essayer d'envoyer les infos dans la base directement depuis l'userform après sélection dans la base (je sens que je vais bien ramer...)

Ou tenter de modifier après extraction les valeurs de la colonne "poste" et lancer le biniou ?....

Je me doute que ce serait plus simple avec le fichier source, mais c'est déjà une usine à gaz et enlever les infos sensibles serait super compliqué :s

En bonus pour chacune des 2 propositions, après modifications, comment supprimer facilement cette zone d'extraction pour accueillir la suivante ?

Range("extraction").Clear

ci-jointe modif

6classeur3.xlsm (23.07 Ko)

Ah oui tiens !

L'idée m'avait traversé l'esprit mais je butais sur la syntaxe

Merci Thev !

Qu'est-ce qui est le mieux ?

Essayer d'envoyer les infos dans la base directement depuis l'userform après sélection dans la base

C'est ce qui me parait effectivement le mieux. Je vous soumets un exemple illustrant cette option.

Essayer d'envoyer les infos dans la base directement depuis l'userform après sélection dans la base

ci-joint exemple pour cette option

10classeur4.xlsm (27.06 Ko)

Wow trop fort

Voilà, c'est exactement ça !!!

Merci beaucoup, c'est dingue le temps qu'on peut perdre quand on butte quelque chose

Rechercher des sujets similaires à "mise jour base donnee"