Hallo Forum!
Problem 1:
Ich möchte in Catia ein Makro erstellen (VBA), oder Catia per VBA ansteuern (geht auch aus Excel?). Immer wenn ich dazu in Catia eine Makrobibliothek öffnen oder anlgegen möchte, kommt ein Fehler, dass VBA nicht richtig installiert sei. Nach einiger Recherche habe ich folgendes herausgefunden:
1) Catia V5 R21 ist nicht zu VBA7, wie es mit unserem MS Office2010 ausgeliefert wird kompatibel. Das wäre erst ab R24 der Fall.
2) Der Support von Cenit hat meine Ahnung bestätigt, dass ich VBA6 benötige
3) Zusätzlich scheint Catia (da über Cenit angesteuert) nicht lokal registriert zu sein (was akaik eine weitere Fehlerquelle sein kann).
4) Der "Tick" Catia manuell zu registrieren über CNEXT.exe -register geht nicht, da ich mit der cmd-Zeile nicht auf den Serverpfad komme...
Kann ich VBA6 "nachinstallieren"? Laufen dann VBA6 und VBA7 parallel?
Kann ich Catia auch mittels VBA7 Makro aus Excel ansprechen?
Macht es Sinn, evtl. komplett auf VB.net zu wechseln?
Problem 2:
Eigentlich möchte ich gerne mittels VBA ein Makro erstellen, welches ein (bereits geöffnetes) CATproduct elementeweise durchgeht und mir in Abhängigkeit davon, ob es sich um ein CATproduct oder ein CATpart am aktuellen Punkt der Baumstruktur handelt, verschiedene Werte zurückgibt.
Als CATproduct den PartName und PartDefinition, als CATpart den Partname, Partdefinition, Oberfläche und Volumen.
Die abgefragten Werte sollen dann in ein Excel übertragen werden, wo sie mit weiteren Makros nachbearbeitet werden.
Da meine VBA-Kenntnisse nur rudimentär sind, habe ich mir aus allerlei Codeschnipseln was zusammengebastelt:
_____
Sub CATMain()
version = "1.0"
makroname = "Catia Datenexport"
'Excel instanzieren
Dim Excel As Object
Set Excel = GetObject(, "Excel.Application")
'Abfangen Fehler
If Err.Number <> 0 Then
Err.Clear
Set Excel = CreateObject("Excel.Application")
Else
Err.Clear
MsgBox "Please note you have to close Excel", vbCritical
Exit Sub
End If
'Excel Variablen Deklarieren
Set myworkbook = Excel.workbooks.Add
Excel.Worksheets.Add After:=Sheets(Sheets.Count)
Excel.ActiveWorksheet.Name = "Catia-Daten"
Excel.Application.Visible = True
' Datenübertragung an Excel
'Excel.ActiveWorksheet.Range...???
'Zellen formatieren
Excel.Range("A:A").ColumnWidth = 5
Excel.Range("B:B").ColumnWidth = 30
Excel.Range("C:L").ColumnWidth = 15
Excel.Range("A:L").Font.Name = "Arial"
Excel.Range("A:L").Font.Size = 10
'mehr Zellenformatierung
Excel.Range("1:1").Font.Bold = True
Excel.Range("1:1").RowHeight = 20
Excel.Range("1:1").Font.Size = 11
'Erste Reihe
Excel.Cells(1, 1) = "Materialnummer"
Excel.Cells(1, 2) = "Teilenummer"
Excel.Cells(1, 3) = "Name"
Excel.Cells(1, 4) = "Fläche"
Excel.Cells(1, 5) = "Volumen"
Ecxel.Cells(1, 6) = "Gewicht"
'CATIA Initialisierung
Dim objSPAWkb
Set objSPAWkb = CATIA.ActiveDocument.GetWorkbench("SPAWorkbench")
Dim Dkmnt As Document
Set Dkmnt = CATIA.ActiveDocument
Dim partDoc As Object
Set partDoc = CATIA.ActiveDocument.Part
Dim productDoc As Object
Set productDoc = CATIA.ActiveDocument.Product
Dim bodyNumber As Integer
bodyNumber = productDoc.Products.Count
Dim RwNum As Integer
RwNum = 1
'Schleife durch alle Baugruppen, Unterbaugruppen und Einzelteile
Dim i As Integer
'Zugriff auf Metadaten eines CATParts oder CATProducts über das Ankerobjekt "Product" der Klasse "PartDocument"
'Schleife durch alle Komponenten
For i = 1 To CATIA.ActiveDocument.Product.Count
'Abfrage nach Part oder Product und Schreiben der Werte in Excel
'Eventuell besser über CASE zu regeln...
'Select Case [CATIA.Documents.Item(i).Name]
'Case (Right(CATIA.Documents.Item(i).Name, 10) = "CATProduct")
If (Right(CATIA.Documents.Item(i).Name, 10) = "CATProduct") Then
'Deklaration der Objekte
Dim prod1 As Product
Dim ProdName As String
Dim ProductNumber As String
Set prod1 = CATIA.Documents.Item(i).Product
'Produktnamen abfragen
ProdName = prod1.Definition
'Produktnummer abfragen
ProdNumber = prod1.PartNumber
'Element unsichtbar setzen
prod1.SetShow catVisPropertyNoShowAfter
'Datenübergabe an Excel
'Excel.Cells(RwNum + 1, 1) = i
Excel.Cells(RwNum + 1, 2) = ProdNnumber
Excel.Cells(RwNum + 1, 3) = ProdName
RwNum = RwNum + 1
'Case (Right(CATIA.Documents.Item(i).Name, 7) = "CATPart")
ElseIf (Right(CATIA.Documents.Item(i).Name, 7) = "CATPart") Then
'Deklaration der Objekte
Dim part1 As Part
Dim PNumber As String
Dim PName As String
Dim PArea As Object
Dim PVolume As Object
Dim PMass As Object
'Platzhalter auf das i-te Element setzen
Set part1 = CATIA.ActiveDocument.Item(i)
'get "Part Number"
PNumber = part1.PartNumber
'get "Definition"
PName = part1.Definition
'get "volume"
PArea = part1.Analyze.WetArea
'get "surface"
PVolume = part1.Analyze.Volume
'get "weight"
PWeight = part1.Analyze.Mass
'Element unsichtbar setzen
part1.SetShow catVisPropertyNoShowAfter
' Row two
Excel.Cells(RwNum + 1, 1) = i
Excel.Cells(RwNum + 1, 2) = PName
Excel.Cells(RwNum + 1, 3) = PNumber
Excel.Cells(RwNum + 1, 4) = PArea
Excel.Cells(RowNum + 1, 5) = PVolume
Ecxel.Cells(RowNum + 1, 6) = PMass
RwNum = RwNum + 1
'Case Else
'Next
End If
'End Select
Next i
Excel.ActiveWorkbook.Name = Excel.Cells(1, 3).Value
'User Interface: Save result?
If MsgBox("Fertig! Ergebnis speichern?" + makroname + "" + version, _
vbYesNo Or vbQuestion, "Sicherung") = vbYes Then
Dim Erfolg As Boolean
Erfolg = Excel.Application.Dialogs(xlDialogSaveAs).Show(arg1:=Excel.ActiveWorkbook.Name) 'file name = product name
If Not Erfolg Then
MsgBox "Keine Datei Ausgewählt. Nicht gespeichert!"
End If
End If
MsgBox "Makro ist beendet", 64, makroname + "" + version
End Sub
_____
[Diese Nachricht wurde von felix302 am 10. Okt. 2018 editiert.]
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP