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

Macros et VBA Excel Discussion :

[VBA-A]Problème de cellule Excel vide


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut [VBA-A]Problème de cellule Excel vide
    Bonjour tout le monde !!

    Voilà, j'ai un formulaire sous Access (donc fait en VBA) qui éxécute une requête et insère les donnée sous Excel :

    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
     With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
            "ODBC;DBQ=Z:\COMMON\DDI\Departement Clientele\Listing\Listing France 2006.mdb;DefaultDir=Z:\COMMON\DDI\Departement Clientele\Listing;" _
            ), Array( _
            "Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransacti" _
            ), Array("ons=0;Threads=3;UserCommitSync=Yes;")), Destination:=Range(Dest))
            .CommandText = Array( _
            "SELECT z_VTC.`Code pdv`, z_VTC.`Nom client`, z_VTC.CP, z_VTC.`Bureau distributeur`, z_VTC.`Date VT`, z_VTC.`Date VTC`" & Chr(13) & "" & Chr(10) & "FROM `Z:\COMMON\DDI\Departement Clientele\Listing\Listing France 2006`." _
            , "z_VTC z_VTC" & Chr(13) & "" & Chr(10) & "WHERE (z_VTC.RS= '" & NomRepSécu & "')")
            .name = "Lancer la requête à partir de Listing"
            .FieldNames = False
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .refresh BackgroundQuery:=False
        End With
    Mais, avant de lancer cette requête, je parcour une colonne du fichier Excel afin de détecter la première cellule vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        For S = 70 To 200
         cellule = "b" & S
         If Sheets("Formations-VTC ET-Sécu").Range(cellule).Value = "" Then
          Dest = "b" & S
          S = 200
         End If
        Next
    Ma variable 'Dest' contient donc la cellule qui recevra le début des données de ma requête, par exemple "b70" si c'est la première fois que j'éxécute la requête.

    Mais un problème se pose. En effet,si je ré éxécute la requête (qui contient 3 lignes par exemple) ma cellule de destination devrait donc être "b73", hors, le programme ne détecte que des cellules vides lors du parcour. En effet, j'ai fait msgbox("b70") et le résultat était du vide, et pourtant elle est bien remplie...
    Ce qui fait que mon programme insère le contenu de la seconde requête dans "b70" et donc ça décale tout.
    Par contre, si je fais une macro sous Excel faisant un msgbox("b70") là il me sort bien la valeur...
    Donc là franchement je n'y comprend rien...
    Un grand merci d'avance et bonne journée !

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par soad029
    msgbox("b70")
    ben si tu fais cela tu devrai obtenir un message affichant le texte "b70" et non pas le contenu de la cellule B70 ... tu est sur que tu fais cela ... montre nous plutot le code ou tu utilise ce fameux dest .. !

  3. #3
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    Salut bbil et merci d'avoir répondu!

    En effet, je n'ai pas fait msgbox("b70") mais MsgBox (Sheets("Formations-VTC ET-Sécu").Range(cellule9).Value)
    cellule9 ayant comme valeur "b70"

    Sinon, j'utilise "Dest" dans le premier code du topic que j'ai fournit (Execution de la requête):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Destination:=Range(Dest))

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    si tu est sous access ..., il faut rajouter la référence à la feuille excel..devant le range...

    MaFeuille.range("...

    j'ai pas vu ton code utilisé pour accéder à la feuille excel...

  5. #5
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    il faut rajouter la référence à la feuille excel..devant le range...
    Oui, mais c'est bien ce que j'ai fait : Sheets("Formations-VTC ET-Sécu").Range(cellule9).Value. Ma feuille s'appelle "Formations-VTC ET-Sécu".

    j'ai pas vu ton code utilisé pour accéder à la feuille excel...
    D'abord j'ouvre le fichier excel puis je fais un sheets("nomDeLafeuille").activate, puis le code que j'ai montré précédemment.

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    montre un peu plus de ton code... en gros pour simplifier, pour qu'un code Excel marche sous Access.. il faut précéder tous les objets excels de la référence à l'application excel ..

    AppExcel.Sheets(...., pareil pour range...etc etc

  7. #7
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    Yep', voici le code complet :

    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
     Option Compare Database
     
     
     
    Public Function UpdateFileForAll(indice, mois)
    '################################## DECLARATION DES VARIABLES #####################################
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim rst1 As DAO.Recordset
        'Déclaration des variables
        Dim appExcel As Excel.application 'Application Excel
        Dim wbExcel As Excel.Workbook 'Classeur Excel
        Dim wsExcel As Excel.Worksheet 'Feuille Excel
     
     Set appExcel = CreateObject("Excel.Application")
    Set db = CurrentDb()
     
    Dim k As Integer
    Dim i As Integer
    Dim requete As String
    Dim requete1 As String
    Dim res As String
    Dim res1 As String
    Dim max As Integer
    Dim REQnbRS As String
    Dim REQnbLigne As String
    Dim NomRep As String 'Nom représentant
    Dim g As Integer
    Dim cellule As String
    Dim cellule2 As String
    Dim Dest As String
    Dim NomRepSécu As String
    Dim nom As String
     
        '################## OUVERTURE DU FICHIER COMMISSION.XLS ##########################################
    'Transformation du Nom du RS
        requete = "SELECT NomReprésentant FROM Représentant WHERE Numéro = " & indice
        Set rst = db.OpenRecordset(requete)
        res = rst("NomReprésentant")
        NomRep = TRANSFO(res)
        NomRep = "'" & NomRep & "'"
     
        Set wbExcel = appExcel.Workbooks.Open("Z:\COMMON\DDI\Departement Clientele\Commission\Mars\" & res & ".xls")
        'wsExcel correspond à la première feuille du fichier
        Set wsExcel = wbExcel.Worksheets(5)
        appExcel.Visible = False
        'appExcel.Cursor = xlWait
        Sheets("Données").Select
     
     
     'Partie Formation
     'Call Sleep(5000)
      MsgBox (Sheets("Formations-VTC ET-Sécu").Range("a5").Value)
      MsgBox (Sheets("Formations-VTC ET-Sécu").Range("b4").Value)
        For S = 5 To 200
         cellule = "c" & S
         cellule9 = "j" & S
     
         If (Sheets("Formations-VTC ET-Sécu").Range(cellule9).Value = "" And Sheets("Formations-VTC ET-Sécu").Range(cellule).Value = "") Then
          Dest = "b" & S
          S = 200
         End If
        Next
     
        With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
            "ODBC;DBQ=Z:\COMMON\DDI\Departement Clientele\Listing\Listing France 2006.mdb;DefaultDir=Z:\COMMON\DDI\Departement Clientele\Listing;" _
            ), Array( _
            "Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransacti" _
            ), Array("ons=0;Threads=3;UserCommitSync=Yes;")), Destination:=Range(Dest))
            .CommandText = Array( _
            "SELECT z_Formation.`Code PDV`, z_Formation.`Nom & Prénom du participant`, z_Formation.`CP & Ville`, z_Formation.`Date 2ème journée`" & Chr(13) & "" & Chr(10) & "FROM `Z:\COMMON\DDI\Departement Clientele\Listing\Listing France 20" _
            , "06`.z_Formation z_Formation" & Chr(13) & "" & Chr(10) & "WHERE (z_Formation.RS = '" & NomRepSécu & "')")
            .name = "Lancer la requête à partir de Listing_5"
            .FieldNames = False
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .refresh BackgroundQuery:=False
        End With
     
        'SAUVERGADE DES FICHIERS
        wbExcel.Save
        wbExcel.application.Quit
        appExcel.application.Quit
     
        'Désallocation mémoire
        Set wsExcel = Nothing
        Set wbExcel = Nothing
     
    End Function

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    rajoute
    en haut de ton code ! puis dis nous... ce qui ce passe

  9. #9
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    Et bien... C'est toujours pareil... C'est vraiment à y rien comprendre cette histoire...

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    et cette ligne ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox (Sheets("Formations-VTC ET-Sécu").Range("a5").Value)
    elle t'affiche bien la valeur souhaitée ?

  11. #11
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    Non, j'ai bien le fenêtre msgbox qui s'ouvre mais avec rien dedans..., comme si tu faisais msgbox("")

  12. #12
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Peux-tu me dire à quoi te sert cette instruction???
    Citation Envoyé par soad029
    Set wsExcel = wbExcel.Worksheets(5)
    En fait, tu fais une moitié du travail.
    Il faut, effectivement, créer une instance de la/chaque feuille qu'on va utiliser par la suite.
    Mais, ensuite, il faut utiliser cette instance.

    De plus, tu mélanges 2 méthodes d'accès à une feuille dans un même code (une fois par le numéro d'index, les autres fois par le nom).

    N'aurions-nous pas, là, un bel exemple de copiés/collés de sources différentes et (peut-être) pas comprises?

  13. #13
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par soad029
    Non, j'ai bien le fenêtre msgbox qui s'ouvre mais avec rien dedans..., comme si tu faisais msgbox("")
    A bon .(comme c'est bizarre )... alors ... essai de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox (appExcel.Sheets("Formations-VTC ET-Sécu").Range("a5").Value)
    puis relis le post à Alain .. et le Mien ..

  14. #14
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 89
    Points
    89
    Par défaut
    Bon... J'ai trouvé d'où venait le problème. En faite, à cause d'un PB algorithmique l'application insérait le contenue d'une requête dans une cellule déjà remplie. Cela entrainait le décalage de colonnes, du coup le msgbox était sur une cellule forcément vide car les colonnes était décalé.

    Bref, tout roule maintenant.

    Merci bcp de vos participations !

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

Discussions similaires

  1. Problème Verouillage Cellule excel 2003 : For each
    Par infocogef dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/10/2013, 09h57
  2. [VBA-E] Positionnement des cellules excel
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/10/2006, 20h38
  3. [VBA-P] Problème liaisons powerpoint-Excel
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/07/2006, 15h07
  4. [VBA-E]Largeur des cellules Excel adaptée au contenu de la cellule
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/05/2006, 08h33
  5. [EXCEL][VBA] Compter les cellules non-vides
    Par Squelet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2006, 15h40

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