Traitement base de donées par macro

Light479

XLDnaute Nouveau
Bonsoir,

Je me présente à vous car je ne trouve pas solution à mon problème.
J'ai en attaché une base de donnée contenant des salles répartis sur 3 batiments. Chacune des salles ont 3 prises, reférencés par leur localisation.

Ex: P-0-101-A
Batiment Principal - RDC - salle 101 - prise A

En "A2" "B2" "C2" 3 listes déroulantes qui trient en fonction des choix.

Je voudrais pouvoir en fonction de mon trie, ajouter jusqu'à 3 prises par salle et qu'elles remontent par la suite dans mes listes déroulantes.
Je suppose qu'il faut passer par du vba mais ne suis pas expert en la matière.

Merci à ceux qui prendront le temps de me lire

Light.
 

Pièces jointes

  • Brassageréseau(2)(1).xlsx
    15.8 KB · Affichages: 67

titiborregan5

XLDnaute Accro
Re : Traitement base de donées par macro

Bonjour Light479, le forum,

je pense qu'il faudrait faire une base de données propre... ce qui est dans les colonnes H à S est ta base de données j'imagine? le fait d'avoir des trous est difficilement exploitable...

Ensuite avec une bdd propre, on peut faire la mise en forme qu'on veut...via tcd notamment, ou autre...
Pour la macro d'ajout, ça ne doit pas être trop compliqué!

Enfin si j'ai bien compris la demande :s
 
Dernière édition:

Light479

XLDnaute Nouveau
Re : Traitement base de donées par macro

Bonjour, tout d'abord merci de m'avoir lu!

Je suis d'accord avec toi au niveau de ma BD, mais est-il possible de la rendre plus propre sans faire de TCD? J'aimerais pouvoir garder mes listes déroulantes. Si c'est pas le cas... ok, mais j'avoue ne pas y comprendre grand chose.

En attendant j'ai tenté quelques petites choses et voici le meilleur de ce que je pense avoir fait.
J'ai tenté d'utiliser les fonctions =droite(); =code(); =car(); =remplacer() pour isoler mon dernier caractère de mon code prise et de l'incrémenter de +1.
Je l'ai enregistré sous une macro, voici ce que ca donne:

Code:
Range("C13").Select
    ActiveCell.FormulaR1C1 = "=R[-11]C"
    Range("D13").Select
    ActiveCell.FormulaR1C1 = "=RIGHT(RC[-1])"
    Range("D14").Select
    ActiveCell.FormulaR1C1 = "=CODE(R[-1]C)"
    Range("D15").Select
    ActiveCell.FormulaR1C1 = "=R[-1]C+1"
    Range("D16").Select
    ActiveCell.FormulaR1C1 = "=R[-1]C"
    Range("D17").Select
    ActiveCell.FormulaR1C1 = "=CHAR(R[-1]C)"
    Range("D18").Select
    ActiveCell.FormulaR1C1 = "=REPLACE(R[-5]C[-1],9,1,R[-1]C)"
    Range("C13").Select

Tu me diras que c'est surement pas très concluant, et je suis d'accord avec toi. Et suis toujours ouvert à n'importe quelle solution.
 

st007

XLDnaute Barbatruc
Re : Traitement base de donées par macro

Bonjour,

J'y serai allé comme çà,

avec un code genre :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 And Target.Count = 1 Then
If Target <> "" Then
If IsError(Application.Match(Target.Value, [NOM DE LA LISTE], 0)) Then
If MsgBox("On ajoute à la liste ?", vbYesNo) = vbYes Then
[NOM DE LA LISTE].End(xlDown).Offset(1, 0) = Target.Value
Sheets("Feuil2").[NOM DE LA LISTE].Sort key1:=Sheets("Feuil2").Range("A LA SUITE DE LISTE")
Else
Application.Undo
End If
End If
End If
End If
End Sub

Mais je n'ai sans doute pas tout compris de ta demande
 

Pièces jointes

  • Classeur4.xlsx
    15.7 KB · Affichages: 54
  • Classeur4.xlsx
    15.7 KB · Affichages: 64
  • Classeur4.xlsx
    15.7 KB · Affichages: 65

Light479

XLDnaute Nouveau
Re : Traitement base de donées par macro

Alors pour la restructuration du fichier, j'en reste sans voix :eek:
Je n'aurai jamais pensé à le faire comme ca. Bien trouvé l'idée de construire une cellule à partir de plusieurs (c'est quand meme plus parlant sur le fichier ;) )

Au niveau du bouton "ajouter" pour la macro j'ai incorporer ton code, mais il semble y avoir une erreur à la première ligne
Code:
If Target.Column = 3 And Target.Count = 1 Then
Meme en me mettant sur la derniere liste déroulantes (au cas ou).

En fait ce bouton ajouter permettrai en fonction du tri sur les zones de listes de rajouter une prise noté de la meme facon avec la dernière lettre qui s'incrémente de +1
En l'occurence sur le fichier, par exemple P-0-101-D

En te remercriant du fond du coeur st007
 

st007

XLDnaute Barbatruc
Re : Traitement base de donées par macro

Je crois que j'ai enfin compris la finalité de ta question,

tu choisis un bâtiment, puis une salle puis la dernière prise de la liste

et qu'en cliquant sur le bouton "ajouter"

excel t'ajoute une prise dans ta liste en incrémentant la dernière lettre...

avec la facilité du copier coller étirer dont je me suis servi pour recréer tes listes, j'en voyais pas l'utilité.

la macro suggérée est utilisée dans le fichier bgt2 ci-joint
l'idée est alors de gérer directement la liste de l'onglet nature ou alors de taper qqch dans la colonne A de la feuille budget perso
la macro vérifie si ce que tu tapes se trouve déjà dans la liste et dans la négative te demande s'il faut l'ajouter
si tu clic oui, il met a jour la liste. Ce qui rend cette donnée disponible dès la ligne suivante

il faudrait donc arrivé à nommer la liste en vba comme elle est définie dans la validation de données par :
=DECALER(D1;EQUIV(A42;D1:D90;0);EQUIV(B42;INDIRECT(SUBSTITUE(A42;" ";"_"));0);3)

c'est un point de vue
 

Pièces jointes

  • Bdgt2.xlsm
    28.8 KB · Affichages: 55
  • Bdgt2.xlsm
    28.8 KB · Affichages: 60
  • Bdgt2.xlsm
    28.8 KB · Affichages: 56

Light479

XLDnaute Nouveau
Re : Traitement base de donées par macro

Je viens d'incoporer le code dans la dernière liste déroulante et le champ s'affiche proprement sans lignes vides.

Par rapport à ton fichier, je suppose que le code permettant de rajouter sur la feuille "nature" des données est le suivant:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Column = 1 And Target.Count = 1 Then
  If Target <> "" Then
    If IsError(Application.Match(Target.Value, [nature], 0)) Then
      If MsgBox("On ajoute à la liste ?", vbYesNo) = vbYes Then
        [nature].End(xlDown).Offset(1, 0) = Target.Value
        Sheets("nature").[nature].Sort key1:=Sheets("nature").Range("A2")
      Else
        Application.Undo
      End If
     End If
   End If
  End If
End Sub

Une ligne dont je ne suis pas sur de comprendre le sens:
If Target.Column = 1 And Target.Count = 1 Then
Est-ce que celà choisi la colonne 1 et la première cellule de la colonne?

Mais si je comprends bien, le reste du code te permet d'écrire n'importe quel mot dans l'onglet Budget Perso cellule A1 et qu'il se retranscrive dans la l'onglet "nature".
Dans mon cas le rajout de prise doit se faire selon le choix des listes déroulantes, mais comme dans le fichier que tu ma passé les prises sont nommées par une formule je ne vois pas comment rechercher la valeure de la dernière listes déroulantes dans la BD à l'aide d'une simple fonction Find ou meme Match.

Puisque P-0-101-C ne correspond pas trop à =$D$2&"-"&$D$3&"-"&E$1&"-C"

Encore merci pour ton aide.
 

st007

XLDnaute Barbatruc
Re : Traitement base de donées par macro

Une ligne dont je ne suis pas sur de comprendre le sens:
If Target.Column = 1 And Target.Count = 1 Then
cela "surveille" l'activité de la colonne 1 et n'importe quelle cellule de la colonne

le reste du code te permet d'écrire n'importe quel mot dans l'onglet Budget Perso colonne A et qu'il se retranscrive dans la liste de l'onglet "nature" s'il en était absent puis reclasse la liste par ordre alphabétique.
 

st007

XLDnaute Barbatruc
Re : Traitement base de donées par macro

Pour discuter un peu

=GAUCHE(I39;8)&CAR(CODE(DROITE(I39;1))+1)

permet d'incrémenter la dernière lettre du nom d'une prise
si en I39 : O-1-205-C, la formule renvoie : O-1-205-D
 

Discussions similaires