Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Attribute mit Excel abgleichen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
  
PNY wird von NVIDIA zum Händler des Jahres gewählt - zum dritten Mal in Folge, eine Pressemitteilung
Autor Thema:  Attribute mit Excel abgleichen (6139 mal gelesen)
Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

erstellt am: 02. Feb. 2006 13:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Forum!
Ich habe folgendes Problem: in einer Exceldatenbank stehen Einträge, die in Acad in Blöcken mit Attributen eingetragen werden sollen. Den entsprechenden Block finde ich über einen Eintrag in einem Attribut. Als erstes mache ich eine Auswahl über alle Objekte, prüfe ob sie ein Block sind und ob sie Attribut haben. Soweit die Theorie. Irgendwie klappt mein Auswahlsatz nicht. Mein Code:
Dim ExcelApp As Object
Dim ExcelWb As Object
Dim i As Integer
Dim AWSatz As AcadSelectionSet
Public Sub CoordEntry()
    Set ExcelApp = CreateObject("Excel.Application")
    ExcelApp.Visible = True
    Set ExcelWb = ExcelApp.workbooks.Open("C:\Test\Datenbank.xls")
   
    Set AWSatz = ThisDrawing.SelectionSets
    For i = 0 To AWSatz.Count - 1
        If AWSatz(i).ObjectName = "IAcadBlockreferenz" Then
            If ObjectName.HasAttributes = True Then
                MsgBox "Klappt"
            End If
        End If
    Next
End Sub
Sieht jemand meinen Fehler?
Wie bekomme ich eigentlich an ein bestimmtes Blockattrib heran?
Bitte nicht gleich losmeckern, ich befinde mich in einer sehr labilen Verfassung mit dieser neuen Sprache!
Gruß Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Stelli1
Moderator
Verm.-Ing.


Sehen Sie sich das Profil von Stelli1 an!   Senden Sie eine Private Message an Stelli1  Schreiben Sie einen Gästebucheintrag für Stelli1

Beiträge: 1526
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 02. Feb. 2006 13:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hallo Sven,

da bist du nicht alleine. (mit der labilen Fassung)
Da tun wir uns zusammen. 

Hier einige Anmerkungen

Code:

''''
' Excel als Verweis einbinden !!!
Dim ExcelApp As excel.application
Dim ExcelWb As excel.workbook
Dim i As Integer
Dim AWSatz As AcadSelectionSet
'''
dim ExcelWorksheet as excel.worksheet
dim entity as acadentity
dim Block_Attribute as variant
dim Attribut as acadattributreference

Public Sub CoordEntry()
    Set ExcelApp = CreateObject("Excel.Application")
    ExcelApp.Visible = True
    Set ExcelWb = ExcelApp.workbooks.Open("C:\Test\Datenbank.xls")
    '''
    set excel.worksheet = excelwb.activesheet
   
    '''Set AWSatz = ThisDrawing.SelectionSets
    on error resume next
    Set AWSatz = ThisDrawing.SelectionSets ("Myselset")
    if err.number <> 0 then
      Set AWSatz = ThisDrawing.SelectionSets.add ("Myselset")
    end if
    on error goto 0

    ' Hier nur selectset füllen z.b
    Awsatz.selectonscreen


    for each entity in awsatz
        If Entity.ObjectName = "IAcadBlockreferenz" Then
            If Entity.HasAttributes = True Then
                debug.print hat Attributte
                'MsgBox "Klappt"
                Block_Attribute = Entity.getattributes
                for i= Lbound(Block_attribute) to uBound(Block_attribute)
                    set Attribut = Block_attribute(i)
                    debug.print Attriut.Textstring
                next i

            End If
        End If
    next entity

End Sub



sind ungetestet. Aber F1 an der Stelle sollte erst mal helfen.

Stelli

------------------
Warum lisp'eln wenn's auch anders geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

erstellt am: 06. Feb. 2006 09:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Stelli, Hallo Forum!
Ich habe nochmal ein paar Anfängerfragen auf Deine Hilfestellung. Warum muss ich Excel als Verweis einbinden? Welchen Vorteil bringt mir das? Einen Verweis erzeuge ich mit "With...End With" oder? Wie rufe ich dann diesen wieder auf?
Meine Auswahl der Blöcke möchte ich eigentlich automatisch vornehmen lassen und nicht per Fenster oder ähnlichem wählen. Wofür steht in Deinem Fall "Myselect"?
Vielen Dank für Eure Mühe!
Gruß Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Stelli1
Moderator
Verm.-Ing.


Sehen Sie sich das Profil von Stelli1 an!   Senden Sie eine Private Message an Stelli1  Schreiben Sie einen Gästebucheintrag für Stelli1

Beiträge: 1526
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 06. Feb. 2006 11:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hallo Sven,

mit einem Verweis wird auf eine externe Bibliothek verwiesen.
Mit dem Verweis hat man Zugriff auf dessen Objektmodel.
Damit kannst du die darin enthaltenen Objekte und Datentypen deklarieren. Ein weiterer Vorteil ist die Kontexteingabehilde im Editor. Verweis und Projekt/Verweise der VBE.

Mit einem Selektionset (AWSATZ) kannst du Teile (Auswahl) deiner Zeichnung bearbeiten. Anstatt SelectOnScreen gibt es auch die Möglichkeit alle Elemente mit einer Eigenschaft (Block) in eine Auswahl zu bringen.

Alternativ kannst du natürlich auch alle Elemente im Modelspace untersuchen.

For Each Entity in Thisdrawing.Modelspace

Stelli

------------------
Warum lisp'eln wenn's auch anders geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 06. Feb. 2006 11:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hi Sven,

hier mal ansatzweise der Code mit late Binding und Filter

Code:

Dim ExcelApp As Object
Dim ExcelWb As Object
Dim i As Integer
Dim AWSatz As AcadSelectionSet
Dim ExcelWorksheet As Object
Dim entity As AcadEntity
Dim Block_Attribute As Variant
'Dim Attribut As AcadAttribute

Public Sub CoordEntry()
    Dim a&
    Set ExcelApp = CreateObject("Excel.Application")
    ExcelApp.Visible = True
    Set ExcelWb = ExcelApp.workbooks.Open("d:mappe1.xls")
    Set ExcelWorksheet = ExcelWb.activesheet
 
    '''Set AWSatz = ThisDrawing.SelectionSets
    On Error Resume Next
    Set AWSatz = ThisDrawing.SelectionSets("Myselset")
    If Err.Number <> 0 Then
      Set AWSatz = ThisDrawing.SelectionSets.Add("Myselset")
    End If
    On Error GoTo 0

    ' alle Blockrefs wählen
    Dim FType%(0), FData(0)
    FType(0) = 0: FData(0) = "INSERT"
    AWSatz.Select acSelectionSetAll, , , FType, FData

    For Each entity In AWSatz
        If entity.HasAttributes = True Then
            a = a + 1
            Debug.Print a, entity.Name
            Block_Attribute = entity.GetAttributes
            For i = LBound(Block_Attribute) To UBound(Block_Attribute)
                Debug.Print "", "", Block_Attribute(i).TextString
            Next i
        End If
    Next entity
End Sub



Gruss Nancy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

erstellt am: 08. Feb. 2006 13:48    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Forum!
Vielen Dank für Eure Hilfe, damit komme ich schon mal sehr viel weiter.
@startrek:
Ich habe nochmal einige Fragen zu Deiner Hilfe.
Dim FType%(0), FData(0)
FType(0) = 0: FData(0) = "INSERT"
Warum steht dort einmal FType% mit Prozent?

Was pasiert hier mit acSelectionSetAll?Wofür stehen die Leerstellen mit dem Komma? Ich habe nichts im Objektkatalog gefunden, dass man hier noch Parameter übergeben kann!
AWSatz.Select acSelectionSetAll, , , FType, FData

Wofür steht Myselset?
Set AWSatz = ThisDrawing.SelectionSets.Add("Myselset")

Welche Funktion haben hier die beiden "" Zeichen?
Debug.Print "", "", Block_Attribute(i).TextString

Viele Fragen, wie bei kleinen Kindern die gerade die Welt entdecken. Der Weg, den ich beschreiben will ist ja nicht mehr weit!?! Nur noch der Abgleich mit Excel und schon bin ich fertig.
Also schon mal vielen Dank für Eure Hilfe!

Gruß Sven

[Diese Nachricht wurde von Big Sven am 08. Feb. 2006 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 08. Feb. 2006 21:04    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hi Sven,

> Warum steht dort einmal FType% mit Prozent?

Ich - manchmal faul;-)
Also das % ist die Kurznotation für Integer, e.g. Dim i% == Dim i as integer

Code:
& == long
# == double
$ == string
! == single
@ == currency

> Was pasiert hier mit acSelectionSetAll?

lt. F2: Const acSelectionSetAll = 5 | Element von AutoCAD.AcSelect

Das ist 'nur' eine acadinterne Konstante, der kann man keine Paramater übergeben, sondern sie selbst ist ein Parameter. Übergeben wird hier an die 'select' Methode [hit mal F1]

Die Kommas stehen für weitere optionale Param's und da ich da nix reintun will, lass ich da leer. Das hängt einfach mit der Reihenfolge der erwarteten Parameter von Select zusammen.

Code:

'hier kommts auf die Reihenfolge an
'AWSatz.Select acSelectionSetAll, , , FType, FData

'hier nicht, dafür Bezeichner notwendig
AWSatz.Select Mode:=acSelectionSetAll, Filtertype:=FType, filterdata:=FData



Macht beides dasselbe, gehupft wie gesprungen, reine Geschmackssache halt.
Übrigens, wenn Du man mal die o.g. Zeile abtippst - also so richtig mit der Tastatur, nix copypaste, gell ?!;-) - kommt nach select so ein blassgelber Flaggentooltip ...

> Wofür steht Myselset?
> Set AWSatz = ThisDrawing.SelectionSets.Add("Myselset")

Hmm ..., das ist einfach der Name des Selectionset.
Das AcadSelectionsets[Pl.]-Object besteht ja aus ner Art Collection von mehreren Selectionset[Sing.]-Objecten, und wenn man nun via .Add(Name) der Collection eins hinzufügt, dient der Name sozusagen als Index, damit man weiss, wie man es später ansprechen kann. Ist also nix weiter als eine Art Container.
Wenn man vor End Sub den Container via AWSatz.delete entsorgt, wird das Element aus der Collection gelöscht, und man kann denselben Namen wieder verwenden, ansonsten gibts nen Error.
Wie man das händelt ohne irgendwann bei mySelSet99 anzukommen, macht jeder bissel anders.
Manche löschen direkt in einem Errorhandler am Ende, manche lassens einfach zu Beginn krachen via resume next,
wenn's crasht > gibts den Namen - respektive das SSet schon und wird überschrieben, wenn nicht wird es angelegt.

> Welche Funktion haben hier die beiden "" Zeichen?
> Debug.Print "", "", Block_Attribute(i).TextString

Ohh, leider gar keine!     
Sorry, mein Fehler, das war nonsens, es spielt keine Rolle ob:

Debug.Print "", "", Block_Attribute(i).TextString
oder
Debug.Print , , Block_Attribute(i).TextString

ich wollte nur die Attributes etwas einrücken, zwecks der Lesbarkeit im DFenster. Und das , [Komma] bewirkt da sowas wie ein 'Tab'.

So, reicht erstmal für heute - ich hoffe ich konnte etwas erleuchten und nicht noch darker machen, was sowieso schon dark ist;-)

Gruss Nancy

[Diese Nachricht wurde von startrek am 08. Feb. 2006 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

erstellt am: 09. Feb. 2006 16:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Nancy!

Vielen Dank für Deine tollen Erklärungen. So wird es für mich VBA-Neuling auch verständlich.
Ich habe mal ein bischen weitergemacht (ich habe einfach zu wenig Zeit) und stehe jetz vor folgenden Problem:
Nachdem ich alle Blöcke durchforste und den richtigen herausgesucht habe, wähle ich das Attribut und möchte es in Excel in einer bestimmten Spalte suchen. Ich bin aber anscheinend nicht in meiner Exceldatei, die ich am Anfang öffne! Wie wechsel ich zwischen ACAD und Excel?
Wie ist eigentlich der eleganteste Weg die Daten zwischen ACAD<=>Excel zu übertragen? Über die Zwischenablage oder?
Code:
Dim ExcelApp As Object
Dim ExcelWb As Object
Dim i As Integer
Dim AWSatz As AcadSelectionSet
Dim ExcelWorksheet As Object
Dim Entity As AcadEntity
Dim Block_Attribute As Variant
Dim SuchText As String
Dim SuchKblNr As String

Public Sub CoordEntry()
    Set ExcelApp = CreateObject("Excel.Application")
    ExcelApp.Visible = True
    Set ExcelWb = ExcelApp.workbooks.Open("C:\Test\Datenbank.xls")
    Set ExcelWorksheet = ExcelWb.activesheet
 
    On Error Resume Next
    Set AWSatz = ThisDrawing.SelectionSets("Myselset")
    If Err.Number <> 0 Then
      Set AWSatz = ThisDrawing.SelectionSets.Add("Myselset")
    End If
    On Error GoTo 0

    ' alle Blockrefs wählen
    Dim FType(0) As Integer, FData(0)
    FType(0) = 0: FData(0) = "INSERT"
    AWSatz.Select acSelectionSetAll, , , FType, FData
    For Each Entity In AWSatz
        If Entity.HasAttributes = True Then
            'Blocknamenüberprüfung
            If Left(Entity.Name, 11) = "Kblnr_leer_" Then
                Block_Attribute = Entity.GetAttributes
                For i = LBound(Block_Attribute) To UBound(Block_Attribute)
                    If Block_Attribute(i).TagString = "KANR" Then 'Attributname
                        SuchKblNr = Block_Attribute(i).TextString
                        'Hier fehlt mir etwas
                        Columns("B:B").Select
                        Selection.Find(What:=SuchKblNr, After:=ActiveCell, LookIn:=xlFormulas, _
                            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                            MatchCase:=False, SearchFormat:=False).Activate
                    End If
                Next i
            End If
        End If
    Next Entity
End Sub
Vielen Dank für die Hilfe!
Gruß Sven

[Diese Nachricht wurde von Big Sven am 09. Feb. 2006 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 09. Feb. 2006 22:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hi Sven,

jep, Du bist irgendwie nicht in deiner Exceldatei, sondern ganz konkret in Acad.
Soll heissen, du musst jedesmal!, wenn du auf ein Excelobjekt, -methode zugreifst,
auch darauf referenzieren oder anders, überall wo xl-Object davor steht, ist auch xl-Object drin. ;-)

> Columns("B:B").select

hier zB., damit weiss ja Acad gar nix anzufangen, es gibt ja da kein 'Columns()' in Acad, richtig muss es also heissen:

ExcelWorksheet.Columns("B:B") ...

zu dem .select lass' ich mich aber jetzt nicht aus, nur soviel ---> is ne gaaaaaaanz schlechte Idee in dem Fall,
man kann fast jedes Excelobjekt _ohne_ select ansprechen und lebt damit um einiges ruhiger;-)

Ansonsten s.u., allerdings weiss ich jetzt nicht, was du weiter vorhast mit der Tabelle.

Gruss Nancy

Code:

Dim ExcelApp As Object
Dim ExcelWb As Object
Dim i As Integer
Dim AWSatz As AcadSelectionSet
Dim ExcelWorksheet As Object
Dim Entity As AcadEntity
Dim Block_Attribute As Variant
Dim SuchKblNr As String
Dim flag As Boolean

Public Sub CoordEntry()
    Set ExcelApp = CreateObject("Excel.Application")
    'ExcelApp.Visible = True
    Set ExcelWb = ExcelApp.workbooks.Open("d:\mappe1.xls")
    Set ExcelWorksheet = ExcelWb.sheets("Tabelle1") 'activesheet

    On Error Resume Next
    Set AWSatz = ThisDrawing.SelectionSets("Myselset")
    If Err.Number <> 0 Then
      Set AWSatz = ThisDrawing.SelectionSets.Add("Myselset")
    End If
    On Error GoTo 0

    ' alle Blockrefs wählen
    Dim FType(0) As Integer, FData(0)
    FType(0) = 0: FData(0) = "INSERT"
    AWSatz.Select acSelectionSetAll, , , FType, FData
    For Each Entity In AWSatz
        If Entity.HasAttributes Then
            'Blocknamenüberprüfung
            If Left(Entity.Name, 11) = "Kblnr_leer_" Then
                Block_Attribute = Entity.GetAttributes
                For i = LBound(Block_Attribute) To UBound(Block_Attribute)
                    If Block_Attribute(i).TagString = "KANR" Then 'Attributname
                        SuchKblNr = Block_Attribute(i).TextString
                        'hier auf das Excel-Objekt beziehen!!!
                        MsgBox SuchKblNr & " found in Range: " & _
ExcelWorksheet.Columns("B:B").Find(What:=SuchKblNr).address
                        flag = True
                        GoTo ende
                    End If
                Next i
            End If
        End If
    Next Entity
ende:
    If Not flag Then MsgBox "nix gefunden"
    ExcelApp.Quit
    Set ExcelApp = Nothing: Set ExcelWb = Nothing: Set ExcelWorksheet = Nothing
End Sub


[Diese Nachricht wurde von startrek am 09. Feb. 2006 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 09. Feb. 2006 23:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Ich nochmal Sven,

beinahe vergessen, deine Frage:

> Wie ist eigentlich der eleganteste Weg die Daten zwischen ACAD<=>Excel zu übertragen?
> Über die Zwischenablage oder?

Gute Frage, hmm sollte man denke von Fall zu Fall entscheiden.
Die Zwischenablage ist sehr sehr schnell, aber du arbeitest da ausschliesslich mit einem String im Endeffekt.
Effektiv hinsichtlich der Performance sind auch Arrays, zumal die Ranges sowieso Arrays sind.

Ich weiss nicht, evtl. wär es eine Überlegung wert, ob man lieber aus Acad to Excel schreibt,
oder aus Excel to Acad, das kommt aber immer drauf an was man denn eigentlich machen will.

Wenn Du wirklich nur etwas vergleichen/abgleichen willst, hmm dann würd ich das ganze unter Excel schreiben
und acad gar nicht erst öffnen, da bist um einiges schneller.
Aber stop, ich schreib sachen, hab ich noch gar nicht probiert obs geht, mach ich morgen mal;-)

lg Nancy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

erstellt am: 10. Feb. 2006 13:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Nancy,
leider bin ich heute noch nicht weiter gekommen, aber vielleicht nächste Woche.
Also mein Progamm soll von ACAD-Blöcken einige Attribute auslesen und in meine Excel Datenbank schreiben. Es handelt sich dabei um Querverweise von einer Zeichnung zur anderen. Im Verweis selber soll später der Inhalt mehrerer Attribute zusammengeführt werden (Zeichnungsnr., Geräteanschluss, Ort). Das heißt also, dass ich leider auch wieder Infos aus der Excel-Datenbank herausbekommen möchte um sie mit der gerade geöffneten DWG abzugleichen. Das wäre also die Kurzbeschreibung meines Vorhabens.
Weiß eigentlich jemand, wie man den Dateinamen der aktuell geöffneten Datei herausbekomme?
Schönes WE!

Gruß Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

HP ZBook
Intel Core 12.Gen i7 2,3GHz
32GB RAM
Windows 11 Pro
AutoCAD 2024

erstellt am: 14. Feb. 2006 15:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


Datenbank.zip

 
Hallo Forum!
Jetzt bin ich mit dem ersten Teil meines Ausfluges in die Welt von VBA fast fertig und habe nochmal ein paar Fragen. Erstmal meine Progammbeschreibung:
Mein Programm soll aus einer bestehenden Exceldatenbank (Anlagenbeispiel) anhand einer Kabelnummer (Spalte 2) mit den Blöcken der aktuell geöffneten DWG vergleichen. Wenn diese übereinstimmt soll überprüft werden, ob sich der Eintrag in dieser Datei oder der dazugehörigen DWG stammt. Der Dateiname steht in Spalte 1. Stimmt diese nicht überein, so befinde ich mich in der richtigen Zeile und hole mir die Daten aus der Liste (Spalten D-H), um sie in den entsprechenden Attributen meines Querverweisblockes (Attributnamen: KANR, GERAET_1, EINBAUORT_1, TODEVISE_1, JTYPE_1, COMMENT_1, wsw.) einzufügen.
Das Ganze funktiniert schon recht gut. Da ich mich aber mit VBA nicht so sehr auskenne, kommt mir meine Lösung etwas umständlich vor. Vielleicht kann man hier oder da noch etwas optimieren oder Fehlerquellen ausschließen.
Was passiert eigentlich mit meinen Variablen nachdem das Prg abgearbeitet wurde? In Lisp haben diese noch ihren Wert, solange ich sie nicht zurücksetze. So auch in VBA?

Ich weiß, dass es viel Mühe macht meinen Lösungsansatz nachzuvollziehen, ich bin aber für jede Hilfestellung dankbar!!!

Gruß Sven

[Diese Nachricht wurde von Big Sven am 14. Feb. 2006 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

erstellt am: 15. Feb. 2006 16:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Nancy!

Ich bin gerade bei der Progammoptimierung und habe nochmal eine Frage zum Bilden des Auswahlsatzes:

Dim FType(0) As Integer, FData(0)
FType(0) = 0: FData(0) = "INSERT"
AWSatz.Select acSelectionSetAll, , , FType, FData

Was kann man bei FType noch eintragen? Hintergrund: Ich suche eigentlich nur einen bestimmten Blocknamen, der auf einem bestimmten Layer liegt. Das würde meinen Auswahlsatz erheblich verkleinern und mich wesentlich weniger Zeit kosten.

Gruß Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 15. Feb. 2006 16:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hmm, also mit dem Namen bin ich überfragt, aber so in etwa kannst Du den Layer eingrenzen:
Code:

' alle Blockrefs auf "myLayer" wählen
Dim FType%(1), FData(1)

FType(0) = 0: FData(0) = "INSERT"
FType(1) = 8: FData(1) = "myLayer"

AWSatz.Select acSelectionSetAll, , , FType, FData



HTHHope this helps (Hoffe, es hilft weiter), Nancy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 15. Feb. 2006 16:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

ich habs:
Code:

FType(0) = 0: FData(0) = "INSERT"
FType(1) = 2: FData(1) = "aaa" 'by Name


CUSee You Nancy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

erstellt am: 15. Feb. 2006 17:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo!
Super das ist genau das, was ich gesucht habe!!! Ich habe auch gerade etwas darüber gefunden. Gibt es eigentlich irgendwo eine komplette, zusammenhängende Liste aller DXF-Gruppencodes?
Jetzt muss ich nur noch den Rest optimieren, damit es noch viel schneller geht.
Vielen Dank!!!

Gruß Sven

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Big Sven
Mitglied
Techn. Angestellter


Sehen Sie sich das Profil von Big Sven an!   Senden Sie eine Private Message an Big Sven  Schreiben Sie einen Gästebucheintrag für Big Sven

Beiträge: 133
Registriert: 14.09.2005

HP ZBook
Intel Core 12.Gen i7 2,3GHz
32GB RAM
Windows 11 Pro
AutoCAD 2024

erstellt am: 20. Feb. 2006 14:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Forum!
Ich stecke einmal wieder fest. Ich möchte nun Eintragungen in meine Datenbank vornehmen. Dafür muss ich vorher alle Einträge der aktuellen DWG herauslöschen Es funktioniert leider nur nicht.

Ich bekomme nach der Zeile: Set found = ...).Activate eine Meldung, dass die Typen unverträglich sind. Nehme ich es heraus stoppt das Prg bei: ExcelWS.Range(findeExcelZeile, 1).Select und meldet einen Anwendung- oder Objektdefinierter Fehler.

Hat jemand einen Tipp für mich?

Gruß Sven

Code:
Set ExcelWb = ExcelApp.workbooks.Open("C:\Test\Datenbank.xls")
Set ExcelWS = ExcelWb.activesheet
...

NeuDatenbank ExcelApp, ExcelWS, Left(ThisDrawing.Name, 8)
...

Private Function NeuDatenbank(ExcelApp, ExcelWS, Zeichnung)
    Dim found
    ExcelWS.Columns("A:A").Select
    ExcelWS.cells(1, 1).Activate
   
    Set found = ExcelApp.Selection.Find(What:=Zeichnung, After:=ExcelApp.ActiveCell, _
        MatchCase:=False, SearchFormat:=False).Activate
       
    While Not found Is Nothing
        If Zeichnung = ExcelWS.cells(found.Row, 1) Then
            findeExcelZeile = found.Row
            ExcelWS.Range(findeExcelZeile, 1).Select
            ExcelWS.Selection.EntireRow.Delete
        End If
       
        Set found = ExcelApp.Selection.FindNext(found)
    Wend
End Function

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 20. Feb. 2006 15:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Big Sven 10 Unities + Antwort hilfreich

Hi Sven,

untiges ist ungetestet, hab nur mal mit der groben Harke die selects entfernt;-)

Zum ersten Error: Set found = ...).Activate

Mit Set found = setzt du einen Objectpointer und du erhälst als Rückgabe ein RangeObjekt. Du schiesst hier aber gleich die Aktivate Methode hinterher in der Zeile, das geht so nicht, wenn dann geht maximal sowas:

Code:

Set found = ExcelApp.Selection.Find(What:=Zeichnung)
found.activate

BTWBy the way (So nebenbei bemerkt), wenn deine Mappe/Excel nicht visible und nicht aktiv sind, geht der ganze select/activate-******* eh in die Hosen,
am besten du hütest dich davor, wie der Teufel das Weihwasser;-)

Gruss Nancy
--

Code:

Private Function NeuDatenbank(ExcelApp, ExcelWS, Zeichnung)
    Dim found as range
    Set found = ExcelWS.Columns("A:A").Find(What:=Zeichnung)
     
    While Not found Is Nothing
        If Zeichnung = ExcelWS.cells(found.Row, 1) Then ExcelWS.rows(found.row).Delete
        Set found = ExcelApp.Selection.FindNext(found)
    Wend
End Function

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz