Aller au contenu

VBA et Excel : Pbm bibliothèque !


Messages recommandés

Posté(e)

Bonsoir tous,

 

J'ai récupéré un code où Excel récupère des attribut sur AutoCAD mais lorsque je lance la macro j'ai le message : "Erreur de compilation, Projet ou bibliothèque introuvable" sur cette ligne

 

Dim AcadApp As AutoCAD.AcadApplication

 

Quand je passe par Outils/préférence il me dit Objet déjà utilisé. Voici le code :

 

*********************************************************

 

 

 

Dim DrawingFile As String

 

Sub EnvoyerVersAutoCAD()

Dim AcadApp As AutoCAD.AcadApplication

Dim BlocRef As AcadBlockReference

Dim Row, i, Column As Integer

 

' On lance AutoCAD

Set AcadApp = New AutoCAD.AcadApplication

AcadApp.Visible = True

 

' On ouvre le fichier dans AutoCAD

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

 

Row = 4 ' On commence à la rangée N°4

 

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

Set BlocRef = AcadApp.ActiveDocument.HandleToObject(Cells(Row, 2))

 

' 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

 

BlocRef.Update

End If

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

Wend

 

'AcadApp.ActiveDocument.Regen(acActiveViewport)

 

' On ferme AutoCAD

AcadApp.Quit

 

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

 

' Efface toutes les données contenues dans la feuille

Range("1:65536").ClearContents

 

' On lance AutoCAD

Set AcadApp = New AutoCAD.AcadApplication

 

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

Application.Visible = True

 

' On demande le nom du fichier à ouvrir

Cells(1, 1).Value = Application.GetOpenFilename("Dessins AutoCAD (*.dwg), *.dwg")

 

' Remplissage de l'entête du tableau

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

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

 

' On ouvre le fichier dans AutoCAD

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

 

Row = 4 ' 1ère ligne du tableau

 

' On crée un jeu de sélection

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

 

' 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

 

Row = Row + 1 ' Ligne suivante

End If

End If

Next

 

' On ferme AutoCAD

AcadApp.Quit

 

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

End Sub

 

****************************************************

 

 

 

Si qq'un sait qqchose, il est le bienvenu !

 

Merci d'avance !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)

Je n'ai pas testé le code mais si ma réponse n'est pas la bonne je le ferais demain.

 

Mais si c'est un probleme de bibilotheque inexistante, il faut activer la bibiliotheque liée à autocad sous excel.

 

Donc ds ton editeur vba excel, tu vas ds outils-> reférences et tu cherches ds la liste une référence qui ressemble à Autocad.

 

Je pourrais être plus précis demain si besoin.

 

Bon courage et tiens moi au courant.

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Salut g_barthe,

 

J'ai effectivement fait la manip sous l'éditeur Excel mais il me met "Objet déjà" utilisé quand je relance, puis la bibliothèque que j'ai choisie se désélectionne!...

 

Ce code me parait important pour un débutant comme moi, extraction vers Excel, modif d'attribut depuis Excel puis rebascule vers AutoCAD ! J'aimerai bien qu'il fonctionne...

 

J'ai laissé un message là où j'ai pris le code pur avoir des infos :

 

http://perso.orange.fr/maxence.delannoy/vba/att_excel.htm

 

Merci à toi !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)

' On lance AutoCAD

Set AcadApp = New AutoCAD.AcadApplication

AutoCAD App.Visible = True

 

Voilà je pense un élément qui pose pb.

 

Il faut remplacer la AutoCAD App.Visible...

 

Par AcadApp.Visible..... car tu as déclarer la variable AcadApp en application autocad.

 

Donc la de cette manière, l'extraction des attributs du plan se fait a priori sans pb.

 

Par contre la modification des attributs pose un pb pour la mise a jour. Mais j'espère déjà avoir fait avancer ton pb.

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Merci pour la réactivité, j'essaye et je reposte. Merci !

 

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)

Non... Il bute sur :

 

AutoCAD.AcadApplication

 

Toujours cette bibliothèque introuvable, je charge et il se met en erreur... Désespérant.

 

 

Je creuse...

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)

J'utilise la propriété CreateObject(AutoCad.Application)

 

Recherche dans l'exploratuer d'objet cette propriété tu aura peut surement un exmple d'utilisation.

 

Je peux pas te coller un exmple de mon code pour l'instant je suis sur 2 pc en meme tps. (le net sous linux et la je prog une grosse application autocad en vba sur xp) Alors dès que j'ai la possibilité de te mettre un exemple je le poste.

 

Mais moi je me sers énormement de l'explorateur d'objet et des exemples fournis qui sont d'ordinaire assez complet (en anglais dommage mais bon)

 

Bon courage

Vous voulez parler de génie climatique et poser vos questions alors venez par ici : http://le-genie-climatique.positifforum.com

Les loisirs créatifs vous tentent : http://pausebroderie.fr

Posté(e)

Yes moi aussi mes codes ressemblent à des exemples tirés de l'aide que j'aurai copié collé !... Je m'en sert pas mal. Aiguillé avec cette propriété CreateObject(AutoCad.Application) je devrai pouvoir m'en tirer. Comme ce code n'est pas de moi je n'en connais pas encor la structure ni la syntaxe...

 

Merci pour les encouragements ! Quand ce sera au point cela pourra peut être intéresser des gens. Cependant dans les express tools y'a qqchose qui y ressemble...

 

A très vite !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)

Salut, cette routine (de Maxence) fonctionne très bien, le prob ne vient pas de la routine.

Donc ds ton editeur vba excel, tu vas ds outils-> reférences et tu cherches ds la liste une référence qui ressemble à Autocad.

g_barthe a mis le doigt sur le prob.

 

"AutoCAD 2000 Type Library Manquant" c'est ce que tu a dû voir le premier coup, le désactiver si ce n'est déjà fait, coche "AutoCAD 200X Type Library" et ça devrait rouler.

 

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Posté(e)

Salut tous,

 

Merci pour vos rapides réponses, c'était bien la librairie "Manquant" qu'il fallait désavtiver. Maintenant c'est inscrit dans mon carnet rouge !

 

Another question please :

 

Tous les attributs apparaissent en décalé dans les colonnes. Y'a une ligne [surligneur] "Column = Column + 1 " [/surligneur] dans :

 

     ' 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

 

Comment dois-je modifier cette ligne pour que les attributs apparaissent les uns en-dessous des autres ?

 

Merci d'avance !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)

C'est plus compliqué que ça, va falloir changer bien plus qu'une ligne pour faire ce qur tu veux si j'ai bien compris ce que tu veux faire.

 

Nous n’ héritons pas de la terre de nos ancêtres.Nous l’empruntons à nos enfants.

Posté(e)

Salut tous !

 

Bon je vais m'en tenir à cela, je m'en pensais qu'il ne fallait changer qu'une ligne ou deux mais si tu me dit que c'est galère...

 

Je vais clôturer le sujet. Mille merci, mais partez pas trop loin !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Posté(e)
Bonsoir tous,

 

J'ai récupéré un code où Excel récupère des attribut sur AutoCAD mais lorsque je lance la macro j'ai le message : "Erreur de compilation, Projet ou bibliothèque introuvable" sur cette ligne

 

Dim AcadApp As AutoCAD.AcadApplication

 

Quand je passe par Outils/préférence il me dit Objet déjà utilisé. Voici le code :

 

*********************************************************

 

 

 

Dim DrawingFile As String

 

Sub EnvoyerVersAutoCAD()

Dim AcadApp As AutoCAD.AcadApplication

Dim BlocRef As AcadBlockReference

Dim Row, i, Column As Integer

 

' On lance AutoCAD

Set AcadApp = New AutoCAD.AcadApplication

AcadApp.Visible = True

 

' On ouvre le fichier dans AutoCAD

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

 

Row = 4 ' On commence à la rangée N°4

 

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

Set BlocRef = AcadApp.ActiveDocument.HandleToObject(Cells(Row, 2))

 

' 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

 

BlocRef.Update

End If

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

Wend

 

'AcadApp.ActiveDocument.Regen(acActiveViewport)

 

' On ferme AutoCAD

AcadApp.Quit

 

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

 

' Efface toutes les données contenues dans la feuille

Range("1:65536").ClearContents

 

' On lance AutoCAD

Set AcadApp = New AutoCAD.AcadApplication

 

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

Application.Visible = True

 

' On demande le nom du fichier à ouvrir

Cells(1, 1).Value = Application.GetOpenFilename("Dessins AutoCAD (*.dwg), *.dwg")

 

' Remplissage de l'entête du tableau

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

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

 

' On ouvre le fichier dans AutoCAD

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

 

Row = 4 ' 1ère ligne du tableau

 

' On crée un jeu de sélection

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

 

' 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

 

Row = Row + 1 ' Ligne suivante

End If

End If

Next

 

' On ferme AutoCAD

AcadApp.Quit

 

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

End Sub

 

****************************************************

 

 

 

Si qq'un sait qqchose, il est le bienvenu !

 

 

Merci d'avance !

 

 

salut j'aurai aimer en savoir un peu plus et ou le trouver merci

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é