| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| myCAD 2024 Visiativ-Kundentag in Rosenheim, Veranstaltung am 29.10.2024 |
Autor
|
Thema: Excel-Tabelle mittels Makro bearbeiten (2611 / mal gelesen)
|
realmadrid.de Mitglied -
Beiträge: 67 Registriert: 29.10.2012 NX SolidWorks2017
|
erstellt am: 23. Mrz. 2018 11:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Ich habe bei SolidWorks 2017 ein kleines Problem bei der Makro-Programmierung. Folgende Ausgangslage: Ich habe verschiedene Teile mit unterschiedlichen Konfigurationen. Diese werden mittels Excel-Tabelle gesteuert. In dieser Tabelle haben die jeweiligen Konfigurationen einen Namen unter "$Benennung". Diese Werte sollen in eine andere Spalte "$PRP@Number" kopiert werden. Das ganze eben mit Makro, sodass ich die jeweilige Datei nur aufrufe, das Makro aktiviere und dieses die Tabelle öffnet und die Werte der Spalte kopiert. Hier hapert es bei mir aber schon direkt am Anfang. Selbst die einfachsten Befehle, wie "Range(A1:A100).Select" werden nicht genommen, und mit dem Fehler "Sub oder Function nicht definiert" abgebrochen. Wie ist hierbei denn der korrekte Aufruf in SolidWorks? Direkt über Excel funktioniert der Aufruf ja... Für jede Hilfe, wie ich das ganze aufziehen könnte wäre ich dankbar!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Skalar Mitglied
Beiträge: 65 Registriert: 26.01.2007 Win10 / SX2018
|
erstellt am: 23. Mrz. 2018 12:55 <-- editieren / zitieren --> Unities abgeben: Nur für realmadrid.de
Hallo, ich habe das gerade mal in einer meiner Tabellen und einem einfachen Makro versucht und es geht eigentlich. Code: Sub test() Range("B10") = Range("B6") End Sub
Lade doch mal ein Bsp. hoch. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 23. Mrz. 2018 12:59 <-- editieren / zitieren --> Unities abgeben: Nur für realmadrid.de
Hallo realmadrid.de (kurioser Name), ich vermute aus deiner Beschreibung, dass du dir nicht das Excel-Objekt geholt hast, SolidWorks selbst kennt das Range-Objekt von Excel nicht. Schau dir in der API-Hilfe mal das Beispiel "Get Excel Design Table Worksheet Example (VBA)" an, da siehst du wie der Zugriff auf das Worksheet in Excel funktionieren kann und du dann über das Worksheet-Objekt selbst in Excel weiter gehst. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
realmadrid.de Mitglied -
Beiträge: 67 Registriert: 29.10.2012 NX SolidWorks2017
|
erstellt am: 23. Mrz. 2018 13:08 <-- editieren / zitieren --> Unities abgeben:
Ja, genau. Ich versuche auf die "Design Table" zuzugreifen. Mit dem Aufruf aus dem Beispiel komme ich wenigstens schon mal an die Tabelle.... Wie da das kopieren der Werte aus den Spalten passieren soll ist mit allerdings noch nicht so ersichtlich [Diese Nachricht wurde von realmadrid.de am 23. Mrz. 2018 editiert.] [Diese Nachricht wurde von realmadrid.de am 23. Mrz. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2577 Registriert: 02.10.2006 Firma: SW 2023-5.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2023-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 23. Mrz. 2018 18:10 <-- editieren / zitieren --> Unities abgeben: Nur für realmadrid.de
Hallo, mal ein Auszug aus einem meiner Makros. Code: Dim xlApp As New Excel.Application Dim xlWb As Excel.Workbook Dim xlWs As Excel.Worksheet Dim sPath As String 'kpl. Dateipfad incl. Dateiname der Tabelle Dim n As Integer 'ein Zähler sPath = "C:\Ordner\Exceltabelle.xlsx" 'öffne mit Excel eine bestehende Tabelle und aktiviere ein Blatt Set xlApp = Excel.Application 'Excel öffnen xlApp.Visible = True 'Excel einblenden Set xlWb = xlApp.Workbooks.Open(sPath) 'Tabelle öffnen Set xlWs = xlWb.Worksheets("Tabelle1") 'Blatt ansprechen 'ermitteln der nächsten freien Zeile n = xlWs.[A65536].End(xlUp).Offset(1, 0).Row xlWs.Range("A" & n).NumberFormat = "@" 'als "Text" formatieren, wenn man möchte xlWs.Range("A" & n).Value = "mein Wert" 'dein Wert in die Zelle eintragen
Hoffe geholfen zu haben. Grüße und schönes WE, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1756 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 26. Mrz. 2018 11:06 <-- editieren / zitieren --> Unities abgeben: Nur für realmadrid.de
Hallo, anbei zwei "Kopiermakros" beim ersten werden nur die Werte kopiert Sub Makro1() Dim spalte1 As Integer 'Spalte $Benennung Dim spalte2 As Integer 'Spalte $PRP@Number Dim zeile As Integer 'Zeile Dim sh As Worksheet spalte1 = 3 'muss für Deine Anwendung angepasst werden spalte2 = 4 'muss für Deine Anwendung angepasst werden zeile = 2 'ev anpassen Set sh = ActiveSheet While sh.Cells(zeile, spalte1).Value <> "" sh.Cells(zeile, spalte1).Select Selection.Copy sh.Cells(zeile, spalte2).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False zeile = zeile + 1 Wend sh.Cells(1, 1).Select End Sub beim 2. werden Verweise erstellt Sub Makro2() Dim spalte1 As Integer 'Spalte $Benennung Dim spalte2 As Integer 'Spalte $PRP@Number Dim zeile As Integer 'Zeile Dim sh As Worksheet spalte1 = 3 'muss für Deine Anwendung angepasst werden spalte2 = 4 'muss für Deine Anwendung angepasst werden zeile = 2 'ev anpassen Set sh = ActiveSheet While sh.Cells(zeile, spalte1).Value <> "" sh.Cells(zeile, spalte2).Select ActiveCell.FormulaR1C1 = "=RC[" & Trim(Str(spalte1 - spalte2)) & "]" zeile = zeile + 1 Wend End Sub ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
realmadrid.de Mitglied -
Beiträge: 67 Registriert: 29.10.2012 NX SolidWorks2017
|
erstellt am: 03. Apr. 2018 15:35 <-- editieren / zitieren --> Unities abgeben:
Schon mal danke für die Antworten. Ich versuche jetzt seit ein paar Tagen immer mal wieder das ganze zum laufen zu bringen. Mit mehr als mäßigem Erfolg. Das scheitert schon daran, dass die definierten Variablen (zB. Dim sh As Worksheet) nicht akzeptiert werden. Mittels "Makro aufzeichnen" bekomme ich es zumindest hin die Excel Tabelle, die ja eine "Design Table" ist, aufzurufen. Dort kann ich allerdings gar nichts ansprechen. Auch der Befehl, den ich aus der API-Hilfe (Get Excel Design Table Worksheet Example) habe (DIM myWorksheet As Excel.Worksheet) wird mit "Benutzerdefinierter Typ nicht definiert" als Fehler beim komplimieren abgebrochen.... Ich bin da etwas ratlos
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2782 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 04. Apr. 2018 08:45 <-- editieren / zitieren --> Unities abgeben: Nur für realmadrid.de
Hallo, da du early binding verwendest, hast du in den Verweisen auch auf die "Microsoft Excel 1X.0 Object Library" verwiesen? Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
realmadrid.de Mitglied -
Beiträge: 67 Registriert: 29.10.2012 NX SolidWorks2017
|
erstellt am: 04. Apr. 2018 09:06 <-- editieren / zitieren --> Unities abgeben:
Edit: Doch, hab ich. Ändert allerdings nichts daran, dass es nicht funktioniert Bisher hat es immer so funktioniert mir den Code aus verschiedenen Makros rauszusuchen und zusammen zu schustern. Ist es denn überhaupt "ohne weiteres" mittels Makro in Solidworks die Design Table zu bearbeiten? Vom Grundprinzip her hatte ich es mir, glaube ich, etwas zu einfach vorgestellt. In Excel selbst sollte das ganze ja kein Problem sein... [Diese Nachricht wurde von realmadrid.de am 04. Apr. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1756 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 04. Apr. 2018 11:02 <-- editieren / zitieren --> Unities abgeben: Nur für realmadrid.de
Hallo, eigentlich ist es recht einfach, mit den Infos die Du hier schon erhalten hast. Anbei ein Beispiel (in der Zip-Datei ist ein Teil und das Makro) In dem Bauteil gibt es eine Design-Tabelle. Bevor das Makro gestartet wird sieht die Tabelle wie im Bild 1 aus. Nachdem das Makro gelaufen ist, sieht die Tabelle wie im Bild 2 aus. ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
realmadrid.de Mitglied -
Beiträge: 67 Registriert: 29.10.2012 NX SolidWorks2017
|
erstellt am: 04. Apr. 2018 11:22 <-- editieren / zitieren --> Unities abgeben:
|
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2782 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 04. Apr. 2018 11:28 <-- editieren / zitieren --> Unities abgeben: Nur für realmadrid.de
Hallo, Heinz war wohl schneller wie ich, trotzdem möchte ich meine Quick and Dirty Zusammenkopierte lösen auch teilen. Code: Option Explicit Sub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDesTable As SldWorks.DesignTable Dim myWorksheet As Excel.Worksheet Dim bRet As Boolean Dim spalte1 As Integer 'Spalte $Benennung Dim spalte2 As Integer 'Spalte $PRP@Number Dim zeile As Integer 'Zeile Set swApp = CreateObject("SldWorks.Application") Set swModel = swApp.ActiveDoc Set swDesTable = swModel.GetDesignTable bRet = swDesTable.Attach Set myWorksheet = swDesTable.Worksheet spalte1 = 3 'muss für Deine Anwendung angepasst werden spalte2 = 4 'muss für Deine Anwendung angepasst werden zeile = 3 'ev anpassen myWorksheet.Cells(zeile - 1, spalte2).Value = "$USER_NOTES" 'neue Spaltenüberschrift While myWorksheet.Cells(zeile, spalte1).Value <> "" myWorksheet.Cells(zeile, spalte1).Copy myWorksheet.Cells(zeile, spalte2) 'Kopieren der Werte von spalte1 nach spalte2 unterhalb der Spaltenüberschrift zeile = zeile + 1 Wend swDesTable.Detach Set myWorksheet = Nothing End Sub
Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
realmadrid.de Mitglied -
Beiträge: 67 Registriert: 29.10.2012 NX SolidWorks2017
|
erstellt am: 05. Apr. 2018 08:45 <-- editieren / zitieren --> Unities abgeben:
Eine Kleinigkeit noch. Ich würde gerne zu Beginn des Makros prüfen, ob überhaupt eine Tabelle hinterlegt ist. Das wollte ich folgendermaßen machen: Dim myDesignTable As SldWorks.designtable Set myDesignTable = ModelDoc.GetDesignTable() If myDesignTable Is Nothing Then MsgBox "KeineTabelle hinterlegt" Name = ModelDoc.GetPathName() swApp.CloseDoc Name ....
Aber irgendwie findet hier keine Überprüfung statt, und das Programm läuft einfach weiter, auch wenn keine Tabelle hinterlegt ist. Jemand ne Idee, wie man das anders prüfen kann?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ad_man Mitglied freiberuflicher Entwicklungsing. (Fahrzeugtechnik, CSWP, CPPA))
Beiträge: 1378 Registriert: 20.12.2003
|
erstellt am: 05. Apr. 2018 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für realmadrid.de
Hallo, versuche mal die Funktion Attach nach dem Objektaufruf zu verwenden: Code: Dim bRet As Boolean bRet = swDesTable.Attach
Wenn du false bekommst, dann existiert keine Tabelle oder es kann nicht zugegriffen werden. ------------------ ========== Gruß Andreas ========== Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |