Autor
|
Thema: interaktive Schaltflächen (1933 mal gelesen)
|
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 03. Aug. 2006 13:54 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, ich habe ein Problem, ich würde gerne über ein vba Projekt eine Excel-Tabelle erstellen. Diese jedoch nur temporär. Ich möchte also beim Aufruf eine Excel Tabelle haben auf welcher ein Commandbutton erzeugt wird. 2 Probleme hab ich nun 1. Ich möchte die Benennung der Schaltfläche ändern --> geht nicht 2. Wie bekomm ich nun den Quellcode in die interaktiv erzeugte Schaltfläche??? ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 03. Aug. 2006 15:19 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
Hi, In solchen Fällen erstelle ich immer eine Template-Excel-Tabelle per Hand. Komplett mit Formatierungen, Schaltflächen, Makros etc. Aus dem CV5 VBA Makro heraus kopiere ich diese Vorlage dann in ein anderes Verzeichnis (und verpasse ihr einen temporären Dateinamen) und fülle dann die Vorlage mit den Daten auf, die ich brauche. Gemacht habe ich das beispielsweise mal bei einem Makro, das eine Stückliste in einem ganz bestimmten Format ausleiten sollte. Auf der Vorlage waren dann noch allerlei Excel-Filter etc. definiert. Würde Dir ein solches Szenario helfen oder muss es tatsächlich eine dynamisch erzeugte Angelegenheit sein?
------------------ -- Danny Reinhold Reinhold Software Services Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkna Mitglied Konstrukteur
Beiträge: 137 Registriert: 18.03.2005
|
erstellt am: 03. Aug. 2006 15:20 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
Hallo Du kannst den Namen eines Button über die Eigenschaft "Caption" ändern Hier ein kleines Beispiel mit dem Du einem Button in der Tabelle1 ändern kannst
Sub Name_button() i = InputBox("Gewünschter Name") Tabelle1.CommandButton1.Caption = i MsgBox ("Nächster Name") End Sub Hoffentlich konnte ich dir ein bischen helfen
Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 03. Aug. 2006 15:41 <-- editieren / zitieren --> Unities abgeben:
das prob ist ich darf keine Vorlage verwenden, es muss eine Excel Tabelle sein die es noch nicht gibt. es muss quasi alles interaktiv erstellt werden vom vba-Code selbst. 1. Schaltfläche in Tabelle erstellen 2. Schaltfläche umbenennen 3. Code zur Schaltfläche hinzufügen 4. über Schaltflächenklick daten an CATIA zurück geben mit dem umbenennen über Caption geht so lala, aber vielleicht spinnt auch mein Excel etwas ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 03. Aug. 2006 16:59 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
|
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 03. Aug. 2006 17:34 <-- editieren / zitieren --> Unities abgeben:
Weil mein Ziel ist das zur Archivierung nur ein CATPart vorhanden ist und keine Excel Tabelle. Weil auf mehreren Rechnern eben die Vorlage nicht da ist. Frage beantwortet? :-) ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 03. Aug. 2006 20:00 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
Hi, Ok, dann probier's mal etwa so: Code:
' exapp mit CreateObject oder GetObject holen ' Es muss ein aktives Sheet da sein ' Sonst musst Du es erzeugen... Dim sheet As Worksheet Set sheet = exapp.ActiveSheet exapp.CommandBars("Forms").Visible = True sheet.Buttons.Add(29.4, 6.6, 72, 72).Select Selection.OnAction = "myButtonCallback" Selection.Caption = "Hier klicken!" ' Aktive Selektion vom Button nehmen, damit ' man raufklicken kann... sheet.Range("A1").Select ... und irgendwo dann: Sub myButtonCallback() MsgBox "Hallo Welt!" End Sub
Meinst Du sowas?
------------------ -- Danny Reinhold Reinhold Software Services Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 09:04 <-- editieren / zitieren --> Unities abgeben:
Funktioniert "FAST" :-) wenn ich auf die Schaltfläche klicke sagt er mir das Excel das Makro mybuttonCallback nicht finden kann :-( ansonsten wäre es genau das richtige Menno fast wärs das gewesen ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 04. Aug. 2006 09:25 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
|
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 09:38 <-- editieren / zitieren --> Unities abgeben:
Das ist ja das Problem ;-) es gibt keines. Ich muss alles interaktiv erzeugen. Wie oben erklärt. Ich habe nur ein CATPart und das darin gespeicherte CATScript. hab jetzt ne relativ unschöne lösung ohne Command Button. Code: Sub CATMain()Set oActiveDoc = CATIA.ActiveDocument Set mypart = oActiveDoc.Part Set Formeln = mypart.Relations Set KonTAB = Formeln.Item("Platten") Spalten = KonTAB.ColumnsNb Zeilen = KonTAB.ConfigurationsNb Set Anwendung = CreateObject("Excel.Application") Anwendung.Visible = True Set Blaetter = Anwendung.Workbooks Set neues_Blatt = Blaetter.Add Set Arbeitsblatt = neues_Blatt.ActiveSheet For j = 1 To Spalten For i = 1 To Zeilen + 1
Zelleninhalt = KonTAB.CellAsString(i, j) Arbeitsblatt.Cells(i, j) = Zelleninhalt Next Next Arbeitsblatt.Columns.AutoFit Arbeitsblatt.Range("A1", "B7").AutoFilter 'Dim Schaltflaeche As OLEObjects 'Dim StartButton As OLEObject ' 'Set Schaltflaeche = Arbeitsblatt.OLEObjects 'Set StartButton = Schaltflaeche.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=41.25, Top:=133.5, Width:=130.5, Height:=16.5) Arbeitsblatt.Columns("A").Insert Shift:=xlToRight
Arbeitsblatt.Cells(1, 1) = "Auswahl" Dim Kriterium As Integer Dim z As Integer Kriterium = 0 Do For z = 1 To (Zeilen + 4) If Arbeitsblatt.Cells(z, 1) = "x" Then KonTAB.Configuration = (z - 1) Kriterium = 1 End If Next Loop Until Kriterium = 1 mypart.Update Set TabApp = GetObject(, "Excel.Application") TabApp.Application.Quit End Sub
Das Makro erzeugt eine zusätzliche Spalte in der der Anwender ein x einträgt und bestätigt durch die Do Schleife prüfe ich diese Felder eben ab bis ein x gefunden wird. Sehr unschön ich weiss aber meine bisher einzigste Lösung. Dabei ist noch ein Prob aufgetaucht, und zwar möchte ich dann Excel schliessen, funkt soweit auch ganz gut, jedoch will ich nicht das Excel mich nach speichern fragt. Geht das??? Es soll einfach ohne Speichern geschlossen werden. (Soll ja alles temporär sein)
------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 04. Aug. 2006 09:45 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
Hi nochmal, Hmmm... Ich hatte das Makro gestern direkt in Excel-VBA getestet. Da hat's natürlich funktioniert, weil myButtonCallback ja direkt in der aktiven Mappe definiert war. Stimmt - aus CV5 heraus ist das ein Problem. Zu Deiner anderen Frage: Wenn Du das Workbook schliesst mit:
Code:
ExApp.ActiveWorkbook.Close False
sollte Excel sich eine Nachfrage verkneifen...
------------------ -- Danny Reinhold Reinhold Software Services Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 09:49 <-- editieren / zitieren --> Unities abgeben:
versuch ich mal, werd dann nochmal Feedback geben. Zum Problem mit dem Button. Naja wäre halt schöner wie das mit dem Auswahlfeld. Aber ich find keine andere Lösung. Userforms darf ich ja auch nicht verwenden weil ich sonst catvba hab und kein Catscript :-( ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 04. Aug. 2006 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
Hi nochmal, Ich habe das Problem mit dem Button hinbekommen (Hartnäckigkeit kann sich auszahlen ): Schritt 1 --------- Füge Deinem Projekt folgende Verweise hinzu: - Microsoft Excel 11.0 Object Library - Microsoft Office 11.0 Object Library - Microsoft Visual Basic for Applications Extensibility ... (Falls Du eine andere Office Version hast, nimm die entsprechenden Verweise...) Schritt 2 --------- Die Sicherheit in Excel muss heruntergeschraubt werden (das muss dann leider jeder Anwender einmal machen): Dazu in Excel unter Tools/Optionen... auf Makrosicherheit klicken und dann die Checkbox "Zugriff auf Visual Basic Projekt erlauben" aktivieren. Schritt 3 --------- Der Code:
Code:
Option ExplicitSub CATMain() ' Schritt 1: Excel application holen Dim ExApp As Object Set ExApp = GetObject(, "Excel.Application") ' Schritt 2: Tabelle holen Dim sheet As Worksheet Set sheet = ExApp.ActiveSheet ' Schritt 3: Code für das Callback in Excel Makro erzeugen Dim wb As Workbook Dim module As VBIDE.VBComponent Set wb = ExApp.ActiveWorkbook
' Das hier ist der Code, der beim Klick ' ausgeführt werden soll... Dim myCode As String myCode = "sub myButtonCallback()" & vbCr & _ " msgbox ""Hallo Welt!"" " & vbCr & _ "end sub" wb.VBProject.VBE.ActiveCodePane.CodeModule.AddFromString (myCode) ' Schritt 4: Button erzeugen ExApp.CommandBars("Forms").Visible = True
sheet.Buttons.Add(29.4, 6.6, 72, 72).Select ExApp.Selection.OnAction = "myButtonCallback" ExApp.Selection.Caption = "Hier klicken!" ' Aktive Selektion vom Button nehmen, damit ' man raufklicken kann... sheet.Range("A1").Select End Sub
Das hat jetzt bei mir jedenfalls funktioniert... Gefällt mir aber nicht wirklich. Ich halte eine Lösung mit einer Excel-Vorlagendatei für einfacher... ------------------ -- Danny Reinhold Reinhold Software Services Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 10:07 <-- editieren / zitieren --> Unities abgeben:
Puh wenn der Rückgabecode an CATIA komplex ist dann ist das ja ziemlich stressig *g* Aber danke für die Antwort, werde das jetzt dann mal testen. Werd dann wohl wieder ein Problem haben *g* so wie immer *g* ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 10:08 <-- editieren / zitieren --> Unities abgeben:
Jetzt hab ich noch was, hast du das ganze auch mit CATScript getestet????? weil dort kann ich ja gar keine referenzen oder Bibliotheken dazuladen???? ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 10:17 <-- editieren / zitieren --> Unities abgeben:
Hmm dein Beispiel geht bei mir leider net :-( Runtime Error '1004' Der Programmatische Zugriff auf das Visual Basic Projekt ist nicht sicher. :-( Bei der Zeile: wb.VBProject.VBE.ActiveCodePane.CodeModule.AddFromString (myCode) ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 04. Aug. 2006 10:18 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
|
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 04. Aug. 2006 10:19 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
> Der Programmatische Zugriff auf das Visual Basic Projekt ist nicht sicher. Deshalb ja Schritt 2 - Du musst in Excel einstellen, dass ein anderes Programm den VB-Code im Excel-Workbook verändern darf... ------------------ -- Danny Reinhold Reinhold Software Services
[Diese Nachricht wurde von dr am 04. Aug. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 10:21 <-- editieren / zitieren --> Unities abgeben:
|
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 04. Aug. 2006 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
Ich meine nicht das was im Code als "Schritt 2" kommentiert ist, sondern das, was darüber im Posting steht. Du musst wirklich in Excel herumklicken und die Sicherheitsstufe reduzieren. (Das kann man nicht per Makro machen, da die Sicherheitseinstellungen sonst ziemlich witzfrei wären...)
------------------ -- Danny Reinhold Reinhold Software Services Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 10:33 <-- editieren / zitieren --> Unities abgeben:
mmh hab ich jetzt getan aber er motzt bei der gleichen Zeile wieder. jedoch diesmal mit Object oder With Variable not set :-( dabei hab ich jetzt den Code von dir übernommen, Sheet ist da. Workbook ist da Excel ist da. alles da ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 10:40 <-- editieren / zitieren --> Unities abgeben:
Hab jetzt folgendes gemacht, will nur wissen ob das so einigermassen ok ist Code:
Set module = neues_Blatt.VBProject.VBComponents.Add(vbext_ct_StdModule)module.CodeModule.AddFromString (myCode)
------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 04. Aug. 2006 10:51 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
Hi, Ja, wenn noch kein CodePane da ist, ist das sogar erforderlich. (Scheint so zu sein, wenn man ein neues Blatt per Makro erzeugt...) Läuft es denn jetzt damit?
------------------ -- Danny Reinhold Reinhold Software Services Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 10:55 <-- editieren / zitieren --> Unities abgeben:
|
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 11:00 <-- editieren / zitieren --> Unities abgeben:
mmh wieder ein Prob. Also zumindest weiss ich das es geht, hab nur die Methode vergessen :-( hab ja jetzt die Schaltfläche, diese soll mir nun die Reihe der vom anwendert aktiv gestetzten Zelle zurückgeben. Ich hatte es schonmal, und jetzt hab ichs wieder vergessen, vielleicht weiss es jemand ------------------ Wenn alle Stricke reissen, nehm ich ein Drahtseil Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 11:19 <-- editieren / zitieren --> Unities abgeben:
|
Timberwolve Mitglied
Beiträge: 233 Registriert: 21.07.2006
|
erstellt am: 04. Aug. 2006 11:32 <-- editieren / zitieren --> Unities abgeben:
|
dr Mitglied CAD-/PLM-Entwickler und -Berater
Beiträge: 87 Registriert: 30.10.2001
|
erstellt am: 04. Aug. 2006 11:44 <-- editieren / zitieren --> Unities abgeben: Nur für Timberwolve
Du kannst Catia aus dem Excel Makro ganz normal ansprechen, beispielsweise so: Code:
' Schritt 3: Code für das Callback in Excel Makro erzeugen Dim wb As Workbook Dim module As VBIDE.VBComponent Set wb = ExApp.ActiveWorkbook' Das hier ist der Code, der beim Klick ' ausgeführt werden soll... Dim myCode As String myCode = "" & _ "Sub myButtonCallback() " & vbCr & _ " Dim catia As Object " & vbCr & _ " Set catia = GetObject(, ""Catia.Application"") " & vbCr & _ " MsgBox catia.ActiveDocument.Name " & vbCr & _ "End Sub " & vbCr Set module = wb.VBProject.VBComponents.Add(vbext_ct_StdModule) module.CodeModule.AddFromString (myCode)
Aber stimmt schon - ist ziemlich ätzend... ------------------ -- Danny Reinhold Reinhold Software Services Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |