+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Invité régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : avril 2012
    Messages : 33
    Points : 6
    Points
    6

    Par défaut Erreur gestion excel via code VBA dans access pour importation

    Bonjour,

    Je souhaite importer des données d'un onglet excel dans access, pour ce faire je commence par nommer la plage de donnée excel via un code VBA dans access. Probleme: lorsque le nom de l'onglet comporte des espaces la macro plante.. si je change le nom de l'onglet à la main et relance mon code, ca marche! Comment éviter cette erreur sans avoir à préalablement renommer mon onglet?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    Function NameRange_xls(range_name As String, filePath As String, wsSource As String) As Boolean
    '------------------------------------------------------
    'Déclarations
    '------------------------------------------------------
    Dim xlApp       As Excel.Application
    Dim xlSheet     As Excel.Worksheet
    Dim xlBook      As Excel.Workbook
    Dim lastLine    As Long
    Dim lastField   As Long
    Dim firstLine   As Long
     
    Dim rangeToName As range
    '------------------------------------------------------
    'initialiser les variables et ouvrir le fichier excel
    '------------------------------------------------------
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(filePath)
    Set xlSheet = xlBook.sheets(wsSource)
    On Error GoTo NameRange_xls_Err
     
    '------------------------------------------------------
    'repérer la zone de données et la nommer
    '------------------------------------------------------
    xlSheet.Select
    xlBook.sheets(wsSource).Unprotect ' s'assurer que l'onglet n'est pas protéger pr permettre de nommer le range
    xlSheet.Select
    Dim protection As Boolean
    protection = xlSheet.ProtectionMode
     
    lastLine = cells(rows.Count, 1).End(xlUp).Row
    lastField = cells(lastLine, 1).End(xlToRight).Column
    firstLine = cells(lastLine, 1).End(xlUp).Row
    Set rangeToName = range(cells(firstLine, 1), cells(lastLine, lastField))
    rangeToName.Name = range_name
    '------------------------------------------------------
    'Fermeture du fichier excel + libération de la mémoire
    '------------------------------------------------------
    NameRange_xls_Exit:
        xlBook.Save ' sauver précédent
        xlBook.Close (True)
        xlApp.Quit
     
        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
        NameRange_xls = True
        Exit Function
     
    NameRange_xls_Err:
        Resume NameRange_xls_Exit
     
    End Function

  2. #2
    Membre Expert
    Avatar de tee_grandbois
    Homme Profil pro
    Ingénieur-Consultant
    Inscrit en
    novembre 2004
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur-Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 665
    Points : 1 199
    Points
    1 199

    Par défaut

    Bonsoir blacklolou,
    d'après ce que j'ai pu tester, les espaces dans le nom d'un onglet n'empêche pas de nommer une plage.
    Donc le problème provient d'ailleurs.
    Dan le code que tu as posté, comme tu trappes l'erreur sans l'afficher, tu ne peux pas savoir si cela a planté ou pas, ni à quelle instruction.
    J'ai modifié ton code en ajoutant ce qui, à mon sens, manquait pour que cela fonctionne (la référence à l'objet xlSheet):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Function NameRange_xls(range_name As String, filePath As String, wsSource As String) As Boolean
    '------------------------------------------------------
    'Déclarations
    '------------------------------------------------------
    Dim xlApp       As Excel.Application
    Dim xlSheet     As Excel.Worksheet
    Dim xlBook      As Excel.Workbook
    Dim lastLine    As Long
    Dim lastField   As Long
    Dim firstLine   As Long
     
    Dim rangeToName As Range
    '------------------------------------------------------
    'initialiser les variables et ouvrir le fichier excel
    '------------------------------------------------------
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(filePath)
    Set xlSheet = xlBook.Sheets(wsSource)
    On Error GoTo NameRange_xls_Err
     
    '------------------------------------------------------
    'repérer la zone de données et la nommer
    '------------------------------------------------------
    xlSheet.Select
    xlBook.Sheets(wsSource).Unprotect ' s'assurer que l'onglet n'est pas protégé pr permettre de nommer le range
    xlSheet.Select
    Dim protection As Boolean
    protection = xlSheet.ProtectionMode
    lastLine = xlSheet.Cells(xlSheet.Cells.Rows.Count, 1).End(xlUp).Row
    lastField = xlSheet.Cells(lastLine, 1).End(xlToRight).Column
    firstLine = xlSheet.Cells(lastLine, 1).End(xlUp).Row
    Set rangeToName = xlSheet.Range(xlSheet.Cells(firstLine, 1), xlSheet.Cells(lastLine, lastField))
    rangeToName.Name = range_name
     
    '------------------------------------------------------
    'Fermeture du fichier excel + libération de la mémoire
    '------------------------------------------------------
    NameRange_xls_Exit:
        xlBook.Save ' sauver précédent
        xlBook.Close (True)
        xlApp.Quit
     
        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
        NameRange_xls = True
        Exit Function
     
    NameRange_xls_Err:
        MsgBox err.Number & " / " & err.DESCRIPTION
        Resume NameRange_xls_Exit
     
    End Function
    Dis-moi si cela a résolu ton problème.

  3. #3
    Invité régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : avril 2012
    Messages : 33
    Points : 6
    Points
    6

    Par défaut

    Bonjour tee_grandbois

    Merci pour tes remarques et conseils. J'ai modifié mon code pour les prendre en compte; cependant j'ai toujours une erreur à la ligne
    Code :
    lastLine = xlSheet.cells(rows.Count, 1).End(xlUp).Row
    "1004 erreur définie par l'application ou par l'objet"..
    En modifiant le nom de l'onglet dans excel pour qu'il ne contienne pas d'espace, ca fonctionne toujours!

    Si tu as une autre piste je prend... je tourne un peu en rond là :s

  4. #4
    Membre Expert
    Avatar de tee_grandbois
    Homme Profil pro
    Ingénieur-Consultant
    Inscrit en
    novembre 2004
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Ingénieur-Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 665
    Points : 1 199
    Points
    1 199

    Par défaut

    Bonsoir,
    si tu avais repris la totalité de mon code, tu n'aurais pas eu ce problème :
    Code :
    lastLine = xlSheet.cells(rows.Count, 1).End(xlUp).Row
    Code :
    lastLine = xlSheet.Cells(xlSheet.Cells.Rows.Count, 1).End(xlUp).Row
    idem pour lastField et firstLine

  5. #5
    Invité régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : avril 2012
    Messages : 33
    Points : 6
    Points
    6

    Par défaut

    Arf effectivement je suis allé trop vite..
    Merci pour ton aide
    @+ !

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •