VBA Excel --> Inventor

VBA Excel --> Inventor

e_boinot
Participant Participant
1 554 Visites
23 Réponses
Message 1 sur 24

VBA Excel --> Inventor

e_boinot
Participant
Participant

Bonjour,

Nouveau sur le forum, je sollicite votre aide pour un sujet de copie de données d'Excel vers un formulaire Inventor.
J'ai créé un formulaire qui s'affiche directement à l'ouverture d'une nouvelle pièce via un évènement déclencheur et une règle pour remplir les ipropriétés d'une pièce (nom, numéro, indice, etc). 
Je cherche à pré-remplir en automatique les champs de ce formulaire par un fichier Excel qui nous fait l'incrémentation des numéros de pièces (par exemple en "scannant" la ligne sélectionnée pour les différents champs nécessaires).
Est-ce possible, et si oui, pourriez-vous m'aider à mettre cela en place?
Pour vous situer, côté compétences, j'ai fait le fichier Excel de génération/incrémentation de pièces et d'indices, donc je connais la programmation vba Excel, mais ne sais pas comment faire le lien avec un autre logiciel comme Inventor.

Merci d'avance.

0 J'aime
Solutions acceptées (2)
1 555 Visites
23 Réponses
Replies (23)
Message 2 sur 24

vpeuvion
Advocate
Advocate

Bonjour,

Préremplir automatiquement les champs du formulaire me semble assez compliqué et même peut-être pas réalisable avec un formulaire Inventor.

Par contre, vous pouvez modifier directement les valeurs des ipropriétés par celles de cellules d'un fichier Excel.

Voici un exemple :

J'ai créé un fichier excel contenant des valeurs dans la colonne A.

vpeuvion_0-1698912071053.png

Dans une pièce Inventor, j'ai créé une iProperty "MaPropriété" dans l'onglet personnalisation.

J'ai créé une règle iLogic contenant ce code : 

GoExcel.Open("C:\Test.xlsx","Feuil1") ' Ouverture de la feuille nommée Feuil1 du fichier Excel Test.xlsx
iProperties.Value("Custom","MaPropriété") = GoExcel.CellValue("A3") ' MaPropriété est égale à la valeur de la cellule A3
GoExcel.QuitApplication 'Fermeture du fichier excel

vpeuvion_1-1698912407544.png

Après exécution de la règle, la valeur de la iProperty devient égale à celle de la cellule.

J'espère vous avoir aidé.

Vincent.

Message 3 sur 24

ThomasB44
Mentor
Mentor

Salut @e_boinot 

Commençons par le début :

  • Tu souhaites programmer dans Excel ? Donc en VBA ? Et piloter Inventor depuis Excel ?
  • Ou dans Inventor ? En VBA ou iLogic/VB.NET ? Et lire du Excel depuis Inventor ?

Comme tu souhaites utiliser un formulaire, je dirais iLogic ?


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

0 J'aime
Message 4 sur 24

e_boinot
Participant
Participant

Bonjour, tout d'abord merci pour votre aide et mes excuses pour mon retour tardif. Pas facile de concilier ce développement et le travail de tous les jours!

@vpeuvion : J'ai voulu tester votre code mais le code s'arrête des la première ligne (message: "erreur de syntaxe"). Il y a peut-être des lignes à écrire avant?

Le formulaire permet de compléter d'autres données, c'est pourquoi j'aurais aimé un préremplissage. Mais si ce n'est pas possible,  une modification directe des valeurs des ipropriété serait envisageable. Voir également la suite de ma réponse à @ThomasB44 pour la précision du besoin si nécessaire.

@ThomasB44 : Voici l'explication de notre process et ce que j'aimerais faire: Nous ouvrons un fichier Excel dans lequel nous remplissons un nom de pièce et qui génère un numéro, ou incrémente un numéro d'indice dans le cas d'une pièce existante. Côté Inventor, nous avons créé un formulaire en iLogic pour remplir les différentes propriétés de la pièce. Ce formulaire s'ouvre à chaque nouvelle pièce créée via une règle et un élément déclencheur. Nom, numéro et indice de pièce doivent être ceux générés par le fichier Excel.

L'idée serait:

- On ouvre le fichier Excel pour générer un numéro de pièce

- On remplit les champs dans ce fichier Excel

- On ouvre Inventor, fichier/Nouveau et on choisit le Gabarit disposant du formulaire

- A son ouverture, le formulaire vient chercher en automatique les champs de la ligne sélectionnée dans le fichier Excel.

Donc pour moi ce serait une macro dans Inventor qui va chercher les données dans Excel, mais je peux me tromper.

Voir image jointe pour plus de clarté.

0 J'aime
Message 5 sur 24

ThomasB44
Mentor
Mentor

Salut @e_boinot 

Dans ce cas l'exemple de code fournit par @vpeuvion est la bonne démarche.

Dans sa première ligne de code, il faut renseigner le fichier Excel, si le chemin et la feuille ne sont pas bons, le code retourne une erreur. Teste à nouveau avec un chemin valide.

Cette commande apparaît en violet car elle fait partie des commandes iLogic, elle n'a pas besoin de déclaration.

 

Comme celle-ci par exemple :

excel = GoExcel.CurrentRowValue("columnName")

 


Thomas
Mechanical Designer / Inventor Professional 2025
Inventor Professional EESignature

Message 6 sur 24

vpeuvion
Advocate
Advocate

Bonjour, est-ce que vous avez modifié la première ligne pour qu'elle corresponde à votre fichier Excel?

Est-ce que la feuille est bien nommée Feuil1?

Le code fonctionne bien de mon côté. 

Pour utiliser le formulaire et combiner des iPropriétés préremplies et d'autres remplies manuellement, ce code fonctionne aussi.

J'ai créé un formulaire contenant la iPropriété "MaPropriété" et un bouton exécutant la règle.

Lorsque j'ouvre le formulaire, la iPropriété est égale à 0 et lorsque j'exécute la règle depuis le formulaire, elle devient égale à la valeur de la cellule A3, le formulaire est mis à jour automatiquement et la valeur passe à 5000.

Voir vidéo en pièce jointe.

Vincent.

0 J'aime
Message 7 sur 24

e_boinot
Participant
Participant

Merci encore pour vos réponses.

Oui, j'ai bien adapté au nom de fichier et de feuille. Quand je modifie la ligne, voici le message

e_boinot_0-1699289324253.png

Et quand je lance la macro:

e_boinot_1-1699289384849.png

 

 

 

0 J'aime
Message 8 sur 24

vpeuvion
Advocate
Advocate

L'exemple a été fait pour une règle iLogic.

Dans l'onglet Ilogic/Règles faites un clic droit et cliquez sur Ajouter une règle.

vpeuvion_0-1699290101898.png

 

Vous pouvez copier/coller l'exemple de code en changeant les paramètres de votre document Excel et exécuter la règle.

Si vous voulez que la règle s'exécute à l'ouverture du document, vous pouvez utiliser les évènements déclencheurs.

 

2023-11-06_17-59-29.png

 Vincent.

0 J'aime
Message 9 sur 24

vpeuvion
Advocate
Advocate
Solution acceptée

Bonjour,

Si d'après l'image que vous avez posté, vous voulez obtenir les informations des colonnes E,F et G de la ligne sélectionnée d'un fichier Excel ouvert, vous pouvez essayer ce code dans une règle iLogic.

Il se connecte à l'application Excel ouverte et va rechercher les valeurs des cellules de la ligne sélectionnée et des colonnes E,F et G.

Vous devez ajouter en référence dans l'En-tête : Microsoft.Office.Interop.Excel.dll pour qu'il fonctionne.

Vous devrez peut-être la télécharger.

AddReference "C:\Projects\packages\Microsoft.Office.Interop.Excel.15.0.4795.1001\lib\net20\Microsoft.Office.Interop.Excel.dll"
Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices
Sub Main
	Dim ExcelApp As Excel.Application = Nothing
	Try
	  ExcelApp = CType(Marshal.GetActiveObject("Excel.Application"), Excel.Application) 'Connexion à l'application Excel active.
	Catch ex As Exception
		MessageBox.Show(ex.Message)
		Exit Sub
	End Try
	iProperties.Value("Custom","INDICE") = ExcelApp.Worksheets(1).Cells(ExcelApp.ActiveCell.Row, 5).value ' Valeur de la cellule (ligneActive, colonne E) de la première feuille
	iProperties.Value("Custom","NOM") = ExcelApp.Worksheets(1).Cells(ExcelApp.ActiveCell.Row, 6).value ' Valeur de la cellule (ligneActive, colonne F) de la première feuille
	iProperties.Value("Custom","REF_ETUDE") = ExcelApp.Worksheets(1).Cells(ExcelApp.ActiveCell.Row, 7).value ' Valeur de la cellule (ligneActive, colonne G) de la première feuille
	
End Sub

 

vpeuvion_0-1699346967647.png

Vincent.

Message 10 sur 24

e_boinot
Participant
Participant

Mea Culpa, j'étais passé trop vite sur la mention "J'ai créé une règle iLogic..." de votre premier message. Je ne connais pas trop iLogic, et le code m'avait fait penser à du VBA, et comme je pensais que ce n'était possible qu'avec du VBA...

J'étais en train d'essayer le code de votre premier post en adaptant car Excel sera déjà ouvert. Mais je viens de voir que vous avez envoyé un nouveau  message sur lequel je vais me pencher.

Message 11 sur 24

e_boinot
Participant
Participant

@vpeuvion : Merci beaucoup, avec le dernier post, cela fonctionne à merveille! Juste une question, qu'est ce qui diffère entre votre premier post et le dernier, et le fait qu'il faille utiliser cette bibliothèque ddl?

Si je peux encore abuser de vos connaissances, autre question (un peu hors-sujet par rapport au titre du fil), savez-vous s'il est possible de rendre certains champs obligatoires (donc non facultatifs) dans un formulaire d'ipropriétés? Et donc Rendre la validation du formulaire impossible tant que toutes champs obligatoires n'ont pas été remplis?

Merci.

0 J'aime
Message 12 sur 24

vpeuvion
Advocate
Advocate

Content que ça fonctionne.

Le premier post utilise l'interface IGoExcel disponible dans l'API d'iLogic. C'est en quelque sorte un outil pour accéder à un fichier Excel depuis iLogic. Avec cette interface, il est très facile d'aller lire ou écrire des informations dans un fichier Excel lorsque que l'on connaît l'emplacement de la cellule.

https://help.autodesk.com/view/INVNTOR/2022/ENU/?guid=af87c7b4-cf59-8cce-c207-cbd8a3b6632e

Au départ je pensais que c'est ce qui correspondait le mieux à votre besoin.

Après avoir vu l'image en pièce jointe, vous aviez besoin de savoir quelle ligne était sélectionnée pour récupérer les valeurs. A ma connaissance, on ne peut pas récupérer la ligne active avec l'interface IGoExcel.

Dans le dernier post, l'import de la bibliothèque permet de piloter directement l'application Excel.

https://learn.microsoft.com/fr-fr/dotnet/api/microsoft.office.interop.excel.application?view=excel-p...

Pour résumer dans le premier post j'accède au fichier Excel depuis iLogic et dans le dernier, j'accède à l'application Excel ouverte.

Concernant les champs obligatoires dans les formulaires, à ma connaissance, il n'y a pas d'option pour les rendre obligatoires.

Je vous suggère de poser cette question dans un nouveau post, peut-être que d'autres personnes ont la solution ou ont trouvé une solution pour contourner ce problème.

Vincent.

0 J'aime
Message 13 sur 24

e_boinot
Participant
Participant

@vpeuvion. Merci beaucoup pour les explications, les liens proposés pour bien comprendre et surtout le temps passé à me répondre!

J'aurais une autre demande, j'aimerais aussi que la règle vérifie qu'Excel soit bien ouvert ET que le bon fichier soit actif (au cas où plusieurs fichiers Excel sont ouverts). Dans le cas contraire, un message d'erreur. Est-ce possible?

Pour les champs obligatoires dans les formulaires, je vais poser une autre question sur le forum, merci.

0 J'aime
Message 14 sur 24

vpeuvion
Advocate
Advocate
Solution acceptée

Oui c'est possible, voici un exemple commenté :

AddReference "C:\Projects\packages\Microsoft.Office.Interop.Excel.15.0.4795.1001\lib\net20\Microsoft.Office.Interop.Excel.dll"
Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices

 

Sub Main
	Dim ExcelApp As Excel.Application = Nothing
	Try ' Essaye de se connecter à l'application Excel active
	  ExcelApp = CType(Marshal.GetActiveObject("Excel.Application"), Excel.Application) ' Connexion à l'application Excel active.
	Catch ex As Exception ' Si échec : Affichage message d'erreur
		MessageBox.Show("Aucune application Excel ouverte : Ouvrir le fichier NumeroPieces.xlsx","Erreur",MessageBoxButtons.OK,MessageBoxIcon.Warning)
		Exit Sub ' Si échec : quitte le programme
	End Try

	If ExcelApp.ActiveWorkbook.Name = "NumeroPieces.xlsx" Then ' Si le fichier Excel actif est NumeroPieces.xlsx alors essai de copie des valeurs
		Try ' Essaye de copier les valeurs
			iProperties.Value("Custom","INDICE") = ExcelApp.Worksheets(1).Cells(ExcelApp.ActiveCell.Row, 5).value ' Valeur de la cellule (ligneActive, colonne E) de la première feuille
			iProperties.Value("Custom","NOM") = ExcelApp.Worksheets(1).Cells(ExcelApp.ActiveCell.Row, 6).value ' Valeur de la cellule (ligneActive, colonne F) de la première feuille
			iProperties.Value("Custom", "REF_ETUDE") = ExcelApp.Worksheets(1).Cells(ExcelApp.ActiveCell.Row, 7).value ' Valeur de la cellule (ligneActive, colonne G) de la première feuille
		Catch ex As Exception ' Si échec : affichage message d'erreur
			MessageBox.Show("Erreur pendant le transfert des données : " & ex.Message,"Erreur",MessageBoxButtons.OK,MessageBoxIcon.Warning)
		End Try
	Else ' Sinon affichage message d'erreur
		MessageBox.Show("Le fichier NumeroPieces.xlsx n'est pas actif ou n'est pas ouvert : Ouvrir le fichier NumeroPieces.xlsx ou le rendre actif","Erreur",MessageBoxButtons.OK,MessageBoxIcon.Warning)
	End If
End Sub

Vérifiez que le nom du fichier Excel et que l'extension correspondent bien à votre fichier.

vpeuvion_2-1699374827011.png

Vincent.

 

 

 

0 J'aime
Message 15 sur 24

e_boinot
Participant
Participant

Merci Vincent, cela répond complètement au besoin, avec les explications détaillées en plus, pour pouvoir progresser dans la compréhension. C'est parfait.

Message 16 sur 24

e_boinot
Participant
Participant

@vpeuvion 

Bonjour Vincent,

J'ai une nouvelle demande. Sur le poste d'un de mes collègues, la règle ilogic ne fonctionne pas, le message d'erreur mentionne qu'aucune application Excel n'est ouverte. Pourtant, Excel est bien ouvert. La seule différence est qu'il dispose d'Office 365 apps for business alors que tous les autres disposent d'Office 2019 Pro Plus. Cela peut-il être la cause? Si oui, comment corriger? Une bibliothèque .dll différente? Si non, une idée de la cause potentielle?

Merci.

0 J'aime
Message 17 sur 24

vpeuvion
Advocate
Advocate

Bonjour, je ne pense pas que ce soit la cause. J'utilise Office 365 Apps for entreprise et ça fonctionne bien de mon côté.

Est-ce que le fichier Excel est bien ouvert sur l'application et pas dans le navigateur?

Essayez ce code dans une règle ilogic sur votre poste et celui de votre collègue. Il affiche toutes les applications ouvertes dans le journal iLogic et affiche un message s'il trouve l'application Excel.

For Each oProcess As Process In Process.GetProcesses
	Logger.Info(oProcess.ProcessName)
	If oProcess.ProcessName.Contains("EXCEL") Then MessageBox.Show(oProcess.ProcessName)
Next

vpeuvion_0-1700067577754.png

Vincent.

 

Message 18 sur 24

e_boinot
Participant
Participant

Vincent, il ouvre bien l'application Excel, et non pas dans le navigateur. J'ai testé le code et effectivement, si Excel est ouvert, la MsgBox s'ouvre bien et on voit le processus dans le journal iLogic. Par contre, il y a toujours le message d'erreur mentionne qu'aucune application Excel n'est ouverte à l'ouverture de la pièce. Une idée?

0 J'aime
Message 19 sur 24

vpeuvion
Advocate
Advocate

Bonjour, bizarre. Est-ce que vous pouvez essayer ce code sur le poste de votre collègue et me donner une capture des 2 messages d'erreur qui apparaissent?

AddReference "C:\Projects\packages\Microsoft.Office.Interop.Excel.15.0.4795.1001\lib\net20\Microsoft.Office.Interop.Excel.dll"
Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices

 

	Dim ExcelApp As Excel.Application = Nothing
	Try 
	  ExcelApp = CType(Marshal.GetActiveObject("Excel.Application"), Excel.Application) 
	Catch ex As Exception 
		MessageBox.Show(ex.Message)
	End Try
	ExcelApp = CType(Marshal.GetActiveObject("Excel.Application"), Excel.Application) 

 Vincent.

0 J'aime
Message 20 sur 24

e_boinot
Participant
Participant

Merci Vincent,

voici les 2 messages d'erreur:

image.png

image (1).png

0 J'aime