Aller au contenu

Import/Export Excel Autocad


Messages recommandés

Posté(e)

Bonjour à tous :)

 

N'étant pas très doué en programmation mais sachant me servir de Goo... :P je cherche pour un projet autocad la possibilité d'importer/exporter vers excel les attributs de bloc autocad.

 

J'ai trouvé un code qui fonctionne très bien MAIS je voudrais importer/exporter UN SEUL bloc que je choisirais au préalable.

 

Pour info, mon autocad contient plusieurs folio avec des cartouches sous forme de bloc avec attribut et quand j'importe les attributs, j'ai les blocs de mes folios mais également celle de mes symboles et je me retrouve avec un tableau indigeste.

 

L'idée et de pouvoir choisir mon bloc par un clic OU nommé le bloc dans le VBA Excel pour avoir un tableau excel avec les attributs de ce seul bloc.

 

Ci dessous les codes de mes deux boutons VBA Excel (trouvé sur la toile)

 

Dim DrawingFile As String


Sub EnvoyerVersAutoCAD()


 Dim AcadApp As AutoCAD.AcadApplication

 Dim BlocRef As AcadBlockReference

 Dim Row, i, Column As Integer

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

 ' Connexion avec AutoCAD (on le lance si il n'est pas en cours d'exécution)

 On Error Resume Next

 Set AcadApp = GetObject(, "AutoCAD.Application")

 On Error GoTo 0

 If AcadApp Is Nothing Then

   Set AcadApp = New AutoCAD.AcadApplication

 End If

 AcadApp.Visible = True



 ' Si le chemin du fichier n'est pas spécifié, on suppose qu'il est dans le même répertoire que le classeur

 Dim Filename As String

 If InStr(Cells(1, 1).Text, "\") <> 0 Then

   Filename = Cells(1, 1).Text

 Else

   Filename = ThisWorkbook.Path & "\" & Cells(1, 1).Text

 End If

 

 ' On ouvre le fichier DWG dans AutoCAD ou on l'active si il est déjà ouvert

 Dim Opened As Boolean

 Opened = False

 

 Dim Dwg As AcadDocument

 For Each Dwg In AcadApp.Documents

   If StrComp(Dwg.FullName, Filename, vbTextCompare) = 0 Then

      Dwg.Activate

      Opened = True

   End If

 Next

 

 If Not Opened Then

   AcadApp.Documents.Open (Filename)

 End If

 

 Row = 4  ' On commence à la ligne N°4

 

 Dim Handle As String

 

 While Not IsEmpty(Cells(Row, 2)) ' On s'arrête quand on tombe sur une cellule handle vide

   

   ' On retrouve l'insertion de bloc à l'aide du handle mémorisé dans la feuille de calcul et de la

   ' méthode HandleToObject de l'objet document AutoCAD

   Handle = Cells(Row, 2)

   Set BlocRef = AcadApp.ActiveDocument.HandleToObject(Handle)

   

   ' Si le bloc a des attributs...

   If BlocRef.HasAttributes Then

       ' ... on les récupère

       Attributes = BlocRef.GetAttributes

       

       ' On parcourt le tableau

       For i = LBound(Attributes) To UBound(Attributes)

         ' Pour chaque attribut, on cherche une colonne dont l'entête correspond à l'étiquette

         ' de l'attribut

         Column = 3

         While Not IsEmpty(Cells(3, Column))

           If Cells(3, Column).Text = Attributes(i).TagString Then

             Attributes(i).TextString = Cells(Row, Column).Text

           End If

           Column = Column + 1 ' On passe à la colonne suivante

         Wend

       Next

       

               ' PROPDYN

       Attributes = BlocRef.GetDynamicBlockProperties



       On Error Resume Next

       

       ' On parcourt le tableau

       For i = LBound(Attributes) To UBound(Attributes)

         ' Pour chaque attribut, on cherche une colonne dont l'entête correspond à l'étiquette

         ' de l'attribut

         Column = 3

         While Not IsEmpty(Cells(3, Column))

           If Cells(3, Column).Text = Attributes(i).PropertyName Then

             Attributes(i).Value = Cells(Row, Column).Value

           End If

           Column = Column + 1 ' On passe à la colonne suivante

         Wend

       Next

       

       BlocRef.Update

   End If

   Row = Row + 1 ' On passe à la ligne suivante

 Wend

 
 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic

 MsgBox "Les données ont été transférées vers AutoCAD avec succès."

End Sub


Public Sub ExtraireAttributs()

 Dim AcadApp As AutoCAD.AcadApplication

 Dim SelSet As AutoCAD.AcadSelectionSet

 Dim FilterType(0) As Integer

 Dim FilterData(0) As Variant

 Dim FiltersType, FiltersData As Variant

 

 Dim i, Row, j, Column As Integer

 Dim Entity As AcadEntity

 Dim BlocRef As AcadBlockReference

 Dim Attributes As Variant

 Dim ColumnExist As Boolean

 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual

 ' Efface toutes les données contenues dans la feuille

 Range("1:65536").ClearContents

 

 ' On demande le nom du fichier à ouvrir

 Dim Filename As Variant

 Filename = Application.GetOpenFilename("Dessins AutoCAD (*.dwg), *.dwg")

 If Filename = False Then

   Exit Sub

 End If

 Cells(1, 1).Value = Filename

 

 ' Connexion avec AutoCAD (on le lance si il n'est pas en cours d'exécution)

 On Error Resume Next

 Set AcadApp = GetObject(, "AutoCAD.Application")

 On Error GoTo 0

 If AcadApp Is Nothing Then

   Set AcadApp = New AutoCAD.AcadApplication

 End If

 

 ' On ouvre le fichier DWG dans AutoCAD ou on l'active si il est déjà ouvert

 Dim Opened As Boolean

 Opened = False

 

 Dim Dwg As AcadDocument

 For Each Dwg In AcadApp.Documents

   If StrComp(Dwg.FullName, Cells(1, 1).Text, vbTextCompare) = 0 Then

      Dwg.Activate

      Opened = True

   End If

 Next

 

 If Not Opened Then

   AcadApp.Documents.Open (Cells(1, 1).Text)

 End If

 

 ' On remets Excel au premier plan (le lancement d'AutoCAD désactive la fenêtre Excel)

 Application.Visible = True

 

 ' Remplissage de l'entête du tableau

 Cells(3, 1).Value = "Nom du bloc"

 Cells(3, 2).Value = "Handle"

 

 Row = 4 ' 1ère ligne du tableau

 

 ' On crée un jeu de sélection ou on le récupère si il existe déjà

 On Error Resume Next

 Set SelSet = AcadApp.ActiveDocument.SelectionSets.Add("SELSET")

 If Err <> 0 Then

   Set SelSet = AcadApp.ActiveDocument.SelectionSets.Item("SELSET")

   SelSet.Clear

 End If

 

 ' On prépare un filtre de sélection sur les insertions de bloc

 FilterType(0) = 0

 FilterData(0) = "INSERT"

 FiltersType = FilterType

 FiltersData = FilterData

 

 ' Sélection des entités

 SelSet.Select acSelectionSetAll, , , FiltersType, FiltersData

 

 ' On balaye le jeu de sélection

 For i = 0 To SelSet.Count - 1

   Set Entity = SelSet.Item(i)

   

   ' Si l'objet est une insertion de bloc

   If Entity.ObjectName = "AcDbBlockReference" Then

     ' On précise le type de l'objet pour pouvoir accéder à ses propriétés et

     ' ses méthodes spécifiques

     Set BlocRef = Entity

     

     ' Si il a des attributs

     If BlocRef.HasAttributes Then

       Cells(Row, 1).Value = BlocRef.Name

       Cells(Row, 2).Value = "'" & BlocRef.Handle

       

       ' On les récupére

       Attributes = BlocRef.GetAttributes

       

       ' On parcourt le tableau

       For j = LBound(Attributes) To UBound(Attributes)

         ' On recherche si une colonne existe déjà pour cette étiquette d'attribut

         Column = 3

         ColumnExist = False

         While Not IsEmpty(Cells(3, Column))

           If Cells(3, Column).Text = Attributes(j).TagString Then

             ' Une colonne existe, on la remplit avec la valeur de l'atribut

             Cells(Row, Column).Value = Attributes(j).TextString

             ColumnExist = True

           End If

           Column = Column + 1 ' On passe à la colonne suivante

         Wend

         

         If Not ColumnExist Then

           ' Aucune colonne n'existe, on en crée une et on la remplit

           Cells(3, Column).Value = Attributes(j).TagString

           Cells(Row, Column).Value = Attributes(j).TextString

         End If

         

       Next ' Attribut suivant

       

        ' PROP DYN


       Attributes = BlocRef.GetDynamicBlockProperties


       


       ' On parcourt le tableau


       For j = LBound(Attributes) To UBound(Attributes)


         ' On recherche si une colonne existe déjà pour cette étiquette d'attribut


         Column = 3


         ColumnExist = False


         While Not IsEmpty(Cells(3, Column))


           If Cells(3, Column).Text = Attributes(j).PropertyName Then


             ' Une colonne existe, on la remplit avec la valeur de l'atribut


             Cells(Row, Column).Value = Attributes(j).Value


             ColumnExist = True


           End If


           Column = Column + 1 ' On passe à la colonne suivante


         Wend


         


         If Not ColumnExist Then


           ' Aucune colonne n'existe, on en crée une et on la remplit


           Cells(3, Column).Value = Attributes(j).PropertyName


           Cells(Row, Column).Value = Attributes(j).Value


         End If


         


       Next ' Propriété dyn suivante

       

       Row = Row + 1 ' Ligne suivante

     End If

   End If

 Next

   Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic

 MsgBox "Les attributs du dessin " & Cells(1, 1).Text & " ont été extraits avec succès."

End Sub


 

En remercient par avance le génie qui pourra m'aider à avancer :P

Posté(e)

Bonne Année à toutes et tous,

 

Ouh là, j'y connais pas grand chose en prog. VBA, mais cela ne me parait pas "simple", d'autant qu'il existe des fonctions comme "ATTIN/ATTOU" des express Tools qui te font ça trés bien dans la mesure ou ton bloc est renseigné par un attribut,...

 

Si besoin de plus de "confort" (gile) à développer une ".dll" qui permet ce que tu demandes et bien plus encore,..

 

Il me semblait que le VBA était mort sous AutoCAD, non ?:blink:

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

hello

pareil que Lili

Utilise ce qui existe sous CAD ça amrche bien:

ATTIN/ATTOUT des Xpress Tools

ou

EXTRACTDONNEES qui amrche bien aussi, ya un peu de paramètrage au début mais après c'est assez facile à réemployer

@+

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Posté(e)

Bonjour,

 

Il existe déjà la commande AutoCAD "EXTRACTDONNEES" qui permet d'extraire n'importe quelles informations vers Excel. Avec cette commande et un peu de paramétrage, il est possible d'extraire seulement les attributs des blocs portant un certain nom. Par contre, il n'est pas possible de ré-importer les attributs modifiés de Excel vers AutoCAD...

 

Comme l'a indiqué "lili2006", il existe aussi ce programme développé par (gile). Cette DLL permet d'extraire des attributs des blocs dans Excel et de ré-importer les valeurs modifiées dans AutoCAD.

 

Guillaume

AutoCAD, AutoCAD Map3D, AutoCAD Architecture, Revit, COVADIS, InfraWorks 360, ReCap 360, ...

BIM Infrastructure

Posté(e)

Bonjour,

 

On peut aussi prendre la question dans l'autre sens et demander à Excel de faire le tri qui nous convient (automatiquement ou manuellement selon les cas), effectuer les modifications souhaitées puis d'exporter vers Autocad les nouvelles données. Pour éviter des manipulations fastidieuses et répétitives on crée une page Excel "modèle" avec les fonctionnalités souhaitées que l'on copie dans chaque nouveau fichier de données issu d'Autocad.

 

Belle journée,

COME

 

La vie sans musique est tout simplement une erreur, une fatigue, un exil. »

Friedrich Nietzsche

Posté(e)

Tous d'abord merci pour ces nombreuses réponse ;)

 

Par contre j'avais omis un détail important (et qui répondra à lili2006), le code VBA est sur Excel et non Autocad.

 

En fait, j'ouvre mon classeur excel, je clique sur importer et j'ai tous les blocs en import dans excel.

Quand je clique sur export, cela envoi les modifs d'attributs dans autocad.

(moi je voudrais choisir le bloc à importer)

 

Mon tableur regroupant d'autres informations, l'idée est de dessiner sur autocad le jour 1, remplir mes paramètres dans excel le jour 2, faire mon import toujours sur excel et exporter ensuite.

 

Comme ça je me sert UNIQUEMENT de mon tableur Excel et mon autocad et renseigné sans que je revienne dessus.

 

Si je n'ai d'autre choix que d'utiliser autocad, je le ferais mais si quelqu'un arrivé à modif mon code VBA EXCEL pour la sélection de mon bloc se serais merveilleux :(rires forts):

 

J'oubliais, je ne peux pas installer les express tools car je ne possède pas de CD d'installation car les PC de l'entreprise sont configurer au siège et que l'on a pas la main pour modifier quoi que se soit.

 

En espérent que quelqu'un trouvera une astuce pour modifier ce code :D

Posté(e)

Bonjour

 

Il me semblait que le VBA était mort sous AutoCAD, non ?:blink:

Pour répondre à lili2006, il est toujours possible de développer en VBA sous AutoCAD.

Il est nécessaire de télécharger/installer le module VBA.

 

@Topheur

- As-tu testé ce programme décrit dans mon message précédent ? Il semble correspondre à ce que tu demandes.

- Ta question concerne plus le language VBA qu'AutoCAD 2012. A l'avenir, je te conseille d'utiliser le forum VBA. (peut-être qu'un admin peut déplacer ce sujet...)

- Après une recherche sur ce forum justement, j'ai trouvé ce sujet où je donne une réponse adaptée à ta question.

 

Voici un extrait de ton code :

 

Dim FilterType(0) As Integer

Dim FilterData(0) As Variant

[...]

FilterType(0) = 0

FilterData(0) = "INSERT"

FiltersType = FilterType

FiltersData = FilterData

 

L'extrait précédent permet de définir un filtre de sélection.

Actuellement, la commande sélectionne toutes les références de blocs (objet de type "INSERT").

Pour sélectionner seulement les blocs nommés "Repère", tu dois modifier le code par :

 

Dim FilterType(
1
) As Integer

Dim FilterData(
1
) As Variant

[...]

FilterType(0) = 0

FilterData(0) = "INSERT"

FilterType(1) = 2

FilterData(1) = "Repère"

FiltersType = FilterType

FiltersData = FilterData

 

Guillaume

AutoCAD, AutoCAD Map3D, AutoCAD Architecture, Revit, COVADIS, InfraWorks 360, ReCap 360, ...

BIM Infrastructure

Posté(e)

Bonjour

 

 

Pour répondre à lili2006, il est toujours possible de développer en VBA sous AutoCAD.

Il est nécessaire de télécharger/installer le module VBA.

 

@Topheur

- As-tu testé ce programme décrit dans mon message précédent ? Il semble correspondre à ce que tu demandes.

- Ta question concerne plus le language VBA qu'AutoCAD 2012. A l'avenir, je te conseille d'utiliser le forum VBA. (peut-être qu'un admin peut déplacer ce sujet...)

- Après une recherche sur ce forum justement, j'ai trouvé ce sujet où je donne une réponse adaptée à ta question.

 

Voici un extrait de ton code :

 

Dim FilterType(0) As Integer

Dim FilterData(0) As Variant

[...]

FilterType(0) = 0

FilterData(0) = "INSERT"

FiltersType = FilterType

FiltersData = FilterData

 

L'extrait précédent permet de définir un filtre de sélection.

Actuellement, la commande sélectionne toutes les références de blocs (objet de type "INSERT").

Pour sélectionner seulement les blocs nommés "Repère", tu dois modifier le code par :

 

Dim FilterType(
1
) As Integer

Dim FilterData(
1
) As Variant

[...]

FilterType(0) = 0

FilterData(0) = "INSERT"

FilterType(1) = 2

FilterData(1) = "Repère"

FiltersType = FilterType

FiltersData = FilterData

 

Guillaume

 

Salut Guillaume ;)

 

Tous d'abord, je tiens à te dire JE T'AIME !!! :(rires forts):

Je savais que c'était dans ce bout de code et j'ai touché la réponse du bout du doigt !

J'ai chercher sur le net en vain et j'ai même essayé le nom de bloc mais sans la ligne

FilterType(0) = 0 à 2 ça n'importer rien !

 

Pour répondre à ta question concernant ton message précédent j'avoue qu'attendant un heureux évènement :P , en ce moment je suis plus dans la réno de chambre et les forums de bricolage que sur le forum CAD, toutefois, j'avais regardé ton topic mais les liens de téléchargement sont morts :( .

 

En tous cas, JE T'AIME, JE T'AIME, JE T'AIME ! Grâce à toi je vais gagner un temps fou sur mes nomenclatures.

 

Un GRAND MERCI !

Posté(e)

Salut,

 

Si tu souhaites en apprendre un peu plus sur les filtres de sélection VBA :

About Using Filter Lists to Define Selection Set Rules (VBA/ActiveX)

 

Je suis heureux d'avoir aidé un futur papa à libérer du temps pour préparer la chambre.

Tu n'as plus d'excuse pour ne pas être prêt à temps !

Bon courage pour la suite.

 

Guillaume

AutoCAD, AutoCAD Map3D, AutoCAD Architecture, Revit, COVADIS, InfraWorks 360, ReCap 360, ...

BIM Infrastructure

  • 5 ans après...
Posté(e)

Bonjour à tous, je reprends ce post car je cherche à exporter des paramètres dimensionnels et des attributs de blocs dynamiques afin de les renseigner sous Excel avant de les réinjecter dans AutoCAD (2019). Je tente d'utiliser l'excellent ExcelAttribut de Gile mais seuls les attributs sont exportés ! Je pensais également pouvoir récupérer les paramètres. Y-a-t-il une manip particulière pour se faire ? (Le lien de Rebcao semble HS...)

merci pour votre aide !

Posté(e)

Salut JMBZ38,

 

Pour faire ce que tu souhaites, il faut utiliser le lisp ATTIN / ATTOUT amélioré par Brice.

Il faut que tu ais les Expresstools d'installé pour pouvoir l'utiliser.

ATTIN_ATTOUT_DYN.zip

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

  • 1 an après...
Posté(e)

Bonjour

En rapport à votre conversation, nous proposons une solution

Un logiciel autonome d’outils DWG téléchargeable gratuitement ( pas besoin de version spécifique d’AutoCAD ), pour effectuer des imports / export Excel DWG. N’hésitez à l’essayer et à nous donner votre avis

C’est ici : https://plugins-cad.com/

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité