Code:
'Option Explicit
'arrays fangen beim Index 0 an...
Dim aAssyArray() As String 'input array
Dim iAssyArrayCount As Integer
Dim aStuliPartNumbers() As String 'output array, Benennung
Dim aStuliCounts() As Integer 'output array, Anzahl
Sub CATMain()
Dim Box, Datei As String
Box = MsgBox ("Das Skript erzeugt eine Stueckliste:" &Chr(13) & Chr (10) & "Sollte das Skript einen String nicht aufteilen koennen wird dieser als letztes in die Spalte (J) geschrieben ohne die Zellen davor zu befuellen." &"", 64, "Stückliste")
X
end Sub
Sub X
Dim oActDoc As Document
If CATIA.Documents.Count = 0 Then
MsgBox ("Kein Dokument geöffnet!")
Exit Sub
End If
Set oActDoc = CATIA.ActiveDocument
If TypeName(oActDoc) <> "ProductDocument" Then
MsgBox ("Kein Product geladen!")
Exit Sub
End If
'Array wird auf 100 Einträge initialisiert
'im RekursivDurchBaum ist die Redimensionierung vorhanden
ReDim aAssyArray(100)
iAssyArrayCount = 0
Dim oProduct As Product
Set oProduct = oActDoc.Product
Dim oProducts As Products
Set oProducts = oProduct.Products
'Alle CATParts aus Baum ins globale Array sammeln
RekursivDurchBaum oProducts
If iAssyArrayCount > 0 Then
'Arraydimension zurechtschneiden
ReDim Preserve aAssyArray(iAssyArrayCount - 1)
StuliEintraegeZaehlen
'Ausgabe der Ergebnis ins Immedate Window (VBA)
Dim i As Integer
Dim sTemp As String
Dim sTempAnz As String
Dim vTXT As String
Dim BenennTXT As String
Dim PosTXT1 As String
Dim PosTXT2 As String
Dim AuftragNrTXT1 As String
Dim bgTXT1 As String
Dim bgTXT2 As String
Dim TXT_W_Teil As String
Dim TXT_1_W_Teil As String
Dim W_Teil As String
Dim KT_Teil As String
Dim Bestell As String
Dim Bestellx As String
Dim Liefer As String
Dim Lieferx As String
Dim Name As String
Dim Namex As String
Dim Baugr1 As String
Dim Baugr2 As String
Dim Baugr As String
Dim TXT_ As String
Dim TXT_1 As String
Dim TXT_2 As String
Dim TXT_3 As String
Dim TXT_4 As String
Dim TXT_5 As String
Dim TXT_6 As String
Dim TXT_7 As String
Dim TXT_8 As String
Dim TXT_9 As String
Dim BG_B As String
Dim BauGru_B As String
Dim BauGru_U As String
Dim TXT1 As String
Dim TXT2 As String
Dim TXT3 As String
Dim TXT4 As String
Dim TXT5 As String
Dim TXT6 As String
Dim TXT7 As String
Dim TXT8 As String
Dim prod As Product
'Set prod = CATIA.ActiveDocument.Product
Set objXL = CreateObject("Excel.Application")
objXL.Visible = True
Set oAWBook = objxl.Workbooks.Add
'For I = 1 to 15 'UserSelektion.Count
'For i = 1 To prod.Parameters.Count 'Parameters
'objXL.Cells(i,1).Value = "DAS IST Spalte" & i
'objXL.Cells(i,2).Value = "DAS IST Spalte" & i & "Zelle 2"
'objXL.Cells(i,3).Value = "DAS IST Spalte" & i & "Zelle 3"
'next
For i = LBound(aStuliPartNumbers) To UBound(aStuliPartNumbers)
sTemp = CInt(aStuliCounts(i)) & " St. von " & aStuliPartNumbers(i)
'Debug.Print sTemp
'hier kann auch ein Msgbox stehen
'MsgBox (sTemp)
sTempAnz = "" & CInt(aStuliCounts(i))
'Msgbox sTempAnz
'######################################## ETZ ###############################################
On Error Resume Next
vTXT = aStuliPartNumbers(i)
'vTXT = Left(Name, InStrRev(Name, ".CAT") - 1)
BenennTXT = Right( vTXT, Len( vTXT) -18 ) 'Right Left
PosTXT1 = Left(vTXT, InStrRev(vTXT, "_") - 1)
PosTXT2 = Right( PosTXT1, Len(PosTXT1) -14 ) 'Right Left
AuftragNrTXT1 = Left( PosTXT1, Len( PosTXT1) -9 ) 'Right Left
bgTXT1 = Left( PosTXT1, Len( PosTXT1) -5 ) 'Right Left
bgTXT2 = Right( bgTXT1, Len( bgTXT1) -9 ) 'Right Left
'________________________________________________________________________________________________
TXT_W_Teil = Left(vTXT, InStrRev(vTXT, "_") -1) 'Right Left Mid
TXT_1_W_Teil = Right(TXT_W_Teil, InStrRev(TXT_W_Teil, "_") -5) 'Right Left Mid
W_Teil = Left(TXT_1_W_Teil, Len(TXT_1_W_Teil) -7) 'Right Left
'##############################################################################################
'########################### Kaufteile #######################################################
KT_Teil = Left(vTXT, InStrRev(vTXT, "KT_") +2) 'Right Left Mid
Bestell = mid(vTXT, InStrRev(vTXT, "_") +1) 'Right Left Mid
Bestellx = Left(vTXT, InStrRev(vTXT, "_") -1) 'Right Left Mid
Liefer = mid(Bestellx, InStrRev(Bestellx, "_") +1) 'Right Left Mid
Lieferx = Left(Bestellx, InStrRev(Bestellx, "_") -1) 'Right Left Mid
Name = mid(Lieferx, InStrRev(Lieferx, "_") +1) 'Right Left Mid
Namex = Left(Lieferx, InStrRev(Lieferx, "_") -1) 'Right Left Mid
'###################################### Baugruppe untersch #######################################################
Baugr1 = Left(vTXT, InStrRev(vTXT, "_") -1) 'Right Left Mid
Baugr2 = Left(Baugr1, InStrRev(Baugr1, "_") +1) 'Right Left Mid
Baugr = mid(Baugr2, InStrRev(Baugr2, "_") -0) 'Right Left Mid
'#################################################################################################
TXT_5 = Right(TXT_4, InStrRev(TXT_4, "_") -0) 'Right Left Mid
TXT_6 = Left(TXT_5, InStrRev(TXT_, "_") -6) 'Right Left Mid
TXT_8 = Left(TXT_5, InStrRev(TXT_, "_") -6) 'Right Left Mid
TXT_9 = Right(TXT_8, Len(TXT_8) - 1)
TXT_1_BG_B = Left(TXT_2_BG_U, InStrRev(TXT_, "_") -6) 'Right Left Mid
BG_B = Right(TXT_1_BG_B, Len(TXT_1_BG_B) - 1)
'msgbox oName + Chr(13) + "oName"
'msgbox TXT_1 + Chr(13) + "TXT_1"
'msgbox W_Teil + Chr(13) + "W_Teil"
'msgbox Baugr1 + Chr(13) + "Baugr1"
'msgbox Baugr2 + Chr(13) + "Baugr2"
'msgbox Baugr + Chr(13) + "Baugr"
'msgbox TXT_6 + Chr(13) + "TXT_6"
'msgbox TXT_7 + Chr(13) + "TXT_7"
'msgbox TXT_8 + Chr(13) + "TXT_8"
'msgbox TXT_9 + Chr(13) + "TXT_9"
'#############################################################################################
BauGru_B = vTXT & Chr(10) & "Baugruppe"
BauGru_U = vTXT & Chr(10) & "Unterbaugruppe"
'######################## IF ABFRAGE #########################################################
if W_Teil = "-B" Then
TXT1= sTempAnz
TXT2= BenennTXT
TXT3= PosTXT1
TXT4= ""
TXT5= PosTXT2
TXT6= ""
TXT7= "Werner"
end if
if KT_Teil = "KT_" Then
TXT1 = sTempAnz
TXT2 = Name
TXT3 = ""
TXT4 = ""
TXT5 = ""
TXT6 = Bestell
TXT7 = Liefer
end if
'msgbox "Name:" + vTXT + Chr(13) + Chr(13) + "Anz.: " + TXT1 + Chr(13) + "Bennennung: " + TXT2 + Chr(13) + "Best-Nr.Werner: " + TXT3 + Chr(13) + "Werkstoff: " + TXT4 + Chr(13) + "Pos. " + TXT5 + Chr(13) + "Rohmasse-DIN: " + TXT6 + Chr (13) + "Lifer: " + TXT7
'http://ww3.cad.de/foren/ubb/Forum137/HTML/000866.shtml#000006
objXL.Cells(i,1).Value = TXT1 '"DAS IST Spalte" & i & "Zelle 2"
objXL.Cells(i,2).Value = TXT2 ' "DAS IST Spalte" & i & "Zelle 3"
objXL.Cells(i,3).Value = TXT3 ' "DAS IST Spalte" & i & "Zelle 4"
objXL.Cells(i,4).Value = TXT4 ' "DAS IST Spalte" & i & "Zelle 5"
objXL.Cells(i,5).Value = TXT5 ' "DAS IST Spalte" & i & "Zelle 6"
objXL.Cells(i,6).Value = TXT6 ' "DAS IST Spalte" & i & "Zelle 7"
objXL.Cells(i,7).Value = TXT7 ' "DAS IST Spalte" & i & "Zelle 8"
objXL.Cells(i,10).Value = vTXT ' "DAS IST Spalte" & i
vTXT = " "
TXT1 = " "
TXT2 = " "
TXT3 = " "
TXT4 = " "
TXT5 = " "
TXT6 = " "
TXT7 = " "
Next
End If
End Sub
Function RekursivDurchBaum(oProducts As Products)
Dim oProduct As Product
Dim oRefProduct As Product
Dim oRefDocument As Document
For Each oProduct In oProducts
If oProduct.Products.Count > 0 Then
RekursivDurchBaum oProduct.Products
Else
Set oRefProduct = oProduct.ReferenceProduct
Set oRefDocument = oRefProduct.Parent
If TypeName(oRefDocument) = "PartDocument" Then
'Du bist an einen Part
'jetzt kannst du entscheiden, nach was du zählen willst:
' 'Dateiname
aAssyArray(iAssyArrayCount) = oRefDocument.Name
'PartNumber
aAssyArray(iAssyArrayCount) = oRefProduct.PartNumber
iAssyArrayCount = iAssyArrayCount + 1
'dieser Block ist nur da, falls die Anzahl der Products über 100 kommen sollte
If UBound(aAssyArray) <= iAssyArrayCount Then
ReDim Preserve aAssyArray(iAssyArrayCount + 20)
End If
End If
End If
Next
End Function
Sub StuliEintraegeZaehlen()
Dim i1stLoop As Integer
Dim i2ndLoop As Integer
Dim iSearchStringCount As Integer
Dim sSearchString As String
Dim iStuliArrayCount As Integer
Dim s2ndLoopString As String
ReDim aStuliPartNumbers(20) 'output array, Benennung
ReDim aStuliCounts(20) 'output array, Anzahl
iStuliArrayCount = 0
'Algorithmus:
'Es wird die aAssyArray durchgelaufen. Jede Zeile dieser Array wird in aStuli*
'geschrieben, falls es noch nicht existiert. Falls ein Eintrag mit der selber Name
'schon vorhanden war, wird der Zähler (2. Spalte) inkrementiert
'Bei jeder Treffer wird der Eintrag aus der Originalarray gelöscht
'habe im Vergleich zur Vorgänger lieber zwei Eindimensionale Arrays genommen, somit sind die
'einfacher zu handhaben
'äußere Schleife
For i1stLoop = 0 To iAssyArrayCount - 1
iSearchStringCount = 0
sSearchString = CStr(aAssyArray(i1stLoop)) 'nach diesen wird weitergesucht
If Len(sSearchString) > 0 Then 'also Eintrag im Original noch nicht gelöscht
iSearchStringCount = iSearchStringCount + 1 'ein Eintrag haben wir jedenfalls schon gefunden
'innere Schleife
For i2ndLoop = i1stLoop + 1 To iAssyArrayCount - 1
s2ndLoopString = CStr(aAssyArray(i2ndLoop))
If Len(s2ndLoopString) > 0 Then 'also Eintrag im Original noch nicht gelöscht
If s2ndLoopString = sSearchString Then 'wir haben noch ein Exemplar gefunden
iSearchStringCount = iSearchStringCount + 1
aAssyArray(i2ndLoop) = "" 'OriginalEintrag löschen
End If
End If
Next
'nachdem die Gesamtstückzahl ermittelt wurde, wird es ins Ausgangsarray geschreiben
aStuliPartNumbers(iStuliArrayCount) = sSearchString
aStuliCounts(iStuliArrayCount) = iSearchStringCount
'wieder der Array Dimensionscheck
iStuliArrayCount = iStuliArrayCount + 1
If UBound(aStuliPartNumbers) <= iStuliArrayCount Then
ReDim Preserve aStuliPartNumbers(iStuliArrayCount + 5)
ReDim Preserve aStuliCounts(iStuliArrayCount + 5)
End If
End If
Next
If iStuliArrayCount > 0 Then
'Arraydimension zurechtschneiden
ReDim Preserve aStuliPartNumbers(iStuliArrayCount - 1)
ReDim Preserve aStuliCounts(iStuliArrayCount - 1)
End If
End Sub