|
Sujet n°85 |
Fonction Excel dans Access
par Marsouin_89
le 31/05/2007 : 10:04 |
Bonjour à tous,
Je cherche à utiliser les fonction ProduitMat, InverseMat et Transpose de Excel mais en Vb dans Access.
Merci de bien vouloir me renseigner.
Bonne journée
Marsouin |
Réponse n° 1 |
par Marsouin_89
le 06/07/2007 : 12:57 |
Bonjour Pierre, En ajoutant la bibliothèque Excel dans les références, j'ai accès aux fonctions Produitmat(Mmult), Inversemat(Minverse) et Transpose(Transpose) en utilisant la fonction WorkSheetFunction. Seulement je ne sais pas comment faire référence aux cellules de ma requête comme dans Excel. Exemple Excel : X=worksheetfunction.Mmult(A1:B4) Sachant que le nombre de ligne est variable Pourriez vous m'éclairer dans ce sens. Merci beaucoup Marsouin |
Réponse n° 2 |
par 3stone le 06/07/2007 : 13:13 |
Bonjour,
Pour piloter une feuille Excel à "distance" il faut utiliser ce que l'on appelle l'automation.
Regarde dans l'aide d'Access, il y a des exemples et un petit exemple ici.
Une fois compris le fonctionnement, cela devient simple. Pour le code Excel, le plus rapide est de créer la macro avec l'enregistreur du coté Excel et d'en récupérer le code.
Il reste à le placer dans le code coté Access.
Pierre
|
Réponse n° 3 |
par Marsouin_89
le 06/07/2007 : 17:19 |
Pierre, Merci d'avoir répondu si rapidement, mais je n'arrive pas à voir comment je peux mettre en application ce que je souhaite faire. Je penses en fait que cela devient trop compliqué pour mes maigres compétences. Etre autodidacte a ses limites. Merci encore et j'essaierais de revoir ce projet d'ici quelques temps Marsouin |
Réponse n° 4 |
par marsouin
le 09/07/2007 : 22:11 |
Bonsoir Pierre, Etant quelque peu tête de mule, je me suis penché sur mon problème avec vos conseils. J'ai réussi à en tirer le code suivant. Dans ce code, j'exporte une requête en fichier Excel avec des données afin d'y effectuer un calcul. Ensuite je récupère le résultat dans Access afin de pouvoir le stocker en archive et je supprime le fichier Excel. Toutefois, lorsque je lance plusieurs fois ma procédure j'ai le message suivant : "Erreur 1004 La méthode worksheets de l'objet global a échoué. J'ai cherché sur différent site Internet mais sans résultats qui pourraint me guider. Je me remet donc à vos compétences pour m'aider. Merci beaucoup Marsouin Mon code : Sub Export() Dim xlapp As Excel.Application 'est Excel Dim xlBook As Excel.Workbook 'est un classeur Dim xlRange As Variant 'Est une cellule Dim xlWks As Excel.Worksheet 'Est une feuille Dim FichierXL As String 'Nom du fichier Excel Dim Boucle, cmpt As Integer 'Boucle=compteur , cmpt=Compte du nombre de stations (valeur entière) FichierXL = "Blablabla\Calcul3.xls" 'Nom du fichier DoCmd.TransferSpreadsheet acExport, 8, "Inter_Export_Excel", _ FichierXL 'Export des données de stations en fichier Excel (X, Y, Cos, Sin inverse, Dist fictive) Set xlapp = CreateObject("Excel.Application") 'Ouverture d'Excel Set xlBook = xlapp.Workbooks.Open(FichierXL) 'Ouverture du fichier Set xlWks = xlBook.ActiveSheet 'Avtivation de la feuille Set xlRange = xlWks.Range("A1:A65535") 'Création de la plage de cellules. xlWks.Range("A1:E1").Delete 'Suppression des titres de colonnes xlWks.Name = "Feuil1" 'Le nom de la feuille est renommée ''Feuil1'' cmpt = DCount("X", "Nom Requête") 'Compte le nombre de station Dim cel1 As String xlRange.Range("G3") = cmpt 'Saisie du nombre de stations dans la feuille Excel cel1 = xlRange.Cells(3, 7) ' valeur du nombre de stations (Variable) 'Calcul par moindre carré du point approché xlRange.Range("G1:G2") = WorksheetFunction.MMult(WorksheetFunction.MMult( _ WorksheetFunction.MInverse(WorksheetFunction.MMult(WorksheetFunction.Transpose(Worksheets("Feuil1").Range("C1:D" & cel1)), _ Worksheets("Feuil1").Range("C1:D" & cel1))), WorksheetFunction.Transpose(Worksheets("Feuil1").Range("C1:D" & cel1))), _ Worksheets("Feuil1").Range("E1:E" & cel1)) 'définition des formules pour calcul du point def For Boucle = 1 To cmpt xlRange.Cells((Boucle), 8).Formula = Sqr((xlRange.Cells((Boucle), 1) - xlRange.Range("G1")) ^ 2 _ + (xlRange.Cells((Boucle), 2) - xlRange.Range("G2")) ^ 2) 'racine((X_station-X_app)^2+(Y_station-Y_app)^2) Next Boucle For Boucle = 1 To cmpt xlRange.Cells((Boucle), 9).Formula = Sqr((xlRange.Cells((Boucle), 1) - xlRange.Range("M1")) ^ 2 _ + (xlRange.Cells((Boucle), 2) - xlRange.Range("M2")) ^ 2) 'racine((X_station-X_def)^2+(Y_station-Y_def)^2) Next Boucle For Boucle = 1 To cmpt xlRange.Cells((Boucle), 10).Formula = xlRange.Cells((Boucle), 3) / xlRange.Cells((Boucle), 8) 'Formule 1° ligne : valeur de la cellule J1=C3/H1 Next Boucle For Boucle = 1 To cmpt xlRange.Cells((Boucle), 11).Formula = xlRange.Cells((Boucle), 4) / xlRange.Cells((Boucle), 8) 'Formule 1° ligne : valeur de la cellule K1=D3/H1 Next Boucle For Boucle = 1 To cmpt xlRange.Cells((Boucle), 12).Formula = xlRange.Cells((Boucle), 5) / xlRange.Cells((Boucl |
Réponse n° 5 |
par marsouin
le 10/07/2007 : 00:04 |
Rebonsoir Pierre, Je viens de m'apercevoir que le code n'était pas entier dans mon dernier mail. En voici la suite. Merci Marsouin For Boucle = 1 To cmpt xlRange.Cells((Boucle), 12).Formula = xlRange.Cells((Boucle), 5) / xlRange.Cells((Boucle), 8) 'Formule 1° ligne : valeur de la cellule L1=E3/H1 Next Boucle 'Calcul par moindre carré du point def xlRange.Range("M1:M2") = WorksheetFunction.MMult(WorksheetFunction.MMult( _ WorksheetFunction.MInverse(WorksheetFunction.MMult(WorksheetFunction.Transpose(Worksheets("Feuil1").Range("J1:K" & cel1)), _ Worksheets("Feuil1").Range("J1:K" & cel1))), WorksheetFunction.Transpose(Worksheets("Feuil1").Range("J1:K" & cel1))), _ Worksheets("Feuil1").Range("L1:L" & cel1)) Form_Calcul.XApp = xlRange.Range("G1") 'inscription du X app dans Access Form_Calcul.Yapp = xlRange.Range("G2") 'inscription du Y app dans Access Form_Calcul.XDef = xlRange.Range("M1") 'inscription du X Def dans Access Form_Calcul.Ydef = xlRange.Range("M2") 'inscription du Y Def dans Access xlapp.Visible = True 'Excel est invisible xlWks.Activate xlRange.Cells(1, 1).Select 'Selection de la cellule A1 xlapp.DisplayAlerts = False 'Le message d'enregistrement est désactivé xlBook.Close True 'Fermer le fichier xlapp.Quit 'Fermerture d'excel xlapp.DisplayAlerts = True 'Le message d'enregistrement est réactivé Set xlRange = Nothing Set xlWks = Nothing Set xlBook = Nothing Set xlapp = Nothing Kill FichierXL 'Destruction du fichier Excel End sub
|
Réponse n° 6 |
par 3stone le 10/07/2007 : 14:09 |
Bonjour,
J'ai survolé ton code... Pas la possibilté - ni le temps de tester plus avant, mais s'il fonctionne correctement une première fois, il faudrait bien vérifier de fermer (close) et libérer (set objet = nothing) tous les objets déclarés.
Note: Le "Dim boucle" n'est pas typé et est donc déclaré Variant.
Pierre
|
Réponse n° 7 |
par marsouin
le 10/07/2007 : 15:44 |
Bonjour Pierre, Merci de votre réponse. J'ai déclarer la Boucle comme Integer et rien n'y a changé. Toutefois, une fois de plus, vos conseils m'ont inspirés. Il suffisait de changer dans les 2 formules des moindre carrés "WorkSheet("Feuil1")" par la variable objet Xlwks et là tout fonctionne à merveille (enfin j'espère, je dois faire encore quelques tests). Vous venez encore de me retirer un grosse épine du pied. Merci encore, vous êtes génial et un aide des plus précieux pour des débutants comme moi. Marsouin |
[ Retour à la liste des sujets ]
| Recherche
Préférences
1 membre
Connectés :
( personne )
|