Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Befüllen einer Excel über verschiedene Subroutinen

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
Autor Thema:  Befüllen einer Excel über verschiedene Subroutinen (478 / mal gelesen)
Arth
Mitglied
Ingenieur - Entwicklung Karosseriestruktur

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

Beiträge: 4
Registriert: 19.09.2021

CATIA V5-6 Release 2020 - SP 3 - Hot Fix 9

erstellt am: 19. Sep. 2021 11: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 Kollegen    ,

ursprünglich war mein Ziel ein Catia Macro (CatScript) zu erstellen, welches mir den vollständigen Strukturbaum (Namen aller CatProducts -> Fügefolge) + einzelne Parameter (Material + Gewicht aus CatParts) ausliest und in eine Excel schreibt.

Leider kann ich den eigentlichen Algorithmus nicht ausarbeiten, da bereits das Beschreiben der Excel nicht so funktioniert wie ich gerne hätte.

Meine Code teilt besteht aktuell aus 2 Sub's. CatMain() & Test(test).
In der Main-Methode soll die Excel generiert und beschrieben werden.
In der Test-Methode werden die gesuchten Namen/Parameter ermittelt.

Der Einfachheit halber will ich erstmal nur den Namen der CatProducts in der Excel auflisten.

Aktuell wird meine Excel nur befüllt, wenn ich den Schreibbefehl in der Main-Methode ausführe.
Sobald ich die Codezeile

Code:
objSheet1.cells(2+testi)=lvlnProducts.Item(testi).Name
in die zweite Methode schreibe findet er die Excel (Fehler Object erforderlich).

Ich habe im Vorfeld versucht das Excel Objekt als Public zu setzen, was allerdings nur zu Laufzeitfehlern geführt hat.

Jetzt aber zu meiner eigentlichen Frage.
Wie schaffe ich es eine bereits geöffnete/erzeugte Excel über mehrere Methoden zu beschreiben?

Hoffe ich konnte mein Problem genau genug beschreiben :)

Viele Grüße

Mein vollständiger Code:

Code:

Sub CATMain()

' ************* Definition Variablen*****************

Dim mainProduct As ProductDocument
Set mainProduct = CATIA.ActiveDocument

Dim rootProduct As Product
Set rootProduct = mainProduct.Product

Dim lvlnProducts As Products
Set lvlnProducts = rootProduct.Products

' ************* Oeffnen vonm Excel und Anlegen der Ueberschriften*****************
Dim objExcel as Excel.Application
Set objExcel=CreateObject("Excel.Application")
objexcel.Visible=True
Set objWorkbook= objExcel.workbooks.Add()
Set objSheet1=objWorkbook.sheets.item(1)

objSheet1.cells(1,1)="Fuehrende Sachnummer"
objSheet1.Range("A1").ColumnWidth = 30

objSheet1.cells(1,2)="Sachnummer"
objSheet1.Range("B1").ColumnWidth = 30

objSheet1.cells(1,3)="Model-V5/Teilmodel-V5"
objSheet1.Range("C1").ColumnWidth = 30

objSheet1.cells(1,4)="Gewicht"
objSheet1.Range("D1").ColumnWidth = 30

objSheet1.cells(1,5)="Material"
objSheet1.Range("E1").ColumnWidth = 30


' ************* Befuellung der Excel*****************
Dim i As Integer
For i=1 to lvlnProducts.Count

Call Test(i)

Next

End Sub


Sub Test(testi)

Dim mainProduct As ProductDocument
Set mainProduct = CATIA.ActiveDocument

Dim rootProduct As Product
Set rootProduct = mainProduct.Product

Dim lvlnProducts As Products
Set lvlnProducts = rootProduct.Products

objSheet1.cells(2+testi)=lvlnProducts.Item(testi).Name

End Sub



[Diese Nachricht wurde von Arth am 19. Sep. 2021 editiert.]

[Diese Nachricht wurde von Arth am 19. Sep. 2021 editiert.]

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

bgrittmann
Moderator
Konstrukteur


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

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 19. Sep. 2021 12:02    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 Arth 10 Unities + Antwort hilfreich

Servus Arth

Willkommen im Forum.
Meine Ideen dazu:

  • zunächst die Daten/Struktur ermitteln und geeignet zwischenspeichern (Array, Dictonary, String, ...) und dann an ein Unterroutine übergeben die die Excel-Datei erstellt und mit den Daten befüllt
  • das Excel-Sheet (oder Mappe) an deine Unterroutine übergeben
  • Excel-Sheet als globale Variable/Objekt verwenden, dann kannst du diese überall verwenden
Die erste Variante ist meiner Ansicht nach die bessere. Dann hast du eine saubere Trennung der Funktionen.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

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

Arth
Mitglied
Ingenieur - Entwicklung Karosseriestruktur

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

Beiträge: 4
Registriert: 19.09.2021

CATIA V5-6 Release 2020 - SP 3 - Hot Fix 9

erstellt am: 19. Sep. 2021 12:11    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

Moin Bernd,

Vielen Dank für die schnelle Antwort & und die nette Begrüßung.
Die Idee: die Excel in einer eigenen Methode zu Erstellen und zu befüllen finde ich auch am besten, da ich kein Fan von globaler Programmierung bin.
Auch mit dem Hintergrund, dass hierbei die Ausführungszeit des Makros deutlich reduziert werden sollte.

Ich überarbeite mal meinen Code und gebe Bescheid, sobald ich erfolgreich (oder auch nicht   ) bin.

Viele Grüße

[Diese Nachricht wurde von Arth am 19. Sep. 2021 editiert.]

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

Arth
Mitglied
Ingenieur - Entwicklung Karosseriestruktur

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

Beiträge: 4
Registriert: 19.09.2021

CATIA V5-6 Release 2020 - SP 3 - Hot Fix 9

erstellt am: 19. Sep. 2021 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

Ok jetzt wird es wirklich seltsam 

Anstatt wie zuvor die Zellen zu befüllen erzeugt der folgende Code für jede Celle eine neue Exceldatei.
In meinem Beispiel sind 10 Sachnummern, welche dann erst nach der 10-ten Exceldatei richtig aufgelistet sind.

Da in der For-Schleife definitiv keine neue Excel erzeugt wird, sondern nur die Zellen befüllt werden, kann ich mir das Verhalten jetzt wirklich nicht mehr erklären.

Hätte jemand eine Idee bzw. eine Korrektur, damit nur eine Excel geöffnet und beschrieben wird?

Vielen Dank und viele Grüße 

Code:

Sub Excel(List, Anzahl)

' ************* Erzeugen einer Excel, Anlegen der Ueberschriften & Befuellen*****************
Dim objExcel as Excel.Application
Set objExcel=CreateObject("Excel.Application")
objexcel.Visible=True
Set objWorkbook= objExcel.workbooks.Add()
Set objSheet1=objWorkbook.sheets.item(1)

objSheet1.cells(1,1)="Fuehrende Sachnummer"
objSheet1.Range("A1").ColumnWidth = 30

objSheet1.cells(1,2)="Sachnummer"
objSheet1.Range("B1").ColumnWidth = 30

objSheet1.cells(1,3)="Model-V5/Teilmodel-V5"
objSheet1.Range("C1").ColumnWidth = 30

objSheet1.cells(1,4)="Gewicht"
objSheet1.Range("D1").ColumnWidth = 30

objSheet1.cells(1,5)="Material"
objSheet1.Range("E1").ColumnWidth = 30

Dim i As Integer
For i=1 to Anzahl

objSheet1.cells(2+i,2)=List(i-1)

Next

End Sub


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

bgrittmann
Moderator
Konstrukteur


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

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 19. Sep. 2021 13: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 Arth 10 Unities + Antwort hilfreich

Servus

Wie rufst du die Unterroutine auf? Ist dort eine Schleife die diese mehrfach aufruft?

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

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

Arth
Mitglied
Ingenieur - Entwicklung Karosseriestruktur

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

Beiträge: 4
Registriert: 19.09.2021

CATIA V5-6 Release 2020 - SP 3 - Hot Fix 9

erstellt am: 19. Sep. 2021 13:12    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

99% aller Fehler sitzen vor dem PC!
Auch hier war es der Fall 
Hatte die Codeschnipsel falsch zusammenkopiert.

Alt:

Code:

...
...
' ************* Befuellung der Liste/Array*****************

Dim sachnummerArray() as String
Redim sachnummerArray(lvlnProducts.Count)

Dim i As Integer

For i=1 to lvlnProducts.Count
sachnummerArray(i-1)=lvlnProducts.Item(i).Name
Call Excel(sachnummerArray, lvlnProducts.Count)
Next


End Sub


Neu:

Code:

...
...
' ************* Befuellung der Liste/Array*****************

Dim sachnummerArray() as String
Redim sachnummerArray(lvlnProducts.Count)

Dim i As Integer

For i=1 to lvlnProducts.Count
sachnummerArray(i-1)=lvlnProducts.Item(i).Name
Next

Call Excel(sachnummerArray, lvlnProducts.Count)

End Sub


Jetzt läuft alles wie es soll.
Vielen Dank Bernd  . Jetzt kann ich endlich mit dem eigentlichen Job beginnen

Beste Grüße

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