Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/12/2011, 18h43   #1
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
Par défaut Saisie de données dans un classeur de plusieurs feuilles par formulaire et par listes déroulantes

Bonjour,
Je suis nouvelle sur le forum et débutante en VBA.
J'ai un classeur excel 2007 qui contient cinq feuilles:
- Feuille1: sommaire (contient des liens hypertextes vers les autres feuilles)
- Feuille2 à Feuille 4: noms des services: comptabilité, achat, vente: colonne A contient des dates du 1/1/12 au 31/12/12, les autres colonnes contiennent des noms de matériel.
- Feuille5: récapitulatif
Ma question est la suivante:
J'aimerais créer un formulaire au niveau du sommaire, qui permet de saisir des données au niveau des feuilles "comptabilité", "achat", "vente", grâce à quatre listes déroulantes:
- liste déroulante 1: permet de choisir le nom du service (et donc de spécifier la feuille concernée)
- liste déroulante 2: permet de choisir le nom du matériel dans le service (et donc de spécifier la colonne voulue dans la feuille retenue à l'étape 1)
- liste déroulante 3: permet de choisir la date ( et donc de spécifier la ligne où les données doivent être saisies pour le nom retenu à l'étape 2)
- liste déroulante 4: permet de saisir (au niveau de la cellule délimitée par les listes déroulantes 2 et 3) une donnée parmi les choix suivants: fonctionnel, en panne, à réformer.
Je suis nulle en VBA et on m'a conseillé d'utiliser ce langage pour mettre au point le formulaire.
J'ai parcouru plusieurs forums mais je n'arrive pas à résoudre le problème.
Je vous serais vraiment reconnaissante de bien vouloir m'éclairer sur la démarche à faire.
Merci d'avance
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 18h57   #2
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour
Il faudrait d'abord se pencher sur les abc du langage (après une bonne réflexion sur la conception du fichier)
Je pencherai vers une seule feuille avec une colonne supplémentaire du Service au lieu d'une feuille par service.

Ci-joint un lien pour les userform http://excel.developpez.com/cours/?page=prog#userform
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/12/2011, 19h53   #3
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
Merci, mais la disposition en feuilles est nécessaire. D'abord parce que chaque service contient beaucoup de références de matériel, ensuite parce que dans chaque feuille d'autres données et tableaux devront être rajoutés.
j'ai simplifié en ne gardant que l'ossature pour d'une part essayer de comprendre la démarche, et d'autre part ne pas trop vous ennuyer avec trop de données , après j'essaierai d'adapter moi-même à l'intégralité du classeur. Si vous avez une idée, je suis preneuse. Mes notions en VBA s'arrêtent à comment créer un formulaire simple, et créer un bouton de commande pour l'appeler, ou à créer des procédures simples via l'enregistreur de macro le plus souvent.
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 20h02   #4
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
As tu étudié un peu le lien que je t'avais montré?
Commence par attaquer cet étude en commençant ton fichier et si tu as une question précise, le forum est là pour t'épauler.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/12/2011, 20h41   #5
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
En fait, j'avais retrouvé cette adresse il y a trois jours. J'ai regardé beaucoup de liens et téléchargé certains sous forme pdf pour les garder et les étudier à tête reposée.
J'avoue que c'est très utile mais je n'y trouve pas de réponse à mon souci. Ou alors je ne l'ai pas vue.
La question est double:
Comment saisir une donnée à partir d'une liste déroulante dans une cellule qui se retrouve dans la plage (feuille X, colonne y, cellule z)?
Comment agencer dans un formulaire une série de menus déroulants qui se complètent, un peu à la manière de filtres successifs? Le premier désignerait une des feuilles du classeur, le second les intitulés de certaines colonnes de la feuille ainsi obtenue, le troisième la ligne (ici la date) où les données doivent être reportées. Quand au quatrième il contiendrait une liste de choix correspondants aux données à saisir.
Je ne sais pas si c'est clair, mais j'espère pouvoir trouver une solution sur ce forum, ça fait un bon bout de temps que je rame
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 20h51   #6
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Rusée
Commence par ajouter une ComboBox à ton userform

Une autre piste en relation avec l'un des aspects http://excel.developpez.com/faq/inde...omboboxCascade
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/12/2011, 23h17   #7
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
hhhh non, je t'assure, il n'y a pas de ruse c'est juste que ça fait des jours que je rame sur internet sans rien trouver de probant! A la longue, on s'en lasse Je regarde ton lien sur les combobox en cascade et je te réponds
je t'avertis, ça prendra un bon bout de temps avant que je ne décortique tout ça
Merci beaucoup pour ton intérêt

Rebonsoir,
Je suis vraiment désolée du dérangement.
Après plusieurs recherches par-ci par-là, voici une première ébauche de ce que je voudrais faire.
Maintenant le problème qui se pose, c'est pour le remplissage des 3 derniers menus déroulants, sachant que si je sélectionne par exemple (service achat) comme nom de service, seuls les intitulés des colonnes de cette feuille (service achats) doivent apparaître dans le menu Référence du matériel, et ainsi de suite.
Merci encore de votre patience
Fichiers attachés
Type de fichier : rar Classeur test.rar (33,2 Ko, 6 affichages)
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 23h43   #8
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Voila un début (remplissage de la ComboBox2)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Option Explicit
 
Private Sub UserForm_Initialize()
Dim Ws As Worksheet
 
For Each Ws In ThisWorkbook.Sheets
    If Ws.Name Like "Service*" Then Me.ComboBox1.AddItem Ws.Name
Next Ws
End Sub
 
'Sur changement de Combo1, remplissage de Combo2
Private Sub ComboBox1_Change()
Dim Ws As Worksheet
Dim LastCol As Integer, i As Integer
 
If Me.ComboBox1.ListIndex > -1 Then
    Me.ComboBox2.Clear
    Set Ws = Worksheets(Me.ComboBox1.Value)
    With Ws
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        For i = 2 To LastCol
            Me.ComboBox2.AddItem .Cells(1, i)
        Next i
    End With
    Set Ws = Nothing
End If
End Sub
Sinon, et pour pouvoir simplifier l'utilsation ultérieur de ComboBox2, je te propose qu'elle soit avec 2 colonnes, la première comportera le n° de colonne de la feuille (ce n° va être caché) et la seconde comportera la matériel.

A tester
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
Private Sub UserForm_Initialize()
Dim Ws As Worksheet
 
For Each Ws In ThisWorkbook.Sheets
    If Ws.Name Like "Service*" Then Me.ComboBox1.AddItem Ws.Name
Next Ws
'Définir Combo2 à 2 colonnes
With Me.ComboBox2
    .ColumnCount = 2
    .ColumnWidths = "0;50"
End With
 
End Sub
 
'Sur changement de Combo1, remplissage de Combo2
Private Sub ComboBox1_Change()
Dim Ws As Worksheet
Dim LastCol As Integer, i As Integer
 
If Me.ComboBox1.ListIndex > -1 Then
    Me.ComboBox2.Clear
    Set Ws = Worksheets(Me.ComboBox1.Value)
    With Ws
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        For i = 2 To LastCol
            Me.ComboBox2.AddItem i
            Me.ComboBox2.List(Me.ComboBox2.ListCount - 1, 1) = .Cells(1, i)
        Next i
    End With
    Set Ws = Nothing
End If
End Sub
 
Private Sub ComboBox2_Change()
 
If Me.ComboBox2.ListIndex > -1 Then
    MsgBox Me.ComboBox2                          'ici le n° de la colonne
    'suite du code
End If
End Sub
PS. le précédent code était pour la compréhension et l'actuel pour l'utilité.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/12/2011, 00h10   #9
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
C'est excellent!! Merci beaucoup beaucoup!
Bon, je n'ai pas compris grand chose mais ça marche!
As-tu une idée de la ligne de commande à insérer si je veux arrêter l'ajout des colonnes à la première valeur vide en partant de A1?
Encore une fois merci, depuis plusieurs jours, c la première fois que je sens que ça commence à avancer!
Bon, je te dis bonne nuit et à demain! et encore merci !!

Mille mercis Mercatog, tu es un champion! Je n'espérais pas tant en réalité en me connectant à ce forum! mais je ne suis pas déçue!
Le deuxième code marche super bien! bien que je ne comprends pas l'utilité de la MsgBox avec le numéro de la colonne à la fin
Encore une fois merci et bonne nuit!
A demain j'espère, le temps que tout ça mouline dans mon esprit
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h02   #10
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour

La msgbox était simplement pour te montrer qu'on peut connaitre le n° de colonne du matériel choisi.
Pour utiliser ultérieurement la colonne, on va utiliser une variable globale comme ci-après.

PS1: J'ai commenté le code pour la compréhension.
PS2: Ce coup de pouce, ne t’épargnera pas de commencer toi même par étudier les fondements du langage. En bas, tu as la FAQ.
PS3: j'insiste que tu peux utiliser une seule feuille avec une colonne supplémentaire indiquant le service.

Pour le code, la variable global LaColonne permet de mémoriser le n° de colonne choisi pour toute utilisation ultérieure.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Dim LaColonne As Integer
 
Private Sub UserForm_Initialize()
Dim Ws As Worksheet
 
For Each Ws In ThisWorkbook.Sheets
    If Ws.Name Like "Service*" Then Me.ComboBox1.AddItem Ws.Name
Next Ws
 
'Définir Combo2 à 2 colonnes et cacher le première
With Me.ComboBox2
    .ColumnCount = 2
    .ColumnWidths = "0;50"
End With
End Sub
 
'Sur changement de Combo1, remplissage de Combo2
Private Sub ComboBox1_Change()
Dim Ws As Worksheet
Dim LastCol As Integer, j As Integer
 
'Si on choisit un item dans Combo1
If Me.ComboBox1.ListIndex > -1 Then
    'Ws est la feuille sélectionnée dans Combo1
    Set Ws = Worksheets(Me.ComboBox1.Value)
    'On efface les items de Combo2
    Me.ComboBox2.Clear
    With Ws
        'LastCol: N° de colonne de la dernière cellule remplie de la ligne 1 de la feuille sélectionnée par Combo1
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        'On boucle à partir de B1
        For j = 2 To LastCol
            'On ajoute le N° de colonne (en colonne 1 de Combo2)
            Me.ComboBox2.AddItem j
            'On ajoute la valeur de la cellule (le matériel) en colonne 2 de la Combo2
            Me.ComboBox2.List(Me.ComboBox2.ListCount - 1, 1) = .Cells(1, j)
        Next j
    End With
    Set Ws = Nothing
End If
End Sub
 
Private Sub ComboBox2_Change()
 
'Si on choisit un item dans Combo2
If Me.ComboBox2.ListIndex > -1 Then
    LaColonne = Me.ComboBox2                     'ici le n° de la colonne
Else
    LaColonne = 0
End If
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/12/2011, 19h20   #11
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
Bonjour,
Alors, tout d'abord je te remercie infiniment pour les explications, même pour moi, tout me semble très clair à présent Je te remercie aussi pour le temps et l'intérêt que tu m'as accordée.
J'ai également suivi ton conseil, je me suis penchée plus sérieusement sur la FAQ et consulté plusieurs sources, finalement j'ai réussi à obtenir le fichier ci-joint.
Donc je récapitule les progrès obtenus grâce à ton aide:
1- je saisis le nom du service dans le comboBox1
2- ensuite je peux choisir dans le comboBox2 le nom du matériel en utilisant le code que tu m'as expliqué ,
3- après je sélectionne la date sur le contrôle calendrier et je la fais apparaitre dans le comboBox3 en cliquant sur le bouton que j'ai rajouté à cet effet.
4- Ensuite je peux saisir l'état du matériel dans un menu déroulant ComboBox4. J'ai inscrit les items en dur.
5- Enfin je clique sur le bouton ajouter ce qui a pour effet deux choses: d'abord vérifier que tous les ComboBox sont remplis sinon renvoie message d'erreur, d'autre part si tous les champs sont renseignés effacer le formulaire en mettant le focus sur le ComboBox1.
6- Le bouton Annuler sert à quitter le formulaire, la touche Echap est aussi possible désormais.

On peut dire que les liens que tu m'as proposée et tes conseils ont servi à qqc

Maintenant, la question qui reste à résoudre est la suivante:
---> comment à l'étape 5 après clic sur ajouter:
A- Aller sur la feuille sélectionnée dans le comboBox1 (j'imagine un code du style "Set Ws = Worksheets(Me.ComboBox1.Value)"?)
B-Trouver la cellule qui contient la valeur ComboBox3.Text?
C-Récupérer le numéro de la ligne correspondante: disons par exemple: numLigneDate
D-Enfin inscrire dans la cellule (numLigneDate, LaColonne) le choix retenu dans le ComboBox4?

Là je sèche complètement! La dernière étape avant de tout reprendre pour mon classeur original Ce dernier est fait de plus de trente feuilles, chaque feuille correspond à un service et contient entre vingt et trente types de matériel, avec des états de synthèse, des tableaux de bord, des formules et des graphiques. c'est pour ça que j'ai tenu à garder la disposition en plusieurs feuilles La version que j'ai mis en ligne est une version minimale

Encore une fois merci pour ton aide précieuse Mercatog! J'espère que tu pourras encore me sauver sur ce coup avant de te débarrasser de moi enfin, pour le moment car je compte sérieusement me mettre au VBA
Fichiers attachés
Type de fichier : rar Classeur test.rar (37,2 Ko, 2 affichages)
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 20h13   #12
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bon, pour la ComboBox3, je ne vois pas l'utilité, tu pourra utiliser directement ton contrôle Calendrier pour fixer la date

Citation:
A- Aller sur la feuille sélectionnée dans le comboBox1 (j'imagine un code du style "Set Ws = Worksheets(Me.ComboBox1.Value)"?)
Oui c'est ça, sans oublier de tester si une feuille est sélectionnée dans la ComboBox1 par
Code :
If Me.ComboBox1.ListIndex > -1 Then
Si aucun item n'est sélectionné, ListIndex a la valeur -1,
(la propriété ListIndex est 0 pour le premier item, 1 pour le 2ème item...)

Pour le 5, essaie quelque chose comme ceci (Le contrôle Calendar est absent chez moi pour mes tests, je l'ai remplacé par un contrôle MonthView)

PS: Au lieu de pré remplir les colonnes A des feuilles par les dates, le code ci-après les ajoute au fur et à mesure et donc même sans dates, ça reste fonctionnel.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Option Explicit 'Nécessaire pour exiger la declaration de toutes les variables
 
Private Sub UserForm_Initialize()
Dim Ws As Worksheet
 
For Each Ws In ThisWorkbook.Sheets
    If Ws.Name Like "Service*" Then Me.ComboBox1.AddItem Ws.Name
Next Ws
 
'Définir Combo2 à 2 colonnes et cacher le première
With Me.ComboBox2
    .ColumnCount = 2
    .ColumnWidths = "0;50"
End With
 
'remplir Combo4
Me.ComboBox4.List = Array("1", "Réforme", "En panne")
End Sub
 
'Sur changement de Combo1, remplissage de Combo2
Private Sub ComboBox1_Change()
Dim Ws As Worksheet
Dim LastCol As Integer, j As Integer
 
'Si on choisit un item dans Combo1
If Me.ComboBox1.ListIndex > -1 Then
    'Ws est la feuille sélectionnée dans Combo1
    Set Ws = Worksheets(Me.ComboBox1.Value)
    'On efface les items de Combo2
    Me.ComboBox2.Clear
    With Ws
        'LastCol: N° de colonne de la dernière cellule remplie de la ligne 1 de la feuille sélectionnée par Combo1
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        'On boucle à partir de B1
        For j = 2 To LastCol
            'On ajoute le N° de colonne (en colonne 1 de Combo2)
            Me.ComboBox2.AddItem j
            'On ajoute la valeur de la cellule (le matériel) en colonne 2 de la Combo2
            Me.ComboBox2.List(Me.ComboBox2.ListCount - 1, 1) = .Cells(1, j)
        Next j
    End With
    Set Ws = Nothing
End If
End Sub
Private Sub cmdAjouter_Click()
 
'vérifier que tous les champs sont renseignés
If ComboBox1.Text = "" Then
    MsgBox "veuillez remplir le nom du service svp", vbInformation, "champs manquants"
    ComboBox1.SetFocus
ElseIf ComboBox2.Text = "" Then
    MsgBox "veuillez remplir le nom du matériel svp", vbInformation, "champs manquants"
    ComboBox2.SetFocus
ElseIf ComboBox4.Text = "" Then
    MsgBox "veuillez remplir l'état du matériel svp", vbInformation, "champs manquants"
    ComboBox4.SetFocus
Else                                             'on remplit la cellule située dans la plage (ligne"=celle de la date comboBox3",colonne"=celle du matériel comboBox2", feuille"=celle du service comboBox1")
 
    'Appel de la procédure de remplissage
    Transfert Me.ComboBox1.Value, Me.ComboBox2.Value, Me.MonthView1, Me.ComboBox4    'Ici tu remplace Me.MonthView par ton Calendar1
 
    Me.ComboBox1.ListIndex = -1
    ComboBox2.ListIndex = -1
    ComboBox4.ListIndex = -1
    ComboBox1.SetFocus
End If
End Sub
 
'Procédure de transfert de la donnée Etat dans la feuille Feuille sur la cellule d'intersection de la ligne contenant
'la date Dte et la colonne ColMat
Private Sub Transfert(ByVal Feuille As String, ByVal ColMat As Integer, ByVal Dte As Date, ByVal Etat As String)
Dim LastLig As Long, Lig As Long
Dim c As Range
 
With Worksheets(Feuille)
    'n° de la ligne de la dernière cellule remplie de la colonne A
    LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
    'Au cas où aucune donner pour sauter la ligne 2
    If LastLig = 1 Then LastLig = 2
    'on cherche la date Dte dans la colonne A
    Set c = .Range("A1:A" & LastLig).Find(Dte, LookIn:=xlFormulas, lookat:=xlWhole)
    'Si on la trouve (la date)
    If Not c Is Nothing Then
        'Lig est la ligne cherchée
        Lig = c.Row
        Set c = Nothing
        'sinon
    Else
        'Lig est la ligne de la première cellule vide
        Lig = LastLig + 1
        'en A on insère la nouvelle date non trouvée
        .Cells(Lig, 1) = Dte
    End If
    'on écrit dans l'intersection notre Etat
    .Cells(Lig, ColMat) = Etat
End With
End Sub
 
Private Sub cmdAnnuler_Click()
 
Unload formSaisieDonnée
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/12/2011, 00h18   #13
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
Mercatog, tu es un génie! Et je n'ai pas de mots pour te remercier d'avoir guidé une débutante comme moi dans ce projet qui me semblait impossible au début Je te suis vraiment reconnaissante! Chapeau!
J'ai légèrement modifié le code, très bien expliqué d'ailleurs, que tu m'as proposé. En PJ ma version définitive. Voici pourquoi je me suis permise de faire ces modifications.
Le bouton pour ajouter la date dans la comboBox3 servait en quelque sorte à vérifier la date et éviter toute erreur d'inattention de ma part. Les dates sont extrêmement importantes dans mon cas et les pannes de matériel doivent être renseignées avec exactitude.
Ensuite, les situations doivent être arrêtées quotidiennement, d'où l'intérêt de renseigner au préalable toutes les dates de l'année, car servant par la suite à alimenter des statistiques et des tableaux de bord ainsi que des états de synthèse.
Enfin, vu la taille du classeur à la fin de l'année, chaque classeur est tenu pour une durée d'un an. Il ne faut surtout pas rajouter des dates au-delà du 31 décembre 2O12 ou en-deçà du 01 janvier 2012.
J'espère que je ne t'ai pas trop ennuyé avec mon ignorance mais grâce à toi et à ce forum et les nombreux renseignements qu'il contient, je me sens beaucoup plus instruite maintenant.
Encore une fois un grand merci pour ta patience, ta générosité et tes conseils
Fichiers attachés
Type de fichier : rar Classeur test.rar (40,3 Ko, 5 affichages)
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h59   #14
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour
Tu es sur la bonne voie et de loin méthodique (apprécié). Tu ne te contente pas de copier/ coller comme malheureusement plusieurs.

J'ai une petite proposition à te présenter (à propos de Combo3)

Une ComboBox est un contrôle destiné à choisir un item parmi plusieurs et ce n'est pas ton cas.

Je te propose de supprimer ComboBox3 et le remplacer par un simple TextBox (disons TextBox1) et en plus utiliser l'évènement Click de ton Calendrier pour renseigner la date dans TextBox1 (pour ta vérification)
Donc tu n'auras pas besoin de ton ToggleButton1

Le code modifié aurait l'allure suivante:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
Option Explicit 'Nécessaire pour exiger la declaration de toutes les variables
 
Private Sub UserForm_Initialize()
Dim Ws As Worksheet
 
For Each Ws In ThisWorkbook.Sheets
    If Ws.Name Like "Service*" Then Me.ComboBox1.AddItem Ws.Name
Next Ws
 
'Définir Combo2 à 2 colonnes et cacher le première
With Me.ComboBox2
    .ColumnCount = 2
    .ColumnWidths = "0;50"
End With
Me.ComboBox4.List = Array("1", "Réforme", "En panne")
End Sub
 
 
'Sur changement de Combo1, remplissage de Combo2
Private Sub ComboBox1_Change()
Dim Ws As Worksheet
Dim LastCol As Integer, j As Integer
 
'Si on choisit un item dans Combo1
If Me.ComboBox1.ListIndex > -1 Then
    'Ws est la feuille sélectionnée dans Combo1
    Set Ws = Worksheets(Me.ComboBox1.Value)
    'On efface les items de Combo2
    Me.ComboBox2.Clear
    With Ws
        'LastCol: N° de colonne de la dernière cellule remplie de la ligne 1 de la feuille sélectionnée par Combo1
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        'On boucle à partir de B1
        For j = 2 To LastCol
            'On ajoute le N° de colonne (en colonne 1 de Combo2)
            Me.ComboBox2.AddItem j
            'On ajoute la valeur de la cellule (le matériel) en colonne 2 de la Combo2
            Me.ComboBox2.List(Me.ComboBox2.ListCount - 1, 1) = .Cells(1, j)
        Next j
    End With
    Set Ws = Nothing
End If
End Sub
 
Private Sub Calendar1_Click()
 
Me.TextBox1 = Me.Calendar1
Me.ComboBox4.ListIndex = -1
End Sub
 
Private Sub cmdAjouter_Click()
 
'vérifier que tous les champs sont renseignés
If ComboBox1.Text = "" Then
    MsgBox "veuillez remplir le nom du service svp", vbInformation, "champs manquants"
    ComboBox1.SetFocus
ElseIf ComboBox2.Text = "" Then
    MsgBox "veuillez remplir le nom du matériel svp", vbInformation, "champs manquants"
    ComboBox2.SetFocus
ElseIf Me.TextBox1.Text = "" Then
    MsgBox "veuillez remplir la date à renseigner svp", vbInformation, "champs manquants"
    Me.Calendar1.SetFocus
ElseIf ComboBox4.Text = "" Then
    MsgBox "veuillez remplir l'état du matériel svp", vbInformation, "champs manquants"
    ComboBox4.SetFocus
Else                                             'on remplit la cellule située dans la plage (ligne"=celle de la date textbox1",colonne"=celle du matériel comboBox2", feuille"=celle du service comboBox1")
    'Appel de la procédure de remplissage
    Transfert Me.ComboBox1.Value, Me.ComboBox2.Value, Me.Calendar1, Me.ComboBox4    'Ici tu remplace Me.MonthView par ton Calendar1
End If
End Sub
 
'Procédure de transfert de la donnée Etat dans la feuille Feuille sur la cellule d'intersection de la ligne contenant
'la date Dte et la colonne ColMat
Private Sub Transfert(ByVal Feuille As String, ByVal ColMat As Integer, ByVal Dte As Date, ByVal Etat As String)
Dim LastLig As Long, Lig As Long
Dim c As Range
 
With Worksheets(Feuille)
    'n° de la ligne de la dernière cellule remplie de la colonne A
    LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
    'Au cas où aucune donner pour sauter la ligne 2
    If LastLig = 1 Then LastLig = 2
    'on cherche la date Dte dans la colonne A
    Set c = .Range("A1:A" & LastLig).Find(Dte, LookIn:=xlFormulas, lookat:=xlWhole)
    'Si on la trouve (la date)
    If c Is Nothing Then
        MsgBox "veuillez entrer une date correcte svp", vbInformation, "champs erronnés"
        Me.Calendar1.SetFocus
        'sinon
    Else
        'Lig est la ligne cherchée
        Lig = c.Row
        Set c = Nothing
        'on écrit dans l'intersection notre Etat
        .Cells(Lig, ColMat) = Etat
        Me.ComboBox1.ListIndex = -1
        Me.ComboBox2.ListIndex = -1
        Me.TextBox1.Value = ""
        Me.ComboBox4.ListIndex = -1
        Me.ComboBox1.SetFocus
    End If
 
End With
End Sub
 
Private Sub cmdAnnuler_Click()
 
Unload formSaisieDonnée
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 21/12/2011, 23h24   #15
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
Bonsoir Mercatog!
Un grand merci pour ton compliment, c'est un témoignage dont je suis fière
Je trouve ta proposition tout à fait géniale!! Je l'ai donc immédiatement intégrée au classeur.
J'ai également introduit quelques ajouts, notamment la nécessité de renseigner un mot de passe masqué dans une inputbox avant de pouvoir saisir les données, une mesure de sécurité en plus
Le formulaire est donc au point, je l'ai testé sur le classeur original et je peux t'affirmer qu'il fonctionne à merveille
Je t'en suis vraiment reconnaissante. Cela n'a été possible que grâce à ton aide et tes conseils avisés
Je sais que le sujet est marqué comme résolu, mais je laisse quand même une copie du classeur test, histoire de partager avec les autres.
Ne pas tenir compte du deuxième formulaire, celui-là n'est pas fini, je viens juste de récupérer un code que j'essaierai d'adapter pour qu'il puisse in fino donner accès à des états de synthèse.
Voilà voilà
je te souhaite une très bonne nuit et à bientôt!

Et merci encore une fois!
Fichiers attachés
Type de fichier : rar Classeur test.rar (49,7 Ko, 8 affichages)
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 01h09   #16
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
Voilà, je viens de finir l'adaptation du code du deuxième formulaire.
Je mets donc en partage le classeur test final. Jettes-y un coup d’œil et dis moi ce que tu en penses, même si je n'ai que le mérite de copier
Bonne nuit pour de bon cette fois!
Fichiers attachés
Type de fichier : rar Classeur test.rar (52,4 Ko, 0 affichages)
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 01h57   #17
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
Désolée d'abuser, après ça je te laisse tranquille, promis!
Sur le dernier fichier que j'ai posté, j'ai essayé de consolider les données des trois feuilles "achat", "vente" et "comptabilité" en créant, avec formules et tout, une feuille "fonctionnalité en jours" qui illustre le nombre de jours où un matériel est fonctionnel, en panne, ou en situation de réforme. La fonction consolidation d'Excel ne pouvant pas être utilisée à cause de la présence de données non numériques (en panne, réforme), j'ai dû recourir à une formule conditionnelle.
Tout ça pour pouvoir avoir un état de synthèse obtenu en cliquant sur le bouton de commande "fonctionnalité en jours" visible dans la feuille "sommaire".
Ma question est la suivante:
Est-il possible d'obtenir le même résultat en cliquant sur le bouton de commande, via VBA, sans avoir à créer la feuille "fonctionnalité en jours"? Tout en ayant la possibilité d'insérer de nouveaux types de matériel de manière automatique ni devoir tout modifier manuellement?
Le problème qui se pose en effet avec le fichier actuel, c'est que lorsque je veux insérer un nouveau matériel, par exemple dans le service achat, je dois tout remodifier à la main dans la feuille "fonctionnalité en jours".
J'espère que tu as des indices pour m'aider à trouver une solution à ce problème, mais quoi qu'il en soit, merci d'avance. Je sais que j'ai abusé..
Très bonne nuit à toi.
Fichiers attachés
Type de fichier : rar Classeur test.rar (60,9 Ko, 10 affichages)
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 11h33   #18
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour

Tout d'abord, il faudrait lire la charte du forum pour respecter les règles.
Ta question initiale a été résolue. maintenant tu as une autre question qui n'a pas de lien avec la question initiale. Il faudrait créer un autre sujet avec la nouvelle question. Tu aurais plus de chance d'avoir des réponses.

Néanmoins, je ré insiste sur le fait que ta conception de ton fichier, malgré tes arguments, est à revoir et j'insiste qu'une seule feuille de stockage des données, après on pourra faire tout type d'analyse.

Remarque que ainsi, Excel te permet une plus grande flexibilité d'outils d'analyse et de synthèse (Filtres, TCD entre autre)
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 20h11   #19
Invité de passage
 
Femme Camelia
Étudiant
Inscription : décembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Nom : Femme Camelia
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 13
Points : 4
Points : 4
Aïe! je n'avais pas fait attention au fil de discussion. La question s'éloigne en effet du sujet initial. Désolée!
Bon, je vais essayer d'explorer ta proposition et je reviens sur le forum en cas de problème
Encore une fois merci
camelia.w est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h02.


 
 
 
 
Partenaires

Hébergement Web