| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Der größte Rechenreiniger der Welt bei MUHR (SOLIDWORKS, SOLIDWORKS Simulation), ein Anwenderbericht
|
Autor
|
Thema: mit SldWorks Makro auf ein bestimmtes Excel-Tabellenblatt zugreifen (2604 / mal gelesen)
|
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 SW 2017 / Excel 2010
|
erstellt am: 24. Aug. 2017 09:51 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe bereits ewig gesucht und vielleicht suche ich auch einfach mit den falschen Begriffen... Nun hoffe ich, dass ihr mir helfen könnt. Von VBA-Programmierung in Excel habe ich recht gute Kenntnisse, allerdings scheint das in SolidWorks doch sehr anders zu sein... Und da steckt auch schon mein Problem. Aufgabe: Werte aus einer geöffneten Tabelle (hier: Behälterkonfigurator_Test.xlsm), aber einem nicht aktiven Tabellenblatt (hier: Konfi) auslesen und als Maß hinterlegen. ich habe es geschafft, das aktuelle Tabellenblatt zu verwenden, jedoch fehlt mir der Sprung zu einem nicht aktiven Tabellenblatt. Nachfolgend der Code: Dim swApp, Part As Object Dim Part1, Part2, Part3, Part4 As SldWorks.ModelDoc2 Dim myDimension, myD1, myD2, myD3, myD4 As Object Dim objSource As Object Dim xl As Excel.Application Dim Errors As Long Dim Warnings As Long Dim Name1, Name2 As String Sub main() Set swApp = CreateObject("SldWorks.Application") 'Set Part1 = swApp.ActiveDoc Set Part1 = swApp.OpenDoc6("X:\Technikerarbeit\3D_Teile\Muffe.SLDPRT", swDocPART, swOpenDocOptions_Silent, "", Errors, Warnings) 'objSource = Tabelle, aus der die Daten geholt werden sollen. Set xl = CreateObject("Excel.Application") Set objSource = xl.Workbooks("Behälterkonfigurator_Test.xlsm").Worksheets("Konfi") 'hier entsteht der Fehler Set swApp = Application.SldWorks
... Plan B wäre ein 2-dimensionales Array zu erstellen, allerdings verstehe ich dazu die Syntax nicht... Vielleicht hat ja jemand eine Idee. Vielen Dank im Voraus. Gruß, Kristina
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2580 Registriert: 02.10.2006 Firma: SW 2024-3.1 + 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: 24. Aug. 2017 10:31 <-- editieren / zitieren --> Unities abgeben: Nur für Thunja
Hallo Kristina, und herzlich Willkommen hier im Forum. Ich kopiere mal einen Auszug aus meinem Makro. Evtl. hilft dir das weiter.
Code: 'öffne mit Excel eine bestehende Tabelle und aktiviere ein Blatt Dim xlApp As New Excel.Application Dim xlWb As Excel.Workbook Dim xlWs As Excel.Worksheet 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
Grüße und viel Erfolg, Andi
------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 SW 2017 / Excel 2010
|
erstellt am: 24. Aug. 2017 10:54 <-- editieren / zitieren --> Unities abgeben:
Hallo Andi, vielen Dank für deine schnelle Antwort. Ich habe grad deine Version komplett übernommen, jedoch erhalte ich dann die Fehlermeldung "Index außerhalb des gültigen Bereichs" bereits in der Zeile, wo das Workbook geöffnet werden soll. Dann habe ich gedacht, vielleicht findet er die Datei nicht und habe statt nur die Datei anzugeben auch den kompletten Pfad mit angegeben. Auch das möchte er nicht. Darüber hinaus ist meine Tabelle auf jeden Fall schon geöffnet, wenn das Makro in SW startet. Gruß, Kristina [Diese Nachricht wurde von Thunja am 24. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2580 Registriert: 02.10.2006 Firma: SW 2024-3.1 + 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: 24. Aug. 2017 11:03 <-- editieren / zitieren --> Unities abgeben: Nur für Thunja
Hallo, evtl. hilft das. Den Pfad musst du natürlich anpassen. Code: Dim sPath As String sPath = "C:\Arbeitsverzeichnis\Behälterkonfigurator_Test.xlsm"
Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 SW 2017 / Excel 2010
|
erstellt am: 24. Aug. 2017 11:12 <-- editieren / zitieren --> Unities abgeben:
Hallo Andi, den Pfad hatte ich als String direkt reingelegt. Leider hat das nicht funktioniert. Allerdings habe ich das .Open vergessen... Dann funktioniert dein Quellcode natürlich einwandfrei. Ich bin am Überlegen, ob der Nutzer des Makros eventuell einfach zuvor die entsprechende Excel-Mappe schließen soll. Denn dann hättest du mein Problem gelöst. javascript:InsertSMI(' %20'); Allerdings wäre es eigentlich besser, wenn sie aufbleiben könnte, da die SW-Anwendung mit der Excel-Anwendung zusammen ein Projekt bildet. Trotz allem vielen Dank für deine Hilfe!!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2580 Registriert: 02.10.2006 Firma: SW 2024-3.1 + 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: 24. Aug. 2017 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für Thunja
Hallo, ich habe jetzt grade keinen Code parat, der sich an ein offenes Excel anklingt. Allerdings müsstest du ja auch sicher sein, dass auch das richtige Excelsheet geöffnet ist, falls da noch ein anderes zufällig offen ist. Also sowas wie Active-xxx reicht sicherlich nicht. Aber evtl. reicht dir einfach, vorher Excel oder die Tabelle zu schließen und es erneut zu öffnen. Code: Excel.Workbooks.Close 'nur Tabelle schließen Excel.Application.Quit 'Excel schließen
Vielleicht kommt hier noch jemand und hat den passenden Code parat. Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 SW 2017 / Excel 2010
|
erstellt am: 24. Aug. 2017 11:29 <-- editieren / zitieren --> Unities abgeben:
|
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 SW 2017 / Excel 2010
|
erstellt am: 24. Aug. 2017 14:28 <-- editieren / zitieren --> Unities abgeben:
Also im Nachhinein habe ich es nun funktionsfähig geschrieben, sodass auch das Excel-Dokument geöffnet bleiben kann. javascript:InsertSMI(' '); Der Codeschnipsel lautet dann so: Dim swApp, Part As Object Dim Part1 As ModelDoc2 Dim Part2 As ModelDoc2 Dim Part3 As ModelDoc2 Dim Part4 As ModelDoc2 Dim myDimension, myD1, myD2, myD3, myD4 As Object Dim objSource As Object Dim xl As Object Dim Errors As Long Dim Warnings As Long Dim Name1, Name2 As String Sub main() Set swApp = CreateObject("SldWorks.Application") 'Set Part1 = swApp.ActiveDoc Set Part1 = swApp.OpenDoc6("X:\Technikerarbeit\3D_Teile\Muffe.SLDPRT", swDocPART, swOpenDocOptions_Silent, "", Errors, Warnings) Set swApp = Application.SldWorks 'Verbindung zum Excel-Dokument Set xl = GetObject("X:\Technikerarbeit\Testdateien\Behälterkonfigurator_Test.xlsm") 'Auswahl des Tabellenblatts Set objSource = xl.worksheets("Konfi") Set myDimension = Part1.Parameter("D1@Skizze1") 'bei Eingabe 20 (mm) in Excel wird SolidWorks es als 20.000 mm verarbeiten, da die API-Funktionen auf m ausgelegt sind. 'Siehe API-Hilfeseiten (Change dimensions) myDimension.Value = objSource.Cells(2, 2) 'swApp.SendMsgToUser (objSource.cells(2, 2)) Part1.ClearSelection2 True Vielen Dank nochmals an Andi, du hast mich weitergebracht. LG, Kristina Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2580 Registriert: 02.10.2006 Firma: SW 2024-3.1 + 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: 25. Aug. 2017 11:33 <-- editieren / zitieren --> Unities abgeben: Nur für Thunja
Hallo Kristina, freut mich für dich, dass du es so schnell lösen konntest. Ich hatte gestern keine Zeit mehr, nach dem richtigen Befehl zu suchen. Deinen Code würde ich nur noch etwas korrigieren wollen. Achte auf Set swApp, 1x reicht. Um auch Intellisense verwenden zu können, deklariere ich meine Variablen nicht mit Object. Beispiel: Code: Option ExplicitDim swApp As SldWorks.SldWorks Dim Part As SldWorks.ModelDoc2 Dim Part1 As SldWorks.ModelDoc2 'SldWorks.PartDoc Dim Part2 As SldWorks.ModelDoc2 Dim Part3 As SldWorks.ModelDoc2 Dim Part4 As SldWorks.ModelDoc2 Dim myDimension, myD1, myD2, myD3, myD4 As SldWorks.Dimension Dim objSource As Excel.Worksheet Dim xl As Excel.Workbook Dim Errors As Long Dim Warnings As Long Dim Name1, Name2 As String Sub main() Set swApp = Application.SldWorks Set Part1 = swApp.OpenDoc6("X:\Technikerarbeit\3D_Teile\Muffe.SLDPRT", swDocPART, swOpenDocOptions_Silent, "", Errors, Warnings) 'Verbindung zum Excel-Dokument Set xl = GetObject("X:\Technikerarbeit\Testdateien\Behälterkonfigurator_Test.xlsm") 'Auswahl des Tabellenblatts Set objSource = xl.Worksheets("Konfi") Set myDimension = Part1.Parameter("D1@Skizze1") 'bei Eingabe 20 (mm) in Excel wird SolidWorks es als 20.000 mm verarbeiten, da die API-Funktionen auf m ausgelegt sind. 'Siehe API-Hilfeseiten (Change dimensions) myDimension.Value = objSource.Cells(2, 2) 'swApp.SendMsgToUser (objSource.cells(2, 2)) Part1.ClearSelection2 True
zum Thema Intellisense kannst du mal hier reinschauen. http://www.online-excel.de/excel/singsel_vba.php?f=4 Viel Spaß noch und bis bald, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) [Diese Nachricht wurde von Andi Beck am 25. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thunja Mitglied Projektleiterin / techn. Redakteurin
Beiträge: 41 Registriert: 22.08.2017 SW 2017 / Excel 2010
|
erstellt am: 25. Aug. 2017 11:46 <-- editieren / zitieren --> Unities abgeben:
Die swapp-Zeile ist mir auch aufgefallen. Und gut, dass du es sagst. das Option explicit habe ich vollkommen vergessen, da ich bei Excel das zuvor irgendwann einmal eingestellt habe. Danke! P.S.: Der Link wurde gelesen und dein Vorschlag umgesetzt!
[Diese Nachricht wurde von Thunja am 25. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|