VBA Le B.A.-BA du VBA

DES CONTROLES SUPPLEMENTAIRES


Controles Outre les 15 contrôles standards ou intégrés, on peut ajouter des contrôles supplémentaires appelés contrôles ActiveX pour VB5 et qui sont contenus dans des fichiers portant l'extension .OCX.
Ces contrôles peuvent être trouvés gratuitement, achetés auprès d'éditeurs spécialisés ou créés par vos propres soins à l'aide de VB5 ou C++.
Pour l'exercice suivant, nous allons utiliser Common Dialog , le contrôle qui permet, entre autres, d'utiliser la boîte de dialogue standard de Microsoft pour sélectionner les fichiers (Voir ci-dessous).

Pour charger Common Dialog :

  • Après avoir lancé l'éditeur VBA et inséré une feuille quelconque, ouvrez la fenêtre contrôles supplémentaires du menu Outils puis cochez sur le contrôle Microsoft Common Dialog Control, version 5.0 .
    Le nouveau contrôle s'installera automatiquement dans la Boîte à outils.
  • Si vous n'avez pas ce contrôle dans la liste, vérifiez que vous avez bien le fichier comctl32.ocx dans le répertoire Windows\System.
  • Si oui, le contrôle n'a pas été "enregistré" dans la base de registres Windows.
    Pour cela, il suffira de lancer, par exemple, la commande :
               regsvr32 comctl32.ocx
             
    Nota : Si vous récupérez ou achetez un nouveau contrôle, vous devrez l' enregistrer de la même façon.
  • Si vous n'avez pas le fichier comctl32.ocx vous pouvez utiliser la méthode ShowSaveDialog de AcadUnsupp. Voir chapître correspondant.


Les PLUS de WBLOC+
Wbloc+

Ce programme permet de sauvegarder des fichiers blocs sur votre disque dur, tout comme la commande WBloc standard. Mais en plus :
  • Contrairement à la méthode WBlock de VBA, vous allez pouvoir indiquer le point d'insertion du bloc comme pour la version AutoLISP.
  • Le vrai plus c'est qu'une option vous permettra de mettre le bloc sur le calque 0 avec les entités à la couleur "DuCalque". En effet, comme vous êtes expert en AutoCAD, vous savez bien que pour que le bloc que vous insérez prenne la couleur du calque courant, il faut qu'il ait été construit sur le calque 0 (zéro).
Placer les Contrôles

Commencez par insérer un nouveau module, puis dans ce Module1, ouvrez une nouvelle feuille "UserForm1" et placez les contrôles suivant le modèle et les indications ci-dessous.

Wbloc+
NOTA :
Cette fois je ne vous donnerai pas les propriétés de tous les contrôles. Je ne vous indiquerai que les particularités.
En particulier, je ne vous donne pas les propriétés Caption et Accelerator (touches de raccourci). N'oubliez pas de les modifier.
En cas de problème :
  • Reportez vous au chapître 4 .
  • Pompez sur le source que je vous donne en fin de cette page.
La feuille UserForm1
  • On conserve le nom UserForm1
  • Modifier la propriété Caption par WBloc+
NOTA : Respecter les noms des contrôles que je vous donne ici, ils doivent correspondre au code source, sinon modifiez-les dans le code également.

Common Dialog
Placez votre nouveau controle n'importe où sur la feuille ; l'endroit n'a aucune importance, le contrôle ne sera pas vu. Tant qu'il est sélectionné, appuyez sur F1, vous aurez une aide complète !
On conservera les valeurs par défaut. Les caractéristiques nécessaires seront données par programmation dans la procédure Private Sub cmdNomFichier_Click(), (procédure Click du bouton de commande Changer de nom).

Le bouton de commande Saisir les Entités
Propriété (Name) : cmdSelect

Le bouton de commande Ajouter
Propriété (Name) : cmdSelectPlus

Le bouton de commande Retirer
Propriété (Name) : cmdSelectMoins

L'intitulé Elément sélectionné
Propriété (Name) : lblNombreSelect
Propriété Caption : 0 élément sélectionné

Le bouton de commande Saisir le point
Propriété (Name) : cmdGetPoint

Les 3 zones de texte de coordonnées du point
Propriété (Name) : txtX, txtY ou txtZ
Propriétés Text et Value : 0.00
Propriété TextAlign : 3 - fmTextAlignRight

La zone de texte d'entrée du nom du bloc
Propriété (Name) : txtNomBloc
Propriété TextAlign : 3 - fmTextAlignRight

Le bouton de commande Changer de nom
Propriété (Name) : cmdNomFichier

La case à cocher Mettre sur le calque 0
Propriété (Name) : chkPlan0 (Planzéro)

Le bouton de commande Accepter
Propriété (Name) : cmdOK

Le bouton de commande Annuler
Propriété (Name) : cmdExit

IMPORTANT : N'oubliez pas les intitulés @+
Cela ne mange pas de pain et vous rapellera ce site et peut-être que sans cela, la routine marchera mal :-).


Le code de Module1

Déclarations dans (Général) de Module1
Quelques explications sur le code :
  • Option Explicit oblige à déclarer les variables, ce qui permet de réduire les conséquences des fautes de frappe.
  • Public : les valeurs de ces variables sont utilisées dans plusieurs procédures.
  • La pocédure WBlocPlus sert à lancer le programme.
    A noter : WBloc+ est écrit en toutes lettres, VBA n"acceptant pas le signe + dans le nom de la procédure.

    Option Explicit
    'Initialisation des variables
    Public ObjSelect As Object         ' Nom de la variable objet Sélection des objets
    Public DblPtBase(0 To 2) As Double ' Point de Base du bloc en tableau
    Public NbreSelect As Integer       ' Nombre d'objets sélrctionnés

  Public Sub WblocPlus()
    On Error Resume Next
    UserForm1.Show
  End Sub



Le code de la feuille UserForm1

Procédure Private Sub UserForm_Initialize()
  • Déclaration des coordonnées par défaut (0,0,0) du point de base en valeurs numériques.
  • Déclaration du nom et répertoire par défaut du bloc. A personnaliser !

Private Sub UserForm_Initialize()
    VarPtBase = Array(0#, 0#, 0#)
    ' Nom et répertoire par défaut du WBloc :
    TxtNomBloc.Text = "C:\AcadR14\BibBloc\test01.dwg"
End Sub



Procédure Private Sub cmdGetPoint_Click()
  • Obtention du point de base du biloc par la méthode GetPoint
  • Les valeurs sont affichées dans les boîtes de texte

Private Sub cmdGetPoint_Click()
    ' Procédure du choix du point de base du bloc
    ' on commence par cacher la feuille
    UserForm1.Hide
    VarPtBase = ThisDrawing.Utility.GetPoint(, "Point de base du bloc : ")
    ' Les valeurs sont affichées dans les boîtes de texte
    txtX.Text = VarPtBase(0)
    txtY.Text = VarPtBase(1)
    txtZ.Text = VarPtBase(2)
    ' On peut réafficher la feuille
    UserForm1.Show

End Sub



Procédures Private Sub txtX_Change(), txtY_Change(), txtZ_Change()
  • On transforme la chaîne tapée directement dans la boîte de texte en valeur numérique

Private Sub txtX_Change()
    ' Procédure si écriture directe dans la Boite de texte
    ' transformation de la chaîne en valeur numérique
    VarPtBase(0) = Val(txtX.Value)
End Sub

Private Sub txtY_Change()
    VarPtBase(1) = Val(txtY.Value)
End Sub
 
Private Sub txtZ_Change()
    VarPtBase(2) = Val(txtZ.Value)
End Sub



Procédure Private Sub cmdSelect_Click
  • On commence par vérifier si le jeu de sélection est vide
    En effet, la méthode utlisée, SelectionSets.Add, crée un nouveau jeu.
  • On affiche, sur la feuille, le nombre d'entités dans le jeu.
  • Les entités sélectionnées sont "surlignées".

Private Sub cmdSelect_Click()
    ' Procédure de sélection des entités
    Dim txtNbreSelect, reponse As String
    ' s'il y a déjà eu une sélection de faite
    If NbreSelect > 0 Then
        ' 305 = 1 (boutons OK et Annuler) + 48 (Avertissement) + 256 (Annuler par défaut)
        reponse = MsgBox("Vous allez annuler la sélection en cours !", 305)
        If reponse <>  vbOK Then Exit Sub
    End If
    ' il faut cacher la feuille pour pouvoir sélectionner
    UserForm1.Hide
    ' création du jeu de sélection
    Set ObjSelect = ThisDrawing.SelectionSets.Add("Bloc01")
    'Selection des entites
    ObjSelect.SelectOnScreen
    ' comptage des entités
    NbreSelect = ObjSelect.count
    ' pour faire plus propre
    If NbreSelect < 2 Then
       txtNbreSelect = " élément sélectionné"
    Else
       txtNbreSelect = " éléments sélectionnés"
    End If
    ' affichage du nombre d'entités sélectionnées
    lblNombreSelect.Caption = ObjSelect.count & txtNbreSelect
    ' "surlignage" des objets sélectionnés
    ObjSelect.Highlight (True)
    UserForm1.Show
End Sub



Procédure Private Sub cmdSelectPlus_Click()
  • On commence par vérifier si le jeu de sélection n'est pas vide
    En effet, la méthode utlisée, AddItems, ajoute un nouveau jeu à un jeu existant.
  • On crée un autre jeu de sélection.
  • On transforme cette sélection en tableau dynamique par Redim.
  • Ce tableau est ajouté au premier jeu.
  • On affiche, sur la feuille, le nouveau total d'entités dans ce jeu.
  • Les nouvelles entités sélectionnées sont "surlignées".

Private Sub cmdSelectPlus_Click()
    ' Procédure du bouton de commande Ajouter
    Dim ObjSelectModif As Object
    Dim msg  As String
    Dim Cpt1, i As Integer
    ' il faut qu'il y ait déjà une sélection d'effectuée
    If NbreSelect = 0 Then
        msg = "Vous devez d'abord créer un jeu par" + Chr(13) + Chr(10) + "le bouton  Saisir les Entités"
        ' 48 = message d'avertissement
        MsgBox msg, 48
        Exit Sub
    End If
    ' il faut cacher la feuille pour pouvoir sélectionner
    UserForm1.Hide
    ' création d'un nouveau jeu de sélection
    Set ObjSelectModif = ThisDrawing.SelectionSets.Add("ObjSelectModif")
     'Selection des entites
    ObjSelectModif.SelectOnScreen
    ' comptage des entités
    Cpt1 = ObjSelectModif.count
    ' transformation de la sélection en tableau dynamique
    ReDim TblSelectNew(0 To Cpt1 - 1) As Object
    For i = 0 To Cpt1 - 1
        Set TblSelectNew(i) = ObjSelectModif.Item(i)
    Next
    ' on ajoute la nouvelle sélection à la principale
    ObjSelect.AddItems TblSelectNew
    ' nouveau comptage
    NbreSelect = ObjSelect.count
    ' affichage du nombre d'entités sélectionnées
    lblNombreSelect.Caption = NbreSelect & " éléments sélectionnés"
    ' "surlignage" des nouveaux objets sélectionnés
    ObjSelectModif.Highlight (True)
    UserForm1.Show

End Sub



Procédure Private Sub cmdSelectMoins_Click()
  • Procédure pratiquement identique à Sub cmdSelectPlus_Click()

Private Sub cmdSelectMoins_Click()
    ' Procdure identique à cmdSelectPlus_Click()
    Dim ObjSelectModif As Object
    Dim msg  As String
    Dim Cpt1, i As Integer
    If NbreSelect = 0 Then
        msg = "Vous devez d'abord créer un jeu par" + Chr(13) + Chr(10) + "le bouton Saisir les Entités"
        MsgBox msg, 48
        Exit Sub
    End If
    UserForm1.Hide
    Set ObjSelectModif = ThisDrawing.SelectionSets.Add("ObjSelectModif")
    ObjSelectModif.SelectOnScreen
    Cpt1 = ObjSelectModif.count
    ReDim TblSelectNew(0 To Cpt1 - 1) As Object
    For i = 0 To Cpt1 - 1
        Set TblSelectNew(i) = ObjSelectModif.Item(i)
    Next
    ' différence avec cmdSelectPlus_Click() : remove au lieu de Add
    ObjSelect.RemoveItems TblSelectNew
    NbreSelect = ObjSelect.count
    lblNombreSelect.Caption = NbreSelect & " éléments sélectionnés"
    ' autre différence : suppression du surlignement des objets enlevés
    ObjSelectModif.Highlight (False)
    UserForm1.Show

End Sub



Procédure Private Sub cmdNomFichier_Click()
  • Affichage de la fenêtre Common Dialog
  • Le filtre permet de voir aussi tous les fichiers.
    Ajouté par souci pédagogique mais peut être supprimé.

Private Sub cmdNomFichier_Click()
    ' Procédure de changement du nom de bloc
    ' et affichage de la boîte Microsoft
    ErreurEcrit = False
    CommonDialog1.CancelError = True
    On Error GoTo ErrStop
    ' Flag 2 (Message si fichier existe) + Flag 4 (pas de case lecture seule)
    CommonDialog1.Flags = &H6&
    ' Choix des types de fichiers
    CommonDialog1.Filter = "Dessin (*.dwg)|*.dwg|Tous Fichiers (*.*)|*.*|"
    ' Filtre par défaut : Fichiers .dwg
    CommonDialog1.FilterIndex = 1
    ' Titre de la boîte
    CommonDialog1.DialogTitle = "Créer un fichier bloc"
    ' Méthode utilisée
    CommonDialog1.ShowSave
    ' Récupération du nom et répertoire du fichier à créer
    TxtNomBloc.Text = CommonDialog1.FileName
Exit Sub
ErrStop:
    MsgBox "Une erreur s'est produite !"
Exit Sub

End Sub



Procédure Private Sub cmdOK_Click()
  • La méthode WBlock enregistre le bloc avec comme point d'insertion le point de base du dessin.
  • On va donc copier les entités de la sélection et les déplacer avec comme 1er point le point d'insertion désiré et comme point de déplacement le point de base du dessin.
  • Si l'option Calque 0 est demandée, les entités copiées seront placées sur le calque zéro avec la couleur duCalque
  • Pour les copies et modification d'entités, on doit transformer la sélection du type variant en tableau dynamique.
  • Une fois le bloc créé, il ne reste plus qu'à effacer les entités copiées et supprimer le surlignement de la sélection.
  • On peut ajouter en dernière ligne "Unload Me" pour sortir après chaque création.

Private Sub cmdOK_Click()
    ' Procédure finale sur bouton accepter
    Dim Cpt1, i As Integer          ' compteurs
    Dim ObjSelectDepl As Object     ' Sélection copiée et déplacée
    Dim OldInsbase As Variant       ' Point de base du dessin en cours
    Dim sysVarName As String
     
    sysVarName = "INSBASE"
    ' on récupère le point de base du dessin en cours
    OldInsbase = ThisDrawing.GetVariable(sysVarName)

    Cpt1 = ObjSelect.count
    ' on transforme la sélection en tableau dynamique
    ReDim TblSelectDepl(0 To Cpt1 - 1) As Object
      For i = 0 To Cpt1 - 1
        ' on copie chaque objet de la sélection
        Set TblSelectDepl(i) = ObjSelect.Item(i).Copy
        ' on déplace l'objet vers le point de base du plan
        TblSelectDepl(i).Move VarPtBase, OldInsbase
        ' Si on veut déplacer sur le calque 0,
        If chkPlan0.Value = True Then
             ' met l'objet sur le calque 0
             TblSelectDepl(i).Layer = "0"
             ' met la couleur de l'objet à "ducalque"
             TblSelectDepl(i).Color = acByLayer
        End If
      Next
    ' Création d'une nouvelle sélection
    Set ObjSelectDepl = ThisDrawing.SelectionSets.Add("Bloc02")
    ' on y met les objets déplacés
    ObjSelectDepl.AddItems TblSelectDepl
    ' création du WBloc
    ThisDrawing.Wblock TxtNomBloc.Text, ObjSelectDepl
    For i = 0 To Cpt1 - 1
        ' suppression des objets déplacés
        ObjSelectDepl(i).Erase
    Next
    ' ouf tout est fini, on le dit !
    If Dir$(TxtNomBloc.Text) = "" Then
       MsgBox "ATTENTION : Le bloc " & TxtNomBloc.Text & " n'a pas été créé !"
        Else
        MsgBox "Le bloc " & TxtNomBloc.Text & " a été créé avec succès !"
    End If
    ' on supprime le "surlignement" des objets sélectionnés
    ObjSelect.Highlight (False)
    ' mise à jour du dessin
    ObjSelect.Update
End Sub



Procédure Private Sub cmdExit_Click()
  • Quand on clique sur Annuler, il ne reste plus qu'à supprimer le surlignement de la sélection.

Private Sub cmdExit_Click()
    ' Procédure du bouton Annuler
    ' on supprime la "surbrillance" des objets sélectionnés
    ObjSelect.Highlight (False)
    Unload Me
End Sub



AutoLISP et menu de lancement

La procédure est exactement identique à Boutonnière. Il suffit de modifier les noms de fichier et de macro

-----

Et maintenant, il ne vous reste plus qu'à créer des blocs...

-----

Téléchargement Si vous avez des problèmes ou si vous ne voulez rien faire :-) cliquez sur l'icône pour télécharger le fichier baex3.zip (23 ko) qui contient :
  • le projet WBlocPlus.dvb
  • le fichier acad.lsp
  • le menu BiRaRR.mns
  • les 2 icônes BMP

-----

Descript : Lister vos blocs dans Excel


--

© 1998-2000 FASOFT - Roger Rosec Tous droits réservés.