Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Regel auf alle geöffnete Dateien

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
Autor Thema:  Regel auf alle geöffnete Dateien (1526 / mal gelesen)
Big-Daddy
Mitglied
Konstrukteur


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

Beiträge: 51
Registriert: 08.04.2015

IV 2022 Prof.

erstellt am: 24. Okt. 2019 11:24    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 zusammen,

ich versuche gerade eine Ilogic Regel zu basteln die durch alle geöffnete Dateien in Inventor (iam und ipt) durchläuft.

Die Aufgabe der Regel ist eine Nummer aus Excel auszulesen und in die Iproperties zu schreiben. Diese läuft bisher auch tadellos. Sobald ich eine Schleife versuche zu Programmieren kommt eine Fehlermeldung.


Code:
Dim Doc As Document

For Each Doc In ThisApplication.Documents
    Doc.Activate

If iProperties.Value("Project", "Part Number") = "" Then
Dim oDoc As Document = ThisDoc.Document
oDoc.Close
Else

V = iProperties.Value("Project", "Part Number")
i = GoExcel.FindRow("D:\Artikel.xlsx", "Systemaufbau", "gebogen", "=", v)
i2= GoExcel.CurrentRowValue("gepulvert")

If i2 = "106165" Then
MessageBox.Show("Fehler", "Fehler")
iProperties.Value("Project", "Stock Number") = ""
End If

iProperties.Value("Project", "Stock Number") = i2

ThisDoc.Save

Dim oDoc As Document = ThisDoc.Document
oDoc.Close

End If
Next



Weiß jemand woran es liegt und hat mir eine Lösung.

Vielen Dank     

[Diese Nachricht wurde von Big-Daddy am 24. Okt. 2019 editiert.]

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

Meierjo
Mitglied



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

Beiträge: 358
Registriert: 20.08.2003

erstellt am: 25. Okt. 2019 06:58    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-Daddy 10 Unities + Antwort hilfreich

Hallo

Versuch mal die Zeile
Doc.Activate

in

Call Doc.activate
zu ändern?

Gruss

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

Big-Daddy
Mitglied
Konstrukteur


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

Beiträge: 51
Registriert: 08.04.2015

IV 2022 Prof.

erstellt am: 25. Okt. 2019 08: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 Meierjo,

leider auch ohne Erfolg.

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 25. Okt. 2019 09: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 Nur für Big-Daddy 10 Unities + Antwort hilfreich

Könnte es an der Verwendung von ThisDoc liegen? Ist das nicht ein Verweis auf das Dokument, das die Regel enthält?
Ich würde versuchen, alle Verwendungen von ThisDoc und auch oDoc zu ersetzen durch Doc (deine laufvariable der Schleife).
Kann es gerade nicht selbst ausprobieren...

------------------
Gruß KraBBy

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

Meierjo
Mitglied



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

Beiträge: 358
Registriert: 20.08.2003

erstellt am: 25. Okt. 2019 12: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-Daddy 10 Unities + Antwort hilfreich

Hallo

Also, bei mir funktioniert's mit call ....

Wie lautet denn die Fehlermeldung bei dir??

Gruss

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

Big-Daddy
Mitglied
Konstrukteur


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

Beiträge: 51
Registriert: 08.04.2015

IV 2022 Prof.

erstellt am: 25. Okt. 2019 14: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


Fehler.PNG

 
@ Meierjo siehe Anhang

Krabby ich hab versucht es soweit umzusetzten was du mir vorgeschlagen hast.

Code:

Dim oDoc As Document

For Each oDoc In ThisApplication.Documents
  oDoc.Activate
 
If iProperties.Value("Project", "Part Number") = "" Then
oDoc.Close
Else

V = iProperties.Value("Project", "Part Number")
i = GoExcel.FindRow("D:\Artikel.xlsx", "Schubkastendoppel", "gebogen", "=", V)
i2= GoExcel.CurrentRowValue("gepulvert")

iProperties.Value("Project", "Stock Number") = i2

ThisDoc.Save
oDoc.Close

End If
Next


Mit diesem Code läuft die Regel durch, aber er schreibt mir nur die erste Datei (also die Datei in der ich die Regel starte) etwas in die Iproperties.
Die anderen geöffneten Bauteile schließt er einfach.
Ich vermute es ist die erste IF Abfrage, aber diese dürfte nicht greifen da bei allen geöffneten Bauteilen die Teilenummer gefüllt ist.

Darauf hin habe ich die Regel leicht geändert. Zeile 3 ist anders:


Code:
Dim oDoc As Document

For Each oDoc In ThisApplication.Documents
    oDoc = ThisApplication.ActiveDocument

If iProperties.Value("Project", "Part Number") = "" Then
oDoc.Close
Else

V = iProperties.Value("Project", "Part Number")
i = GoExcel.FindRow("D:\Artikel.xlsx", "Schubkastendoppel", "gebogen", "=", V)
i2= GoExcel.CurrentRowValue("gepulvert")

iProperties.Value("Project", "Stock Number") = i2

ThisDoc.Save
oDoc.Close

End If
Next


Da kommt die gleiche Fehlermeldung, siehe Anhang.
Ach ja nicht verwirren lassen, ich hab übersichtshalber die zweite If Abfrage weggelassen zum testen.

[Diese Nachricht wurde von Big-Daddy am 25. Okt. 2019 editiert.]

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 26. Okt. 2019 10:17    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-Daddy 10 Unities + Antwort hilfreich

Könnte es daran liegen, dass nur das erste Dokument gespeichert wird und die anderen nicht?
ThisDoc.Save -> oDoc.Save
Könntest du vorher auch ausprobieren, indem du die Zeile mit dem .Close auskommentierst und die iProp ansiehst.
Kann es leider nicht selbst ausprobieren, deshalb rate ich nur rum.

Noch ein kleiner Hinweis: Solche Sachen wie "ich vermute es liegt an der x.ten IF" kann man überprüfen, durch eine MsgBox in der jedem Zweig des Programms.
Könnte man sogar dauerhaft im Code lassen durch
Const bDebug As Boolean = true ' Schalter für "Debug-Modus" in erster Zeile
[... ]
If bDebug Then MsgBox("if x")

------------------
Gruß KraBBy

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

Big-Daddy
Mitglied
Konstrukteur


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

Beiträge: 51
Registriert: 08.04.2015

IV 2022 Prof.

erstellt am: 28. Okt. 2019 07:57    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

Guten Morgen Krabby,

die Idee war nicht schlecht, nur leider kommt die gleiche Fehlermeldung wie letzte Woche.
Ohne die Schleife schreibt er die Werte aus der Excel Tabelle rein, an der Excel Tabelle liegt es also nicht (wollte es nur nochmal testen)

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 28. Okt. 2019 15:34    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-Daddy 10 Unities + Antwort hilfreich

nun konnte ich tatsächlich mal ein wenig rumprobieren.
Ich denke, dass die Verwendung von
iProperties.Value(...)
zum lesen und schreiben nicht so funktioniert wie erwartet. Das liefert wohl immer das iProperty aus dem Dokument mit der Regel (dh. mit jedem Durchlauf der Schleife wird immer ein iProp vom zuerst geöffneten Dokument gelesen und geschrieben)
Zumindest in meinem kleinen Test, bei dem ich das oDoc.Close auskommentiert habe (kA, was sonst rauskommen würde, vielleicht "Dein Fehler")

Außerdem bin ich darüber gestolpert, dass ThisApplication.Documents alle Docs aus dem Arbeitsspeicher auflistet. Z.B. bei geöffneter Baugruppe sind die Einzelteile enthalten. Bei denen schlägt dann das oDoc.Activate fehl (auch das .Close wird wohl nicht klappen)

Jedenfalls bin ich bei der Erkenntnis angelangt, dass es besser wäre, sich vom Document zum iProperty zu hangeln. Hab ich schon in VBA in Verwendung, wird auch in iLogic klappen. So scheint es auch zu sein, das ganze wird nur eben recht länglich. Im folgenden das Ergebnis.

Code:
Sub Main()
Dim oDoc As Document
For Each oDoc In ThisApplication.Documents
'oDoc.Activate 'nicht mehr nötig
Call T1(oDoc)
Next
End Sub

Sub T1 (oDoc as Document)

Dim V as String = ReadiProperty(oDoc, "Part Number", 3 )
MsgBox (V)
'If iProperties.Value("Project", "Part Number") = "" Then
If V = "" Then
'oDoc.Close
MsgBox("keine PartNo. bei" & vbCrLf & oDoc.DisplayName)
Else
'V = iProperties.Value("Project", "Part Number") 'oben schon gelesen
i = GoExcel.FindRow("C:\TEMP\Test.xlsx", "Schubkastendoppel", "gebogen", "=", V)
i2= GoExcel.CurrentRowValue("gepulvert")

'iProperties.Value("Project", "Stock Number") = i2
Dim ret As Boolean = WriteiProperty(oDoc, "Stock Number", i2, 3)
If ret Then
MsgBox("es wurde was geschrieben bei" & vbCrLf _
& oDoc.DisplayName & vbCrLf _
& V & vbCrLf _
& i2)
Else
MsgBox("WriteiProperty lieferte False zurück, Prop. nicht gefunden")
End If

'oDoc.Save
'oDoc.Close

End If
End Sub

'-------------------- alles nachfolgende, um iProp zu lesen / schreiben ------
' (kein guter Stil, gerade im Hinblick auf die Möglichkeiten mit vb.net
'  alles nur schnell aus VBA kopiert und hier zum laufen gebracht
' z.B. "On Error" sollte nicht mehr verwendet werden)

Public Enum iPropSetNameEnum
' im Grunde hier überflüssig, hilft nur in VBA mit Intellisense
    IVSumInfo = 1
    DocSumInfo = 2
    DesignTrackProp = 3
    UserDefProp = 4
End Enum

Public Function ReadiProperty(ByRef doc As Document , _
ByRef PropertyName As String, Optional PropSet As iPropSetNameEnum = 0& ) As Object
'Wert aus iProp lesen
' aus beliebiegem PropertySet
' erstes gefundenes Element wird zurückgegeben (sollten mehrere existieren)
' wird der Name in keinem Set gefunden, Rückgabe -> ""
'  Optional: PropSetName: Es wird nur in dem angegebenen PropSet gesucht

   
    'Default-Rückgabewert (wenn Prop nicht existiert)
    ReadiProperty = ""
   
    'Optional PropSet auswerten
    Dim bAllSets As Boolean, PropSetName As String
    If 0 = PropSet Then
        bAllSets = True
    Else
        bAllSets = False
        PropSetName = Get_iPropSetName(PropSet)
    End If
    Dim bSetFound As Boolean    'für Info, ob angegebenes Set gefunden wurde
    bSetFound = False
   
    Dim prop As Inventor.Property
    Dim customPropSet As PropertySet
    'Set customPropSet = Doc.PropertySets.Item("Inventor User Defined Properties")
   
    For Each customPropSet In doc.PropertySets  'Schleife durch alle PropSets
        If bAllSets Or customPropSet.Name = PropSetName Then
            bSetFound = True
            ' Get the existing property, if it exists.
            On Error Resume Next
            prop = customPropSet.Item(PropertyName)
            ' Check to see if the above call failed.  If it failed then the property doesn't exist.
            If Err.Number <> 0 Then
                ' Failed to get the existing property
            Else
                'Prop existiert, Wert lesen
                ReadiProperty = prop.Value
                Exit For
            End If
            On Error Goto 0 'setzt auch Err zurück
        End If
    Next 'propSet
   
    'Auswertung bei angegebenem PropSet
    If Not bAllSets Then
        If bSetFound Then
            'angegebenes Set wurde gefunden
        Else
            'angegebenes Set wurde NICHT gefunden
            MsgBox( "Das gesuchte iProperty " & vbCrLf _
                & vbTab & PropertyName & vbCrLf _
                & "konnte nicht gefunden werden, weil schon das angegebene Prop.Set" & vbCrLf _
                & vbTab & PropSetName & vbCrLf _
                & "nicht existiert!", vbInformation, "Info")
        End If
    End If
   
    'Aufräumen (ergänzt)
    On Error Goto 0
    customPropSet = Nothing
    prop = Nothing
End Function

Private Function Get_iPropSetName(e As iPropSetNameEnum) As String
' das ist der Versuch die Propsets greifbar zu machen
' in Verbindung mit obigem Enumerator
'
'KraBBy 15.10.2018

    Const IVSumInfo As String = "Inventor Summary Information"
    Const DocSumInfo As String = "Inventor Document Summary Information"
    Const DesignTrackProp As String = "Design Tracking Properties"
    Const UserDefProp As String = "Inventor User Defined Properties"
   
    Select Case e
    Case iPropSetNameEnum.DesignTrackProp
        Get_iPropSetName = DesignTrackProp
    Case iPropSetNameEnum.DocSumInfo
        Get_iPropSetName = DocSumInfo
    Case iPropSetNameEnum.IVSumInfo
        Get_iPropSetName = IVSumInfo
    Case iPropSetNameEnum.UserDefProp
        Get_iPropSetName = UserDefProp
    Case Else
        'sollte nicht auftreten
        MsgBox( "vmtl. Fehler in Code!" & vbCrLf _
            & "Case Else in Function Get_iPropSetName", vbCritical, "Fehler!?")
        Get_iPropSetName = ""
    End Select
   
End Function

Public Function WriteiProperty(ByRef doc As Document , _
ByRef PropertyName As String, PropVal as Object, Optional PropSet As iPropSetNameEnum = 0& ) As Boolean
'Wert in iProp schreiben
' in beliebiegem PropertySet
' erstes gefundenes Element wird beschrieben (sollten mehrere existieren)
' wird der Name in keinem Set gefunden, Rückgabe -> False
'  Optional: PropSetName: Es wird nur in dem angegebenen PropSet gesucht

   
    'Default-Rückgabewert (wenn Prop nicht existiert)
    WriteiProperty = False
   
    'Optional PropSet auswerten
    Dim bAllSets As Boolean, PropSetName As String
    If 0 = PropSet Then
        bAllSets = True
    Else
        bAllSets = False
        PropSetName = Get_iPropSetName(PropSet)
    End If
    Dim bSetFound As Boolean    'für Info, ob angegebenes Set gefunden wurde
    bSetFound = False
   
    Dim prop As Inventor.Property
    Dim customPropSet As PropertySet
   
    For Each customPropSet In doc.PropertySets  'Schleife durch alle PropSets
        If bAllSets Or customPropSet.Name = PropSetName Then
            bSetFound = True
            ' Get the existing property, if it exists.
            On Error Resume Next
            prop = customPropSet.Item(PropertyName)
            ' Check to see if the above call failed.  If it failed then the property doesn't exist.
            If Err.Number <> 0 Then
                ' Failed to get the existing property
            Else
                'Prop existiert, Wert schreiben
                prop.Value = PropVal
WriteiProperty = True
                Exit For
            End If
            On Error Goto 0 'setzt auch Err zurück
        End If
    Next 'propSet
   
    'Auswertung bei angegebenem PropSet
    If Not bAllSets Then
        If bSetFound Then
            'angegebenes Set wurde gefunden
        Else
            'angegebenes Set wurde NICHT gefunden
            MsgBox( "Das gesuchte iProperty " & vbCrLf _
                & vbTab & PropertyName & vbCrLf _
                & "konnte nicht gefunden werden, weil schon das angegebene Prop.Set" & vbCrLf _
                & vbTab & PropSetName & vbCrLf _
                & "nicht existiert!", vbInformation, "Info")
        End If
    End If
   
    'Aufräumen
    On Error Goto 0
    customPropSet = Nothing
    prop = Nothing
End Function


------------------
Gruß KraBBy

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)2023 CAD.de | Impressum | Datenschutz