none
VBA : problème enchainement de module sous Access 2010 RRS feed

  • Question

  • Bonjour,

    Je suis actuellement entrain de migrer des traitements VBA sur Windows 7 - Pack Office 2010 (avant Windows XP - Pack Office 2002)

    Je lance via Access plusieurs générations de fiches Excel. Tout se déroule normalement si je lance un module puis un autre.

    Mais si je lance une macro avec l'execution de 2 modules cela ne fonctionne pas : il fait correctement les générations du premier module (ouverture/fermeture d'Excel) mais ne fais rien pour le second (n'arrive pas à rouvrir Excel)). Quand je fais du pas à pas cela fonctionne très bien (du coup, j'ai du mal à résoudre le problème).

    J'ai l'impression qu'Access perds sa connection avec Excel. Je n'arrive pas à savoir d'où peut venir le problème. Je viens de constater que cela me fait ce problème si je lance la base Access lorsqu'elle est enregistrée sur le disque C/:. Par contre, si elle se situe sur un serveur de fichier NAS je n'ai pas de problème.

    Avez-vous des solutions pour mon problème ?

    Merci d'avance.

     

    jeudi 11 juillet 2013 14:58

Toutes les réponses

  • Bonjour,

    Concernant les droits sur le disque C:/ voilà ce que j'ai :

    - Lecture et execution : autoriser

    - Affichage du contenu du dossier : autoriser

    - Lecture : autoriser

    La base Access est à la racine d'un dossier et les fichiers excels à ouvrir sont dans un sous-dossier( du disque local C:/). Les fichiers sauvegardés le sont dans un autre dossier du disque local C:/.

    Lorsque j'ouvre la base Access du serveur de fichier (via l'Access installé sur le disque local), les fichiers Excels à ouvrir sont également dans un sous dossier du serveur. Par contre les fichiers Excels sauvegardés sont sur le disque local C:/

    Pour info, voici quelques morceaux de codes :
    - Fonction DISPERSION : module principal (jusqu'à l'ouverture de la maquette Excel
    - Fonction openMaquette : ouverture de la maquette Excel via la fonction getNewClass
    - Fonction getNewClass : définition d'une nouvelle classe
    - Module de classe Excel

    Private Const csMaquette As String = "TdB_Dispersion.xls"
    Private Const csFolderResultat = "C:\TDB_DISPERSION"
    Dim ws As Worksheet

    Function DISPERTION() As Long
    Dim sSql As String
    Dim lRow As Long
    Dim sIndicateur As String
    Dim rstUnite As Recordset
    Dim h As Long
    Dim sunite As String
    Dim rstUniteMere As Recordset
        '-------------------------------------------------------
        Call addKeys2Source("niv", False)
        '-------------------------------------------------------
        Set clDb = getnewclasse("clsDB", True, CurrentDb)
        Call attacheTablesApp("attache", "attache_data")
        '-------------------------------------------------------
        Call openMaquette(csMaquette, ws)
       
    .....
    End Function

    Function openMaquette(sMaquette As String, ByRef ws As Worksheet, Optional bXLSVisible As Boolean = False) As Workbook
    Dim sPath As String
    Dim sFile As String
       
        On Error GoTo GestionErr
        '---------------------------------------------
        If xls Is Nothing Then
            Set xls = getNewClass("xls", True, bXLSVisible)
        ElseIf xls.xls Is Nothing Then
            Set xls = Nothing
            Set xls = getNewClass("xls", True, bXLSVisible)
        End If
       
        sPath = getFolderGeneration(0, 0, gsFolderMaquette)
        sFile = sPath & sMaquette
       
        Set wb = xls.openWB(sFile, "maquette")
        Set ws = wb.Worksheets(1)
        Set openMaquette = wb

    End Function

    Function getNewClass(sName As String, bInitialize As Boolean, ParamArray tParams() As Variant) As Variant
    Dim cl As Variant
           
        Select Case sName
        '========================================================================
        'classes communes
        Case "clsParams", "Params":         Set cl = New clsParams
        Case "clsIniFile", "IniFile":       Set cl = New clsIniFile
        Case "clsShell", "Shell":           Set cl = New clsShell
        Case "clsAutoExec", "AutoExec":     Set cl = New clsAutoExec
        Case "clsProcess", "Process":       Set cl = New clsProcess
       
        #If libApp = 1 Then
            Case "clsExcel", "Excel", "xls":    Set cl = New clsExcel
        #ElseIf libApp = 2 Then
        #Else
            Err.Raise -99999, "getNewClass", "LibApp inexistante)"
        #End If
        '=========================================================================
        End Select
       
        If bInitialize Then
            '---------------------------------------------------------------
            Select Case UBound(tParams)
            '=========================================================================
            Case -1:    Call cl.init
            Case 0:     Call cl.init(tParams(0))
            Case 1:     Call cl.init(tParams(0), tParams(1))
            Case 2:     Call cl.init(tParams(0), tParams(1), tParams(2))
            Case 3:     Call cl.init(tParams(0), tParams(1), tParams(2), tParams(3))
            Case 4:     Call cl.init(tParams(0), tParams(1), tParams(2), tParams(3), tParams(4))
           
            '=========================================================================
            End Select
        End If
        '---------------------------------------------
        Set getNewClass = cl
       
    End Function

    Module de classe clsExcel
    Private m_fullName As String
    Private m_visible As Boolean
    Private mCol As Collection
    Public XLS As excel.Application

    Private Sub Class_Initialize()
        OuvreExcel
    End Sub

    Private Function OuvreExcel()
            Set XLS = New excel.Application
            XLS.Visible = m_visible
    End Function

    Private Sub Finalize()
    Dim h As Long
        On Error Resume Next
        '-----------------------------------------
        For h = mCol.count To 1 Step -1
            Set mCol(h) = Nothing
            Call mCol.Remove(h)
            DoEvents
        Next
        Set mCol = Nothing
       
        Call fermeExcel
    End Sub


    Cordialement,

    

    vendredi 12 juillet 2013 15:07
  • Bonjour,

    Concernant les droits, est-ce qu'il faut que je sois autorisée à l'Ecriture sur le disque C ?

    Merci d'avance pour votre retour.

    Cordialement,

    lundi 29 juillet 2013 07:49