Autor
|
Thema: MultiValueParameter überschreiben (1752 mal gelesen)
|
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 07. Jun. 2017 12:23 <-- editieren / zitieren --> Unities abgeben:
Hi ich erstelle gerade ein VBA-Makro, mit dem ich die Werte eines MultiValueParameters in ein Textfeld (Multiline) in einer Userform lade. Den Inhalt des Textfeldes lade ich dann in eine Array und will diese nun an den Parameter zurückgeben, wobei die alten Werte irrelevant sind. Es sollen nur die Werte aus der Array anschließend im Parameter enthalten sein. Ich bekomme den Parameter nur nicht überschrieben?! Wenn ich einen neuen Parameter erzeuge, funktioniert ".SetEnumerateValues". Zum Ändern / Überschreiben allerdings nicht?! Es kommt die Fehlermeldung "Typ mismatch" Weiß jemand weiter? So sieht der Code aktuell aus: Code:
Private Sub cmd_OK_Click() ' Variablen definieren oCounter = 0 ' Textfeldinhalt in eine Array laden Dim UserArray As Variant UserArray = Split(Me.txt_DrawUser, vbLf) ' Array auf Form prüfen (B. Name) For i = 0 To UBound(UserArray) If Mid(UserArray(i), 2, 2) <> ". " Then oCounter = oCounter + 1 End If Next i If oCounter >= 2 Then MsgBox a_00_GlobalMsgBox.MsgBox_WrongUser, 48, "Warning" Exit Sub End If ' Array alphabetisch sortieren Call UserSort(UserArray) ' Array an die Parameter "Name_Konstrukteur", "Name_Zeichner" und "Name_Pruefer" zurückgeben Set oDoc = CATIA.ActiveDocument Set oParas = oDoc.Parameters Set oPara = oParas.Item(vName_Pruefer) oPara.SetEnumerateValues UserArray ' UserForm ausblenden und entladen Unload Me End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Jun. 2017 12:45 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
|
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 07. Jun. 2017 13:00 <-- editieren / zitieren --> Unities abgeben:
Es kommt immer "Type mismatch" Code:
Private Sub cmd_OK_Click() ' Variablen definieren oCounter = 0 ' Textfeldinhalt in eine Array laden Dim UserArray As Variant UserArray = Split(Me.txt_DrawUser, vbLf) ' Array auf Form prüfen (B. Name) For i = 0 To UBound(UserArray) If Mid(UserArray(i), 2, 2) <> ". " Then oCounter = oCounter + 1 End If Next i If oCounter >= 2 Then MsgBox a_00_GlobalMsgBox.MsgBox_WrongUser, 48, "Warning" Exit Sub End If ' Array alphabetisch sortieren 'Call UserSort(UserArray) ' Array an die Parameter "Name_Konstrukteur", "Name_Zeichner" und "Name_Pruefer" zurückgeben Dim oParas As Parameters 'Dim oPara As Parameter 'Dim oPara As Object Dim oPara As Variant Set oDoc = CATIA.ActiveDocument Set oParas = oDoc.Parameters Set oPara = oParas.Item(vName_Pruefer) oPara.SetEnumerateValues UserArray ' UserForm ausblenden und entladen Unload Me End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Jun. 2017 13:32 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
Servus Also in meinem Test hat es geklappt (unter VBA und den Parameter als Parameter dimensioniert) Ist dein Array gefüllt? Wird der Parameter richtig angesprochen? Gibt es den Parameter? Was ist bei dir vName_Pruefer? Ist der Parameter von eine Formel gesteuert? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 07. Jun. 2017 13:45 <-- editieren / zitieren --> Unities abgeben:
Ok?! Die Array ist befüllt, vName_Pruefer ist eine Stringvariable mit dem Namen des Parameters (ebenfalls befüllt) und ich kann auch den Wert des Parameters auslesen. Also eigentlich alles so wie es soll. Und ich arbeite auch im VBA (R24). Code:
Private Sub cmd_OK_Click() ' Variablen definieren oCounter = 0 ' Textfeldinhalt in eine Array laden Dim UserArray As Variant UserArray = Split(Me.txt_DrawUser, vbLf) ' Array auf Form prüfen (B. Name) For i = 0 To UBound(UserArray) If Mid(UserArray(i), 2, 2) <> ". " Then oCounter = oCounter + 1 End If Next i If oCounter >= 2 Then MsgBox a_00_GlobalMsgBox.MsgBox_WrongUser, 48, "Warning" Exit Sub End If ' Array alphabetisch sortieren 'Call UserSort(UserArray) ' Array an die Parameter "Name_Konstrukteur", "Name_Zeichner" und "Name_Pruefer" zurückgeben Dim oDoc As DrawingDocument Dim oParas As Parameters Dim oPara As Parameter Set oDoc = CATIA.ActiveDocument Set oParas = oDoc.Parameters Set oPara = oParas.Item(vName_Pruefer) MsgBox oPara.Value MsgBox UserArray(2) MsgBox vName_Pruefer
oPara.SetEnumerateValues UserArray
' UserForm ausblenden und entladen Unload Me End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 07. Jun. 2017 13:48 <-- editieren / zitieren --> Unities abgeben:
Ok so funktioniert es?! Code:
' Textfeldinhalt in eine Array laden Dim UserArray(2) UserArray(0) = "0000" UserArray(1) = "1111" UserArray(2) = "2222" 'UserArray = Split(Me.txt_DrawUser, vbLf)
Aber die Array in dem Code vorher ist definitiv befüllt?!?! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Jun. 2017 13:50 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
|
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 07. Jun. 2017 13:56 <-- editieren / zitieren --> Unities abgeben:
Mit "Dim UserArray As Variant" kommt "Type mismatch" bei "oPara.SetEnumerateValues UserArray". Mit "Dim UserArray() As Variant" kommt "Type mismatch" bei "UserArray = Split(Me.txt_DrawUser, vbLf)". Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 07. Jun. 2017 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
|
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 07. Jun. 2017 14:09 <-- editieren / zitieren --> Unities abgeben:
Funktioniert auch damit nicht :-) Im Screenshot sieht man, dass die Array gefüllt ist und der Parameter auch definiert ist... Das UBound() war nur ein Test. Funktioniert aber auch nicht. Kann es daran liegen, weil die größe der Array nicht direkt definiert ist, da sie sich ja selber definiert?! [Diese Nachricht wurde von InFlames am 07. Jun. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 08. Jun. 2017 07:23 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, also sobald ich die Array manuell definiere, läuft es ohne Probleme durch. Warum?!?! Sobald ich die Array aus dem String der Textbox erstelle, kommt immer "Type mismatch" bei oPara.SetEnumerateValues UserArray... Es liegt also an der Array. Die ist aber befüllt und die Ausgabe per MsgBox ergibt das richtige Ergebnis. Code:
Private Sub cmd_OK_Click() ' Variablen definieren oCounter = 0 ' Textfeldinhalt in eine Array laden 'Dim UserArray As Variant 'UserArray = Split(Me.txt_DrawUser.Value, vbLf) Dim UserArray(2) UserArray(0) = "A. Name" UserArray(1) = "B. Name" UserArray(2) = "C. Name" ' Array auf Form prüfen (B. Name) For i = 0 To UBound(UserArray) If Mid(UserArray(i), 2, 2) <> ". " Then oCounter = oCounter + 1 End If Next i If oCounter >= 2 Then MsgBox a_00_GlobalMsgBox.MsgBox_WrongUser, 48, "Warning" Exit Sub End If ' Array alphabetisch sortieren 'Call UserSort(UserArray) ' Array an die Parameter "Name_Konstrukteur", "Name_Zeichner" und "Name_Pruefer" zurückgeben Dim oDoc As Document Dim oParas As Parameters Dim oPara As Parameter Set oDoc = CATIA.ActiveDocument Set oParas = oDoc.Parameters Set oPara = oParas.Item(vName_Pruefer) oPara.SetEnumerateValues UserArray oPara.Value = UserArray(0) ' UserForm ausblenden und entladen Unload Me End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 08. Jun. 2017 08:22 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 08. Jun. 2017 09:24 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
Servus Bei mir läuft es über einen Zwischenarray vom Typ String. zB so: Code: dim StrArray() as String dim vArray() as Variant dim i as IntegerStrArray = Split(Me.txt_DrawUser.Value, vbCrLf) ReDim vArray(UBound(StrArray)-1) for i = LBound(StrArray) to UBound(StrArray) vArray(i) = StrArray(i) next oPara.SetEnumerateValues vArray
Oder kann man Arrays auch direkt casten? Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 08. Jun. 2017 09:47 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
Hi Bernd, Zitat: Oder kann man Arrays auch direkt casten?
meinst Du ein existierendes Array, zB dim arrString() as String nach redim arrstring(4) as integer type-casten? Meines Wissens geht das nicht. Siehe auch Hilfe zu 'Redim': Zitat:
You can use the ReDim statement repeatedly to change the number of elements and dimensions in an array. However, you can't declare an array of one data type and later use ReDim to change the array to another data type, unless the array is contained in a Variant. If the array is contained in a Variant, the type of the elements can be changed using an As type clause, unless you’re using the Preserve keyword, in which case, no changes of data type are permitted.
Tschau, Joe ------------------ Inoffizielle Catia Hilfeseite Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 08. Jun. 2017 09:55 <-- editieren / zitieren --> Unities abgeben:
Ich werde bekloppt Das ergibt jetzt "Subscript out of range" bei vArray(i) = StrArray(i) Code:
Private Sub cmd_OK_Click() Dim StrArray() As String Dim vArray() As Variant Dim i As IntegerStrArray = Split(Me.txt_DrawUser.Value, vbCrLf) ReDim vArray(UBound(StrArray) - 1) For i = LBound(StrArray) To UBound(StrArray) vArray(i) = StrArray(i) Next Dim oDoc As Document Dim oParas As Parameters Dim oPara As Parameter Set oDoc = CATIA.ActiveDocument Set oParas = oDoc.Parameters Set oPara = oParas.Item(vName_Konstrukteur) oPara.SetEnumerateValues vArray ' oPara.Value = vArray(0) 'Set oPara = oParas.Item(vName_Zeichner) ' oPara.SetEnumerateValues vArray ' oPara.Value = vArray(0) 'Set oPara = oParas.Item(vName_Pruefer) ' oPara.SetEnumerateValues vArray ' oPara.Value = vArray(0) ' UserForm ausblenden und entladen Unload Me End Sub
Code:
Dim UserArray() As String UserArray = Split(Me.txt_DrawUser.Value, vbLf)
Ergibt ebenfalls "Type mismatch" bei oPara.SetEnumerateValues UserArray Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 08. Jun. 2017 09:57 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
Servus Joe Ich dachte eher einen gefüllten Array in einen anderen Typ umwandeln bzw den Inhalt des Arrays in einen anderen kopieren (der einen anderen Typ hat). Das ganze direkt ohne Schleife und nicht so wie in meinen Code. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 08. Jun. 2017 10:07 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
|
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 08. Jun. 2017 10:18 <-- editieren / zitieren --> Unities abgeben:
Oh mann endlich :-) Jetzt läufts. Vielen Dank Code:
Private Sub cmd_OK_Click() ' Variablen definieren oCounter = 0 ' Textfeldinhalt in eine Array laden Dim InputArray() As String InputArray = Split(Me.txt_DrawUser.Text, vbLf) ' Array auf Form prüfen (B. Name) For i = 0 To UBound(InputArray) If Mid(InputArray(i), 2, 2) <> ". " Then oCounter = oCounter + 1 End If Next i If oCounter >= 2 Then MsgBox a_00_GlobalMsgBox.MsgBox_WrongUser, 48, "Warning" Exit Sub End If ' Array alphabetisch sortieren Call UserSort(UserArray) ' Array umformen Dim UserArray() As Variant ReDim UserArray(UBound(InputArray)) For i = LBound(InputArray) To UBound(InputArray) UserArray(i) = InputArray(i) Next ' Array an die Parameter "Name_Konstrukteur", "Name_Zeichner" und "Name_Pruefer" zurückgeben Dim oDoc As Document Dim oParas As Parameters Dim oPara As Parameter Set oDoc = CATIA.ActiveDocument Set oParas = oDoc.Parameters Set oPara = oParas.Item(vName_Konstrukteur) oPara.SetEnumerateValues UserArray oPara.Value = UserArray(0) Set oPara = oParas.Item(vName_Zeichner) oPara.SetEnumerateValues UserArray oPara.Value = UserArray(0) Set oPara = oParas.Item(vName_Pruefer) oPara.SetEnumerateValues UserArray oPara.Value = UserArray(0) ' UserForm ausblenden und entladen Unload Me End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 08. Jun. 2017 11:29 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
Hi InFlames, noch zweikurze Anmerkungen: Code:
' Array alphabetisch sortieren Call UserSort(UserArray)
Solange die Elemente von UserArray noch leer sind, wird da nicht viel sortiert. Code:
' Array umformen Dim UserArray() As Variant ReDim UserArray(UBound(InputArray)) For i = LBound(InputArray) To UBound(InputArray) UserArray(i) = InputArray(i) Next
Anstatt Code:
Dim UserArray() As Variant ReDim UserArray(UBound(InputArray))
müsste auch Code:
Dim UserArray(UBound(InputArray)) As Variant
funktionieren. Statt Code:
For i = LBound(InputArray) To UBound(InputArray)
kannst auch Code:
For i = 0 To UBound(UserArray)
schreiben. Tschau, Joe ------------------ Inoffizielle Catia Hilfeseite Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InFlames Mitglied techn. Productdesigner
Beiträge: 72 Registriert: 22.09.2014 Windows 7 Professional Catia V5R26
|
erstellt am: 08. Jun. 2017 11:34 <-- editieren / zitieren --> Unities abgeben:
|
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 08. Jun. 2017 11:39 <-- editieren / zitieren --> Unities abgeben: Nur für InFlames
|