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 :

Parcourir une plage excel depuis access [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut Parcourir une plage excel depuis access
    Bonjour,

    Je sais que je ne suis pas la seule à être confrontée à ce problème de distinction activate/select mais malgré tout ce que j'ai lu sur le forum, je n'arrive pas à comprendre

    Alors je me dis que j'ai un exemple concret où mon code fonctionne de temps en temps (!). Je suppose que tout repose sur cette histoire de cellule activée à distance. Je ne sais pas si mon code indique bien que la cellule est dans excel. Pourriez-vous me dire ce qui ne va pas dans mon code (que j'ai à 99% pris sur le forum et qui fonctionne très bien s'il est lancé directement dans excel mais je l'ai modifié pour le lancer depuis access et il ne fonctionne plus en systématique).

    Merci pour votre aide.


    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
    Sub FusionCellule(xlWkb As excel.Workbook, xlWsh As String, MyColumn As String)
        Dim val As String, valad As String
        Dim flag As Boolean
        xlWkb.Worksheets(xlWsh).Activate
        xlWkb.Worksheets(xlWsh).Range(MyColumn & "3").Select
    
    'c'est à la ligne du do until que de temps en temps j'ai le message Variable objet ou variable de bloc With non définie
        Do Until ActiveCell.Value = ""
            val = ActiveCell.Value
            valad = ActiveCell.Address
            flag = True
            Do While val = ActiveCell.Value
                ActiveCell.Offset(1, 0).Select
                If flag = False Then
                    ActiveCell.Offset(-1, 0).ClearContents
                End If
                flag = False
            Loop
            ActiveCell.Offset(-1, 0).Select
            Range(valad, ActiveCell.Address).Select
            With Selection
                .Merge
                .MergeCells = True
                .VerticalAlignment = xlCenter
                .HorizontalAlignment = xlCenter
                .WrapText = True
            End With
            ActiveCell.Offset(1, 0).Select
        Loop
    End Sub

  2. #2
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 789
    Points : 1 266
    Points
    1 266
    Par défaut
    Bonjour,

    J'ai modifié ton code mais sans le fichier Excel, difficile de faire un test.
    De plus, je ne suis pas sur d'avoir bien tout écris.
    Essaies ce code et si problème, donne moi ton fichier Excel que j'y jette un oeil.

    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
    Sub FusionCellule(FichierXl As String, MyColumn As String)
     
    Dim xlApp As Excel.Application 'Est Excel
    Dim xlBook  As Excel.Workbook 'Est un classeur
    Dim xlWks  As Excel.Worksheet 'Est une feuille
     
    Dim val As String, valad As String
    Dim flag As Boolean
     
    Set xlApp = CreateObject("Excel.Application") 'Ouverture d'une nouvelle instance d'Excel
    Set xlBook = xlApp.Workbooks.Open(FichierXl) 'Ouverture du fichier
    Set xlWks = xlBook.ActiveSheet 'Activation de la feuille
     
    xlWks.Activate
    xlWkb.Range(MyColumn & "3").Select
     
    'c'est à la ligne du do until que de temps en temps j'ai le message Variable objet ou variable de bloc With non définie
        Do Until xlWkb.ActiveCell.Value = ""
            val = xlWkb.ActiveCell.Value
            valad = xlWkb.ActiveCell.Address
            flag = True
            Do While val = ActiveCell.Value
                xlWkb.ActiveCell.offset(1, 0).Select
                If flag = False Then
                    xlWkb.ActiveCell.offset(-1, 0).ClearContents
                End If
                flag = False
            Loop
            ActiveCell.offset(-1, 0).Select
            xlWkb.Range(valad, ActiveCell.Address).Select
            With selection
                .Merge
                .MergeCells = True
                .VerticalAlignment = xlCenter
                .HorizontalAlignment = xlCenter
                .WrapText = True
            End With
            xlWkb.ActiveCell.offset(1, 0).Select
        Loop
    End Sub

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Salut,

    Tout d'abord, merci pour ton aide. J'ai testé ton code ce matin tel quel, donc j'ai modifié le mien car je créais une instance d'excel et j'ouvrais le fichier excel avant de lancer ma procédure Fusion. Mais je n'ai pas réussi à faire tourner le code et notamment xlWkb.ActiveCell.Value où il me dit "membre de méthode ou données introuvable": j'en ai donc conclu qu'ActiveCell ne peut pas être associé à workbook. J'ai testé Worksheet, idem. Si je ne mets rien, juste ActiveCell tout seul ça passe la ligne. Mais le reste de l'exécution du code entraine l'erreur "Variable objet ou variable de bloc With non définie".

    Je suis donc repartie de mon code en le modifiant quelque peu. Ce code marche de temps en temps ! Je peux avoir le même message qu'au départ "Variable objet ou variable de bloc With non définie".

    Voici donc mon code si quelqu'un trouve l'erreur. Et un fichier excel en PJ (le vrai fichier contient pleins d'onglets, d'où la nécessité de préciser quel onglet est actif).

    Merci par avance pour vos conseils.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub MAJAll(db As DAO.Database)
        Dim xlApp As Excel.Application
        Set xlApp = New Excel.Application
        Dim accApp As Access.Application
        Set accApp = Application
        Call MajExcel_EFFECTIFS(db, accApp, xlApp, FOLDER_XL & "\Test.xlsx")
        xlApp.Quit
    End Sub
    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
    Sub MajExcel_EFFECTIFS(db As DAO.Database, accApp As Access.Application, xlApp As Excel.Application, sFichier As String)
        On Error GoTo MajExcel_Err
        xlApp.DisplayAlerts = False
        xlApp.Visible = True
        Dim xlWkb As Excel.Workbook
        Set xlWkb = xlApp.Workbooks.Open(sFichier)
        ExcelFileOpened = True
     
        Call FusionCellule(xlWkb, "Tableau", "A")
        Call FusionCellule(xlWkb, "Tableau", "B")
        Call FusionCellule(xlWkb, "Tableau", "C")
        Call FusionCellule(xlWkb, "Tableau", "D")
        Call FusionCellule(xlWkb, "Tableau", "G")
     
        xlWkb.Close True
        xlApp.DisplayAlerts = True
    Exit Sub
    MajExcel_Err:
        MsgBox "Une erreur est survenue" & vbCrLf & err.Number & vbCrLf & err.Description, vbCritical, "MajExcel_EFFECTIFS"
    End Sub
    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
    Sub FusionCellule(xlWkb As Excel.Workbook, xlWsh As String, MyColumn As String)
        Dim val As String, valad As String
        Dim flag As Boolean
        Dim xlWks  As Excel.Worksheet
        Set xlWks = xlWkb.Worksheets(xlWsh)
        xlWks.Activate
        xlWks.Range(MyColumn & "3").Activate
        Do Until ActiveCell.Value = ""
            val = ActiveCell.Value
            valad = ActiveCell.Address
            flag = True
            Do While val = ActiveCell.Value
                ActiveCell.Offset(1, 0).Select
                If flag = False Then
                    ActiveCell.Offset(-1, 0).ClearContents
                End If
                flag = False
            Loop
            ActiveCell.Offset(-1, 0).Select
            Range(valad, ActiveCell.Address).Select
            With Selection
                .Merge
                .MergeCells = True
                .VerticalAlignment = xlCenter
                .HorizontalAlignment = xlCenter
                .WrapText = True
            End With
            ActiveCell.Offset(1, 0).Select
        Loop
    End Sub
    Fichiers attachés Fichiers attachés

  4. #4
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 789
    Points : 1 266
    Points
    1 266
    Par défaut
    Bonjour,

    Essaies ceci, cela devrait correspondre à tes attentes.

    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
    Sub FusionCellule(FichierXl As String, MyColumn As String)
     
    Dim xlApp As Excel.Application 'Est Excel
    Dim xlBook  As Excel.Workbook 'Est un classeur
    Dim xlWks  As Excel.Worksheet 'Est une feuille
     
    Dim val As String, valad As String
    Dim flag As Boolean
     
    Set xlApp = CreateObject("Excel.Application") 'Ouverture d'une nouvelle instance d'Excel
    Set xlBook = xlApp.Workbooks.Open(FichierXl) 'Ouverture du fichier
    Set xlWks = xlBook.ActiveSheet 'Activation de la feuille
     
    xlWks.Activate
    xlWks.Range(MyColumn & "3").Select
     
    'c'est à la ligne du do until que de temps en temps j'ai le message Variable objet ou variable de bloc With non définie
        Do Until ActiveCell.Value = ""
            val = ActiveCell.Value
            valad = ActiveCell.Address
            flag = True
            Do While val = ActiveCell.Value
                ActiveCell.offset(1, 0).Select
                If flag = False Then
                    ActiveCell.offset(-1, 0).ClearContents
                End If
                flag = False
            Loop
            ActiveCell.offset(-1, 0).Select
            xlWks.Range(valad, ActiveCell.Address).Select
            With selection
                .Merge
                .MergeCells = True
                .VerticalAlignment = xlCenter
                .HorizontalAlignment = xlCenter
                .WrapText = True
            End With
            ActiveCell.offset(1, 0).Select
        Loop
    End Sub
    J'ai fais le test sur la colonne "C" et le fichier Excel est dans le même répertoire que mon application Access.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call FusionCellule(CurrentProject.Path & "\" & "Test.xlsx", "C")

  5. #5
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut


    Le problème était en effet de bien rattacher tous les termes liés à excel à leur instance. Je n'avais pas vu que ça me créait un processus dans excel et que même avec le quit et le nothing, il n'était pas kill. J'ai maintenant tous mes termes rattachés à l'instance que j'ai créée et non à l'instance qu'access aurait pu créer en invisible (quand je ne rattache pas mes termes). Bref, pas simple tout ça, mais tout fonctionne maintenant. Un grand merci pour ton aide !

    Bonne fin de journée,

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

Discussions similaires

  1. [A-00] Nommer une plage Excel depuis Access
    Par jean-paul lepetit dans le forum VBA Access
    Réponses: 4
    Dernier message: 26/01/2009, 21h36
  2. lancer une macro excel depuis access
    Par Thyrolas dans le forum IHM
    Réponses: 1
    Dernier message: 16/12/2008, 18h54
  3. [Manipulation Excel] Executer une macro Excel depuis Access
    Par sebastien_oasis dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/05/2007, 16h21
  4. Lancer une macro Excel depuis Access
    Par pascal913 dans le forum Access
    Réponses: 12
    Dernier message: 31/07/2006, 16h31
  5. Lancer une macro Excel depuis Access
    Par marcobosio dans le forum Access
    Réponses: 6
    Dernier message: 05/06/2006, 21h51

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