Visites

   visiteurs

   visiteurs en ligne

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 eek cry


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 cry

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... wink
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

Se reconnecter
---

Votre nom (ou pseudo) :

Votre code secret


 Nombre de membres 1 membre


Connectés :

( personne )

Haut