IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

[VBA] Gros problème avec access et Excel


Sujet :

VBA Access

  1. #1
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 183
    Points : 76
    Points
    76
    Par défaut [VBA] Gros problème avec access et Excel
    Bonjour à tous,

    j'ai un problème qui dure depuis plusieurs et j'avoue être à court d'idées..

    j'exporte des données d'un recordset avec access sur excel de cette façon:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    
    
      Set db = DBEngine.OpenDatabase(MA_BASE_ACCESS)
              
        'J'initialise mes variables
        Set xlApp = CreateObject("Excel.Application")
        'Set xlBook = xlApp.Workbooks.Open(CurrentProject.Path + "\titre.xls")
         Set xlWb = xlApp.Workbooks.Add
         
        If xlApp Is Nothing Then
            MsgBox "Impossible d'ouvrir excel"
            Exit Sub
        End If
        
        xlApp.DisplayAlerts = False
    sql = " SELECT   var1,var2, var3......,  FROM table1,table2, ENTITE,..."
        
       
            
        rs.Open sql, CurrentProject.Connection, adOpenDynamic, adLockPessimistic
        
        
         xlSheet.Range("A2:K2").Select
                With Selection
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlBottom
                    .WrapText = False
                    .Orientation = 0
                    .AddIndent = False
                    .IndentLevel = 0
                    .ShrinkToFit = True
                    .ReadingOrder = xlContext
                    .MergeCells = True
                End With
          xlSheet.Range("A2:K2").Select
          ActiveCell.FormulaR1C1 = "FICHE  " & rs.Fields(0) & ""
        
           
        
          
         'Quadriller
        xlSheet.Range("A4:K13").Select
        xlApp.Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        xlApp.Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        
         With xlApp.Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With xlApp.Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With xlApp.Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With xlApp.Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With xlApp.Selection.Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With xlApp.Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
               
        
        'mettre les en-tête
        rs.MoveFirst
        While Not rs.EOF
            
            For j = 3 To 11
            'mettre les libellés
                xlSheet.Cells(j + 1, 1) = rs.Fields(j - 2).name
                xlSheet.Range("B" & j + 1, "K" & j + 1).Select
                With Selection
                    .HorizontalAlignment = xlGeneral
                    .VerticalAlignment = xlBottom
                    .WrapText = False
                    .Orientation = 0
                    .AddIndent = False
                    .IndentLevel = 0
                    .ShrinkToFit = True
                    .ReadingOrder = xlContext
                    .MergeCells = True
                End With
            xlSheet.Range("B" & j + 1, "K" & j + 1).Select
            
            If IsDate(rs.Fields(j - 2)) Then
                 
                ActiveCell.FormulaR1C1 = Format(rs.Fields(j - 2), "dd/mm/yyyy")
            Else
                   'ActiveCell.FormulaR1C1 = rs.Fields(j - 2)
                   ActiveCell.FormulaR1C1 = "REST"
                  
            End If
            Next
            j = j + 1
             rs.MoveNext
        Wend
    Au premier clique de mon bouton, tout se passe bien ,j'exporte correctement mes données.
    Supposons que je reclique sur le bouton, un nouveau classeur s'ouvre et les données en orange (provenant de monr ecordset)ne s'affiche plus du tout...
    pourtant quand je suis en mode debuggage ou que j'entre en dur une valeur, les données sont bien présente mais ne s'affiche pas sur Excel.....

    De plus , si je ferme mon formulaire et que je reouvre pour exporter sur excel à nouveau les mêmes données, ça plante sur la ligne en rouge..
    Je comprends vraiement pas!

    merci pour votre aide.

  2. #2
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    essaye de vider tes variables à la fin de ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rst.close
    'et les autres aussi
    si tu es chanceux ça fonctionnera

  3. #3
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 183
    Points : 76
    Points
    76
    Par défaut
    Merci mouaaa d'avoir pris le temps de regarder mon post.
    Apparement la chance n'est pas avec moi, car les recordsets sont (correctement) fermés et tout mes processus (xlapp...) sont nothing..


  4. #4
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    arf.... alors là je vois pas...

    essaye de voir si en rechargement ton formulaire ça fonctionne mieux on sait jamais ça pourrait faire comme si on fermait puis rouvrait tout....

  5. #5
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 183
    Points : 76
    Points
    76
    Par défaut
    Je vais essayer de suivre ta piste.
    Mais qu'entends par rechargement?

    Merci pour ton aide

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par celiaaa
    ...et tout mes processus (xlapp...) sont nothing..

    les processus doivent être fermés et non mis à nothing.
    Si le classeur et ouvert et que tu essaie de l'ouvrir à nouveau ce sera un fichier en lecture seul que tu aura.

    Il faut soit fermer excel après une exportation, soit sauter la partie ouverture aux futures clic (ceux >1).

    Voila.

  7. #7
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    la solution de DMboup me semble bien, mais si tu veux savoir ce que j'entends pas reload pour info c'est un truc du style

  8. #8
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 183
    Points : 76
    Points
    76
    Par défaut
    Merci pour vos conseils!

    Mboup quand tu parles de sauter la partie ouverture aux futures clic (ceux >1), tu entends par là de sauter la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlApp = CreateObject("Excel.Application")?
    Je ne fais pas de close et de quit car en fait je veux qu'à chaque clique d'un bouton, un nouveau classeur se créé avec des données provenant en partie d'un recordset..

    merci bien

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par celiaaa
    Merci pour vos conseils!

    Mboup quand tu parles de sauter la partie ouverture aux futures clic (ceux >1), tu entends par là de sauter la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlApp = CreateObject("Excel.Application")?
    C'est bien ca.

  10. #10
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 183
    Points : 76
    Points
    76
    Par défaut
    Je n'arrive pas trop à saisir (désolais)

    Si je saute cette ligne (quand le nombre de clique du bouton dépasse un), je ne voie pas comment je peux créer un classeur sachant que je le créé grâce à un add avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlApp. Set xlWb = xlApp.Workbooks.Add
    Si j'enlève cette ligne je ne peux pas afficher un nouveau classeur?!!!
    Je dois avoir mal compris...


    Merci

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par celiaaa
    Je dois avoir mal compris...
    Non ce sont les lignes que tu mélange.

    Ce qu'il faut sauter, c'est la recréation de l'objet xlApp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set xlApp = CreateObject("Excel.Application")
    Par contre cette ligne ci-dessous reste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set xlWb = xlApp.Workbooks.Add
    PS : xlApp (L'object Excel) <> xlWb (Le classeur)

  12. #12
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 183
    Points : 76
    Points
    76
    Par défaut
    J'ai essayer mais il ne veut pas ajouter un classeur.
    Ca plante sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set xlWb = xlApp.Workbooks.Add
    et ça m'écris variable objet ou variable de bloc with non définie

    Et cela vient du fait que j'ai enlevé le xApp...

    voila mon code..peu être que j'ai fait une bourde mais je ne vois pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Set db = DBEngine.OpenDatabase(MA_BASE_ACCESS)
     
        'J'initialise mes variables
       Set xlApp = CreateObject("Excel.Application")
     
    if nbClic=1 then
         Set xlWb = xlApp.Workbooks.Add
     end if
        If xlApp Is Nothing Then
            MsgBox "Impossible d'ouvrir excel"
            Exit Sub
        End If
     
        xlApp.DisplayAlerts = False
    La variable nbClic est incrémenté à chaque clique d'un bouton...
    Elle vaut donc 1 à l'initial

    Merci

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Désolé; Tu ne regardes pas bien ce que je proposes.

    La création du classeur doit se faire tout le temps.

    C'est l'initialisation de l'application qui doit se faire une seule fois "Set xlApp = CreateObject("Excel.Application")"

    Ne te précipites pas. Relis calmement les posts du dessus.

  14. #14
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 183
    Points : 76
    Points
    76
    Par défaut
    Oui pardon c'est bien ce que j'avais fait sur mon code (j'ai fait un copié collé du dessus et ajouter sur le poste le nb>1 , j'ai mal regardé donc je les mis sur le workbook)

    Voila ce que j'ai fais mais j'ai tjsr l' erreur variable objet ou variable de bloc with non définie
    J'ai peut -être mal initialisé des variables..



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
     
        Dim xlApp As Excel.Application
        Dim xlWb As Excel.Workbook
        Dim xlSheet As Excel.Worksheet
        Dim xlBook As Excel.Workbook
     
     
    Set db = DBEngine.OpenDatabase(MA_BASE_ACCESS)
     
     
    if nbClic=1 then
       Set xlApp = CreateObject("Excel.Application")
     end if
     
         Set xlWb = xlApp.Workbooks.Add
     
        If xlApp Is Nothing Then
            MsgBox "Impossible d'ouvrir excel"
            Exit Sub
        End If
    ...
     
    Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
    set xlWb = Nothing

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par celiaaa
    Voila ce que j'ai fais mais j'ai tjsr l' erreur variable objet ou variable de bloc with non définie
    J'ai peut -être mal initialisé des variables..
    Voila. Maintenant je crois qu'il faut déclarer la variable xlApp en global

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public xlApp As Excel.Application

  16. #16
    Membre régulier
    Inscrit en
    Juin 2006
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 183
    Points : 76
    Points
    76
    Par défaut
    Merci pour ton aide Mboup

    Mais ça me fait la même erreur avec la variable en global..
    J'ai essayé plusieurs fois avec le debuggeur en sautant le
    Set xlApp = CreateObject("Excel.Application") quand le nombre de clique est supérieur à1 mais rien n'y fait


  17. #17
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Je pense qu'en mettant "With xlapp. selection" au lieu de "With selection" et "XlSheet.activecell" au lieu de "Activecell, ça devrait mieux marcher.

  18. #18
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 787
    Points : 3 050
    Points
    3 050
    Par défaut
    Bonjour

    J'avoue ne pas avoir lu toute la discussion; je te suggère ceci

    Remplace ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.FormulaR1C1 = "FICHE  " & rs.Fields(0) & ""
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xlSheet.ActiveCell.FormulaR1C1 = "FICHE  " & rs.Fields(0) & ""
    C-à-d de prefixer les lignes qui ne fonctionnent pas avec leur localisation complète afin que Access sache exactement ce qu'est ActiveCell et où le trouver.

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

Discussions similaires

  1. Nouveau problème avec un tableau Excel et une macro VBA
    Par valouche dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 30/06/2007, 09h30
  2. Gros problème avec les colations
    Par scaleo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/11/2005, 09h36
  3. [VBA] [WORD] problèmes avec NUMPAGES
    Par meufeu dans le forum VBA Word
    Réponses: 9
    Dernier message: 08/08/2005, 16h24
  4. Gros problème avec la facturation de Tiscali
    Par Harry dans le forum Dépannage et Assistance
    Réponses: 5
    Dernier message: 21/10/2004, 18h55
  5. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo