| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Zugriff aus Excel (2132 mal gelesen)
|
ChrisW. Mitglied
Beiträge: 5 Registriert: 27.12.2010 Excel 2007 Autocad Architecture 2008 Vista Ultimate 32-Bit
|
erstellt am: 25. Jan. 2011 22:10 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 25. Jan. 2011 22:25 <-- editieren / zitieren -->
Hi, herzlich willkommen bei CAD-de! Eine schon in AutoCAD eingebaute Variante wäre DATENEXTRAKT, da kannst Du gleich direkt Excel schreiben lassen. Anderenfalls, willst Du's über Programmierung machen, würde ich über COM auf AutoCAD hingreifen, also mit GetObject("AutoCAD.Application") das Interface zu AutoCAD initialisieren und dann damit weiterarbeiten. Einen kompletten Code jetzt hinschreiben, macht so lange keinen Sinn, solange wir nicht wissen, wie weit Du bist bzw. wie weit Du gekommen bist (weiters ohne zu wissen, was Du letztlich damit machen willst). Auch dann wirst Du wohl kaum den kompletten Code jetzt daher geschrieben bekommen, suchst Du mal (bei CAD-de bzw. im Internet-allgemein) durch, findest Du schon jede Menge Code, wie auf Blockreferenzen und deren Attributreferenzen hinkommst. - alfred - ------------------ www.hollaus.at |
marcosevim Mitglied Technischer Konstrukteur
Beiträge: 163 Registriert: 01.08.2007
|
erstellt am: 22. Feb. 2011 07:53 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisW.
Hallo, ich frag mal hier weiter, da der Titel auch zu meiner Frage passt Hab folgenden Code getestet: aber es kommt die Fehlermeldung Zitat:
Fehler beim kompilieren: Benutzerdefinierter Typ nicht definiert
Ich möchte lernen wie man vom Excel aus das ACAD anspricht. Dazu das folgende Programm wo einfach ein Kreis im ACAD gezeichent werden soll. Der Code soll aber im EXCEL VBA gestartet werden. Code:
Sub test() On Error Resume Next Err.Clear Set ACADServer = GetObject(, "AutoCad.Application.15") If Err.Number = 0 Then AutoCADVersion = "2010" Exit Sub End If
Dim Kreis As AcadCircle Dim Zentrum(0 To 2) As Double Dim Radius As Double Zentrum(0) = 0: Zentrum(1) = 0: Zentrum(2) = 0 Radius = 100.5 Set Kreis = ThisDrawing.ModelSpace.AddCircle(Zentrum, Radius) End Sub Danke für einen Tipp. Grüsse Marco
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Feb. 2011 08:13 <-- editieren / zitieren -->
Hi, wichtig zu der Fehlermeldung wäre die Zeile, in welcher der Fehler zustandekommt! Das mit ThisDrawing hätte ich ja schon im >>>anderen Thread<<< erwähnt, das hast Du nicht geändert. Also:
Code: Set Kreis = ACADServer.ActiveDocument.ModelSpace.AddCircle(Zentrum, Radius)
Weiters: AutoCad.Application.15 ... 15 entspricht einer alten AutoCAD-Version, 18 wäre für 2010 richtig. Und die Verweise im VBA-Projekt hast Du für AutoCAD gesetzt? - alfred - ------------------ www.hollaus.at |
marcosevim Mitglied Technischer Konstrukteur
Beiträge: 163 Registriert: 01.08.2007
|
erstellt am: 22. Feb. 2011 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisW.
Hallo und Danke. Die Verweise habe ich gefunden udn gesetzt. Hoffe ich halt. Er schreibt zumindest keine Fehlermeldung mehr. Er macht nun nämlich gar nichts mehr. Wenn ich mit F8 durchgehe sehe ich das er immer in das erste IF läuft. und dann bei EXIT SUB austeigt. Wieso? Grüsse Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marcosevim Mitglied Technischer Konstrukteur
Beiträge: 163 Registriert: 01.08.2007 ACAD 2012
|
erstellt am: 22. Feb. 2011 08:35 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisW.
Code sieht jetzt so aus: Code:
Sub test() On Error Resume Next Err.Clear Set ACADServer = GetObject(, "AutoCad.Application.18") If Err.Number = 0 Then AutoCADVersion = "2010" Exit Sub End If
Dim Kreis As AcadCircle Dim Zentrum(0 To 2) As Double Dim Radius As Double Zentrum(0) = 0: Zentrum(1) = 0: Zentrum(2) = 0 Radius = 100.5 Set Kreis = ACADServer.ActiveDocument.ModelSpace.AddCircle(Zentrum, Radius) End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Feb. 2011 08:38 <-- editieren / zitieren -->
Hi, >> Wenn ich mit F8 durchgehe sehe ich das er immer in das erste IF läuft. und dann bei EXIT SUB austeigt. ... dann nehme ich an, dass AutoCAD 2010 nicht gestartet (oder beschäftigt) ist. Nimm mal die Versionsnummer raus, die brauchst Du nicht unbedingt (zumindest nicht in diesem Zustand), dann startest Du AutoCAD, wartest bis es vollständig geladen ist, nachfolgend das Makro im Excel. - alfred - ------------------ www.hollaus.at |
marcosevim Mitglied Technischer Konstrukteur
Beiträge: 163 Registriert: 01.08.2007
|
erstellt am: 22. Feb. 2011 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisW.
Habs mit folgendem Code versucht. Einmal wenn kein ACAD offen ist und einmal wenn es frisch geöffnet wurde. Code:
Sub test() On Error Resume Next Err.Clear Set ACADServer = GetObject(, "AutoCad.Application.18")
'If Err.Number = 0 Then ' AutoCADVersion = "2010" ' Exit Sub 'End If Dim Kreis As AcadCircle Dim Zentrum(0 To 2) As Double Dim Radius As Double Zentrum(0) = 0: Zentrum(1) = 0: Zentrum(2) = 0 Radius = 100.5 Set Kreis = ACADServer.ActiveDocument.ModelSpace.AddCircle(Zentrum, Radius) End Sub
Er läuft ohne Fehlermeldung durch, macht aber nichts. ??? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Feb. 2011 09:40 <-- editieren / zitieren -->
Hi, >> Er läuft ohne Fehlermeldung durch, macht aber nichts. dann mal 'On Error Resume Next' rausnehmen. Wenn dann keine Fehler auftreten: könnte sein, dass Du nur mal im AutoCAD ZOOM Grenzen machen musst? - alfred - ------------------ www.hollaus.at |
marcosevim Mitglied Technischer Konstrukteur
Beiträge: 163 Registriert: 01.08.2007
|
erstellt am: 22. Feb. 2011 09:59 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisW.
Hallo, nein Leider. Der Code sieht nun folgend aus: Code:
Sub test() 'On Error Resume Next Err.Clear Set ACADServer = GetObject(, "AutoCad.Application.18")
'If Err.Number = 0 Then ' AutoCADVersion = "2010" ' Exit Sub 'End If Dim Kreis As AcadCircle Dim Zentrum(0 To 2) As Double Dim Radius As Double Zentrum(0) = 0: Zentrum(1) = 0: Zentrum(2) = 0 Radius = 100.5 Set Kreis = ACADServer.ActiveDocument.ModelSpace.AddCircle(Zentrum, Radius) End Sub
Es kommt keine Fehlermeldung, Kreis wird aber ganz sicher keiner gezeichent. Weder bei Zomm Grenzen, noch bei STRG+A sieht man etwas ,oder wird etwas markiert. Unter Extras Vereise sind folgende Sachen aktivert: - Visual Basic For Applications - Microsoft Excel 12.0 Object Library - OLE Automation - Microsoft Office 12.0 Object Library - AutoCAD 2010 Type Library mehr nicht.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Feb. 2011 10:05 <-- editieren / zitieren -->
|
marcosevim Mitglied Technischer Konstrukteur
Beiträge: 163 Registriert: 01.08.2007
|
erstellt am: 22. Feb. 2011 10:15 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisW.
Ok Mach ich auch gleich. Ev gehts aber nun. Hab ein paar Sachen die ich so gefunden habe zusammenkopiert. Schaut nun so aus: Code:
Option Explicit Public acad Public Mspace Public Drawing Public sset Sub init() On Error Resume Next Set acad = GetObject(, "AutoCAD.Application") If Err <> 0 Then MsgBox "Zuerst das DWG-File öffnen, und dann ausführen!!" Exit Sub End If acad.Visible = True Set Mspace = acad.ActiveDocument.ModelSpace Set Drawing = acad.ActiveDocument End SubSub test() Call init Dim Kreis As AcadCircle Dim Zentrum(0 To 2) As Double Dim Radius As Double Zentrum(0) = 0: Zentrum(1) = 0: Zentrum(2) = 0 Radius = 100.5 Set Kreis = acad.ActiveDocument.ModelSpace.AddCircle(Zentrum, Radius) End Sub
Ev wurde das ACAD im Hintergrund geöffnet aber nicht angezeigt. Ist der CODE oben soweit in Ordnung, oder handel ich mir da später dafür andere Probleme ein? Grüsse Marco Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Feb. 2011 10:25 <-- editieren / zitieren -->
Hi, wenn AutoCAD im Hintergrund geöffnet war, dann hast Du (auch) mit CreateObject gespielt, denn GetObject funkt nur dann, wenn AutoCAD bereits offen ist. Und ja, ist ein AutoCAD im Hintergrund offen (oder allgemein: sind mehrere AutoCAD-Sessions gestartet), dann hast Du mit GetObject keine Chance zu bestimmen, mit welchem der gestarteten AutoCAD's Dein VBA sich verheiratet. Hauptsache es funkt jetzt Weiter viel Erfolg, - alfred - ------------------ www.hollaus.at |
marcosevim Mitglied Technischer Konstrukteur
Beiträge: 163 Registriert: 01.08.2007
|
erstellt am: 22. Feb. 2011 10:36 <-- editieren / zitieren --> Unities abgeben: Nur für ChrisW.
Hallo, hab nochmal alles geschlossen und wieder neu geöffnet um zu kontrollieren ob im Hintergrund wirklich ein ACAD da ist. Nun geht es aber ohne Probleme. Der Kreis wird im aktiven ACAD eingetragen. Kein zweites ACAD im Hintergrund. Ich versteh überhaupt nicht warum es vorher nicht gegangen ist. Ich werd morgen Früh wenn der Rechner neu hochgefahren wurde nochmal den alten Code verwenden. Dann weiss ich ganz sicher ob der alte Code in Ordnung ist. Grüsse und Danke Marco Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |