Een gesloten excel lezen van SolidWorks in VBA (SW 2016)

Hallo

Ik wil graag de lijst van een ComboBox vullen met een Excel zonder de betreffende Excel te openen (mijn ComboBox zit in een SolidWorks-macro).

Ik moet dus cellen uit SolidWorks kunnen lezen in een Gesloten Excel.

 

Om in Excel een cel in een andere gesloten Excel te lezen , wordt de volgende VBA-code gebruikt:

'Lecture de la cellule A1 dans la Feuil1 du classeur fermé				

Wanneer ik deze code in SolidWorks probeer te gebruiken, krijg ik een compilatiefout die zegt dat de functie ExecuteExcel4Macri niet is gedefinieerd.

 

Heeft iemand een oplossing?       Bij voorbaat dank voor uw hulp.

Zie deze link 

https://www.developpez.net/forums/d1388072/logiciels/microsoft-office/excel/macros-vba-excel/macro-copier-plage-d-fichier-excel-ferme/

@+

3 likes

Hallo

Ik denk, zoals uitgelegd in de link die door gt22 wordt gegeven, dat het voor jou gemakkelijker zal zijn om aan een open Excel-bestand te werken. U kunt dit Excel-bestand openen, manipuleren, opslaan en vervolgens programmatisch sluiten in uw macro zonder het Excel-venster weer te geven, dus op een transparante manier voor de gebruiker.

Vriendelijke groeten

2 likes

Bovenal moet u het doel-Excel-bestand opslaan

Het was heel simpel... Ik krijg het volledige pad met ActiveWorkbook.Path en het werkt nu feilloos... De enige voorwaarde is dat mijn bronbestanden zich in dezelfde map of een submap van de werkmap bevinden... Geen probleem... Nogmaals bedankt! Ik heb dwaas genoeg een paar dagen verloren

onder dezelfde map of submap  om de links goed te laten werken

van wat ik begreep ;-(

@+

1 like

Als je het echt op een gesloten Excel wilt doen, zie: http://silkyroad.developpez.com/VBA/ClasseursFermes/ maar er lijken veel beperkingen te zijn op de mogelijkheden ...

2 likes

Zou je de verwijzingen naar Microsoft.Interop.Office en Microsoft.Interop.Excel niet toevallig missen?

Als deze verwijzingen niet zijn ingeschakeld, kunt u de functie ExecuteExcel4Macro() niet gebruiken, omdat deze niet bestaat in een assembly waarnaar wordt verwezen.

3 likes

Dank je wel Yves.T,

Ik miste de referentie "Microsoft Excel XX.X Object library".

Hoe weten we welke referenties nodig zijn voor welke code?

 

Anders, om mijn Combobox van stroom te voorzien, gebruikte ik de volgende code: 

Private Sub UserForm_Initialize()
Dim i As Byte
Dim e As String

i = 1
Do
    ComboBox1.AddItem ExecuteExcel4Macro("'C:\Documents and Settings\mimi\dossier\excel\[ClasseurBase.xlsx]Feuil1'!R" & i & "C1")
    i = i + 1
    e = ExecuteExcel4Macro("'C:\Documents and Settings\mimi\dossier\excel\[ClasseurBase.xlsx]Feuil1'!R" & i & "C1")

Loop While Len(e) > 1

End Sub

Denk je dat we een eenvoudigere code kunnen maken?

Waarom gebruik ik geen "ComboBox1.RowSource" die ik niet kon combineren met de ExecuteExcel4Macro()?

Het is niet ingewikkeld:

Als u een procedure of functie gebruikt die u hebt gemaakt, is er geen verwijzing om toe te voegen.

Als u een procedure of functie gebruikt die u niet hebt gemaakt, moet u een verwijzing toevoegen.

Als u op F1 drukt wanneer de cursor op een instructie staat, wordt de Help voor die functie/procedure geopend. De montage wordt aangegeven in de help.

Meer in het algemeen geldt dat als u Excel moet gebruiken, u de verwijzing naar Office (die de basisobjecten voor Office-toepassingen levert) en een verwijzing naar Excel (om toegang te hebben tot de specifieke objecten, procedures en functies van Excel) nodig hebt

Als u Word gebruikt, heeft u de verwijzing naar Office en Word nodig.

Om uw macro te vereenvoudigen, behalve als u een bereik als parameter kunt doorgeven aan de functie ExecuteExcel4Macro(), moet deze een array van tekenreeksen retourneren. Het enige dat u nog hoeft te doen, is de array binden aan de RowSource-eigenschap van de combobox. (Om te controleren of de waarde die door de macro wordt geretourneerd inderdaad een array van tekenreeksen is, zo niet, converteer deze dan)

Het is ook mogelijk om te doen zoals in de link voorgesteld door d.roger.

Het gebruik van ADO hiervoor is een beetje als het gebruik van een kernwapen om een mug te doden, maar het is grotendeels feestelijk. (zolang we het principe van ODA begrijpen)

Simpel gezegd, ADO is een set tools waarmee u toegang hebt tot gegevens, of het nu gaat om een SQL- of Access-database, een Excel-bestand, enz.

Het maakt gebruik van een database-engine, SQL-query's en een aanwijzer om gegevens op te halen. We openen een verbinding door de te gebruiken database-engine en het bestand op te geven, we stellen een vraag aan de database-engine (de SQL-query) en we bladeren door het resultaat van de query met de aanwijzer.

2 likes

OK bedankt voor deze informatie Yves.T,

Voor de ADO-methode is dit wat ik wilde vermijden: ontoereikende methode (te krachtig voor het simpele ding dat ik wil doen).

Dus ik blijf op de ExecuteExcel4Macro() functie .