[VBA]Développement d'une application planning sous VBA / Excel

Résolu
PacifiqueW Messages postés 10 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 3 mai 2012 - 24 avril 2012 à 11:32
PacifiqueW Messages postés 10 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 3 mai 2012 - 25 avril 2012 à 12:34
Bonjour,

Je suis en ce moment sur un projet d'application planning que je suis forcé de développer en VBA et j'avouerai qu'autant je pense que je n'aurai presque aucun problème au niveau récupération de données depuis d'autres fichiers excel ou autres démarches dans le genre, autant au niveau de mon UserForm, je rencontre pas mal de problèmes, je m'explique :

J'ai attaqué le projet en étudiant directement Gdi+, ça avait l'air très approprié pour le sujet, seulement aprés quelques temps j'ai commencé à faire des Drag&drops et j'ai trouvé ça beaucoup plus pratique à faire en utilisant un CommandButton par tâche sur mon emploi du temps. Seulement le planning doit être généré via fichiers excel. Et c'est pour cela que je voudrai pouvoir générer dynamiquement de nouveaux boutons pour de nouvelles tâches, j'ai pu en générer sans réel problème mais c'est pour affecter les évènements Drag&drops dynamiquement à TOUS les boutons générés que je coince, j'ai jeté un coup d'oeil aux groupes de contrôles mais j'ai rien trouvé pour structurer ces groupes sans passer par la boîte à outils.J'ai aussi penser à créer plein de boutons sur mon UserForm et à les rendre invisible en attendant de jongler avec dans mon code, mais ça m'a l'air très moyen comme solution..
Merci d'avance pour votre aide / indulgence,
PacifiqueW



Heureux les pauvres en esprit, car le royaume de la Paix est à eux.

7 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 avril 2012 à 11:14
Bonjour, PacifiqueW
Utilise le moteur de recherche de ce forum.
Je me rappelle très bien, par exemple, avoir participé il y a plus d'un an à une discussion sur ce thème (création et utilisation de pseudo groupe de contrôles indexés sous VBA).
Il faut créer, entre autres, une classe, pour les évènements.
Commence par chercher avec groupe indexe et mon pseudo. Tu devrais retrouver ce code.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 avril 2012 à 11:40
Lis ceci ===>> teste ===>> analyse ===>> comprends ===>>> adapte :

mes commentaires pour ce code (que j'ai mis dans une discussion):

Si tu veux te donner plus de chances de comprendre à ce stade :
ouvre ton aide VBA sur "modules de classe"
Cela t'aidera beaucoup.
On commence par la toute première rubrique, claire :

Module contenant la définition d'une classe, notamment les définitions de ses propriétés et de ses méthodes.


"notamment" ne veut pas dire uniquement.
Regarde ensuite la toute première ligne du code de Classe1 dans l'exemple étudié :

Public WithEvents TextBoxEvents As MSForms.TextBox


Elle signifie que cette classe que nous avons nommée Classe1 traitera des évènements subis par les objets qu'elle
concerne. Note bien que Classe1 n'est qu'un nom ! on aurait pu la nommer autrement,
exemple "la_classe_définie_pour_mes_mestextboxes"
Quant à la ligne :

Public mestextboxes() As New Classe1


de déclaration faite dans un module standard :
elle a pour objet de définir que la classe utilisée pour gérer est la classe que nous avons nommée Classe1
De cette manière, le tableau dynamique d'objets mestextboxes() contient des contrôles (tes texboxes)
dont les évènements seront gérés par la classe Classe1.
Prends cela calmement, en te disant à chaque instant que ce n'est pas de la sorcellerie,
mais finalement quelque-chose d'assez simple et logique.




[u]Sur USERFORM
/u
Private Sub UserForm_Activate()
  Dim nb As Integer, obj As Control, i As Integer
  Me.Move 0, 0, 500, 400
  Dim boitetexte As MSForms.Control
  On Error Resume Next
  For i = 0 To 2
    Set boitetexte = Me.Controls("" & i)
    If boitetexte Is Nothing Then
      Set boitetexte = Me.Controls.Add("Forms.TextBox.1", "toto(" & i & ")", True)
      With boitetexte
        .Caption = "Ma textbox" & i
        .Top = 20 * i
        .Left = 100 * i
        .Height = 20
        .Width = 100
      End With
    Else
      MsgBox "existe déjà !"
    End If
    Set boitetexte = Nothing
  Next
  For Each obj In Me.Controls
  'MsgBox obj.Name
     If obj.Name Like "toto*" Then
      nb = nb + 1
      ReDim Preserve mestextboxes(1 To nb)
      Set mestextboxes(nb).TextBoxEvents = obj
    End If
  Next obj
  Set obj =  Nothing
End Sub


Sur module standard
Public mestextboxes() As New Classe1


sur module de classe

Option Explicit
Public WithEvents TextBoxEvents As MSForms.TextBox

Private Sub TextBoxEvents_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Dim index As Integer, qui As String
  qui  = UserForm1.ActiveControl.Name
  index = Val(Mid(qui, InStr(qui, "(") + 1))
  Select Case index
    Case 0
      If KeyAscii <> 8 And Not IsNumeric(Chr(KeyAscii)) Then
        KeyAscii = 0
      End If
    Case 1
      If IsNumeric(Chr(KeyAscii)) And KeyAscii <> 8 Then
        KeyAscii = 0
      End If
    Case 2
      KeyAscii = Asc(UCase(Chr(KeyAscii)))
    End Select
End Sub


J'ai bâti cet exemple autour de textboxes crées dynamiquement, auxquelles j'ai attribué des réactions différentes sur un même évènement.
Inspire toi de cela. Crée donc un groupe de commandbuttons (les évènements adéquats te seront alors proposés)
Bonne étude.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
PacifiqueW Messages postés 10 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 3 mai 2012
25 avril 2012 à 10:44
Bonjour,

Personne aurait une petite idée? Même sans prendre en compte le projet on peut résumer ma "requête" : je ne trouve pas de moyen d'affecter des évènements dynamiquement à un groupe de CommandButton que j'aurai également créer de façon dynamique.

PacifiqueW

Heureux les pauvres en esprit, car le royaume de la Paix est à eux.
0
PacifiqueW Messages postés 10 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 3 mai 2012
25 avril 2012 à 11:31
Bonjour Ucfoutu,

Désolé je suis nouveau sur le forum, j'me suis pas encore familiarisé avec tous les outils à disposition.Après quelques recherches j'ai pu trouvé ce que j'avais mal fait dans un code antérieur.

Merci à toi, bonne aprés-midi.
PacifiqueW


Heureux les pauvres en esprit, car le royaume de la Paix est à eux.
0

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

Posez votre question
PacifiqueW Messages postés 10 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 3 mai 2012
25 avril 2012 à 12:00
Re Ucfoutu,

Tout d'abord, merci beaucoup pour ta réponse, parfaitement détaillée, très complète. J'avais déjà fait quelque chose dans le même genre, au niveau conceptuel,mais pas aussi étoffé et sans doute pas aussi proprement. Ton exemple a, en plus, mis en évidence quelques défauts dans ce que j'avais fait, par exemple déclarer ma classe comme un simple objet au lieu d'en faire un tableau où stocker mes objets.
J'ai juste une question qui m'est venu en étudiant ton exemple, n'ayant que de simples bases en VBA, la déclaration de ton objet mestextboxes dans un module standard est nécessaire car elle te permet de donner à mestextboxes une portée illimitée sur tout ton projet?
PacifiqueW

Heureux les pauvres en esprit, car le royaume de la Paix est à eux.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 avril 2012 à 12:07
Relis donc
Quant à la ligne :

Public mestextboxes() As New Classe1


de déclaration faite dans un module standard :
elle a pour objet de définir que la classe utilisée pour gérer est la classe que nous avons nommée Classe1

Comment, si non, TextBoxEvents pourrait être reconnue dans la classe, ici :
Public WithEvents TextBoxEvents As MSForms.TextBox


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
PacifiqueW Messages postés 10 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 3 mai 2012
25 avril 2012 à 12:34
Je ne te cache pas que j'arrive pas à comprendre ta réponse, où même à établir le lien avec TextBoxEvents, j'ai sûrement mal exprimé ma question.
Pour résumer j'ai compris l'intérêt de créer l'instance mestextboxes de la classe Classe1, cela permet dans le code de l'UserForm d'affecter l'évènement KeyPress a un objet Textbox en le stockant dans l'attribut de classe TextBoxEvents. C'était juste l'endroit où se trouve la déclaration de l'instance de Classe1 qui m'intriguait. Je veux dire par là que si on se résume juste à l'exemple, mettre la déclaration dans le code de l'UserForm n'aurait pas empêcher l’exécution du code, en tout cas je crois.
PacifiqueW
Heureux les pauvres en esprit, car le royaume de la Paix est à eux.
0
Rejoignez-nous