Je viens de recevoir ce message d'un lecteur de ce blog :

Le but de mon mail est de vous poser une question juste pour avoir une piste de recherche (car je stagne depuis 3 jours ...)
Je cherche a faire une macro dans laquelle je travaillerai sur l'objet actif (sélectionné)
J'ai bien trouvé le bout de code pour selectionner un nouvel objet, mais ce n'est hélas pas ce que je cherche.

Effectivement, c'est pas très marrant, après avoir lancer une macro vba, de devoir resélectionner les objets patiemment sélectionnés avant et qu'on a perdu à cause de la commande lancée.

Il faut utiliser l'option acSelectionSetPrevious pour retrouver les objets sélectionnés auparavant.

L'exemple ci-dessous renvoie le nom de chaque objets AutoCAD sélectionnés avant de lancer une macro vba :


Sub ErreurJeuSelection()
'Déclaration des variables :
Dim sset As AcadSelectionSet 'variable du type "jeu de sélection AutoCAD"
Dim entite As AcadEntity

On Error GoTo gestErr 'Si VBA rencontre une erreur en cours d'exécution, aller au gestionnaire d'erreur

'Creation du jeu de sélection "JeuSel1"
'Si le jeu de sélection "JeuSel1" existe déjà, il y aura une erreur:
'VBA ira sur le gestionnaire d'erreur avant de revenir à la ligne suivante

Set sset = ThisDrawing.SelectionSets.Add("JeuSel")

sset.Select acSelectionSetPrevious 'Voir aussi avec : acSelectionSetLast

For Each entite In sset
    MsgBox entite.ObjectName
Next

'Avant de quitter la procédure, on efface l'objet "sset"
Set sset = Nothing
'puis on efface le jeu de sélection de la mémoire :
ThisDrawing.SelectionSets.Item("JeuSel").Delete

'Fin de l'exécution ici :
Exit Sub 'On quitte la procédure

gestErr: 'Ici commence le gestionnaire d'erreurs

If Err.Number = -2145320851 Then 'Si le code d'erreur correspond à celui d'un jeu de sélection déjà existant
    ThisDrawing.SelectionSets.Item("JeuSel").Delete 'Alors on efface le jeu de sélection de la mémoire
    Set sset = ThisDrawing.SelectionSets.Add("JeuSel") 'Puis on recrée un nouveau jeu de sélection
    Resume Next 'Et on repart à la ligne qui suit celle qui a engendré l'erreur
Else 'Sinon
    MsgBox Err.Number & " : " & Err.Description 'indiquer le code d'erreur et sa description
    Exit Sub 'puis quitter la procédure
End If

End Sub