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 :

Tester si une cellule est vide dans un classeur excel et faire une boucle


Sujet :

VBA Access

  1. #1
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut Tester si une cellule est vide dans un classeur excel et faire une boucle
    Bonjour, depuis access, je colle des données dans Excel, ici en l'occurence, il s'agit d'un bon de commande.

    Ce que je cherche à faire, c'est à coller sur une ligne de classeur excel des données dans l'ordre suivant:

    -Designation
    -Reference
    -Quantité
    -Prix

    Je colle ces données de A25 à D25.

    Ceci fonctionne correctement. Je voudrais maintenant tester depuis click sur mon bouton dans access, si A25 est vide alors je colle mes données en A25, sinon je regarde en A26....

    En gros chercher la dernière cellule vide de la colonne A.

    Je savais le faire sur Excel avec le code vba suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim cellule As Object
     
    Set cellule = Worksheets("Commande").Range("A25")
    Do While Not IsEmpty(cellule)
      Set cellule = cellule.Offset(1, 0)
    Loop
    Je voudrais savoir comment l'adapter maintenant pour pouvoir le faire depuis access.

    Merci

  2. #2
    Membre régulier Avatar de zibi7
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 75
    Points
    75
    Par défaut Re
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    dim i as long, nblignes as long
    nblignes =worksheet("commande").Range("A25").End(xlDown).Row
    i=25 
    while i<nblignes 
     if worksheet("commande").Range("A" & i).value ="" then 
            worksheet("commande").Range("A" & i).value=Designation
            worksheet("commande").Range("A" & i).value=Reference
            worksheet("commande").Range("A" & i).value=Quantité
            worksheet("commande").Range("A" & i).value=Prix
            i=i+1
    else 
            i=i+1
    end if 
    wend
    @+

  3. #3
    Membre régulier Avatar de zibi7
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 75
    Points
    75
    Par défaut
    Salut,

    Tu nous as pas dit si ton problème est réglée?

    @+

  4. #4
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Re, nn mon problème n'est pas reglé.

    En fait le bout de code que tu me conseil, me colle la même ref depuis A25 jusqu'à ce qu'il rencontre quelque chose.

    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
    Dim sql As String
    Dim oRst As DAO.Recordset
    Dim oRstMAJ As DAO.Recordset
    Dim oRstArticle As DAO.Recordset
    Dim odb As DAO.Database
     
    Dim Id_Article As Integer
    Dim Reference As String
    Dim Prix As Integer
    Dim designation As String
     
    Dim i As Long, nblignes As Long
     
    Dim LigneTableur As Integer
     
    Set odb = CurrentDb
     
    Id_Article = Me.lstResults
     
    sql = "select * from tbl_Article Where Id_Article = " & Id_Article & " "
    Set oRst = odb.OpenRecordset(sql, dbOpenDynaset)
     
    LigneTableur = 25
     
        Reference = oRst.Fields("Ref_Article").Value
        Prix = Nz(oRst.Fields("PrixUnitaireStock").Value, 0)
     
        sql = "SELECT tbl_Article.Ref_Article, tbl_Designation.Designation FROM tbl_Designation INNER JOIN tbl_Article ON tbl_Designation.Id_Designation = tbl_Article.Id_Designation where tbl_Article.Id_Article = " & Id_Article & ""
        Set oRst = odb.OpenRecordset(sql, dbOpenDynaset)
     
        designation = oRst.Fields("Designation").Value
     
    On Error Resume Next
     
       If xlApp Is Nothing Then
          Set xlApp = CreateObject("Excel.Application")
       End If
     
       xlApp.Visible = True
       xlApp.WindowState = xlMaximized
     
       Set xlBook = xlApp.Workbooks.Open(AdresseGmao + "Dossiers GMAO\Ecriture Access vers Excel\Commande temporaire\Commande Vierge.xls")
       Set xlSheet = xlApp.Worksheets("Commande")
     
    nblignes = Worksheets("commande").Range("A25").End(xlDown).Row
    i = 25
     
    While i < nblignes
     
     If Worksheets("commande").Range("A" & i).Value = "" Then
     
            Worksheets("commande").Range("A" & i).Value = designation
            Worksheets("commande").Range("B" & i).Value = Reference
            'Worksheets("commande").Range("A" & i).Value = Quantité
            Worksheets("commande").Range("D" & i).Value = Prix
            i = i + 1
    Else
            i = i + 1
    End If
    Wend
     
    End sub
    Si tu veux ce que je cherche à faire :

    J'ai un formulaire avec une zone de liste avec des articles. J'ai un bouton qui me permet d'envoyer l'article sur lequel la souris est placée dans un bon de commande.

    Si la cellule A25 de ma feuille commande de mon classeur Excel est vide (aucun article n'est encore sur le bon de commande), alors je colle mon article

    Si il y a déja un article qui est en A25 alors je regarde en A26, si il n'y a pas d'autre article je colle, sinon je regarde en A27...

    Comme ça, avec mon bouton, depuis access, je crée mon bon de commande en selectionnant article par article.

    Cordialement

  5. #5
    Membre régulier Avatar de zibi7
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 75
    Points
    75
    Par défaut
    re,

    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
     
     
    Dim sql As String
    Dim oRst As DAO.Recordset
    Dim oRstMAJ As DAO.Recordset
    Dim oRstArticle As DAO.Recordset
    Dim odb As DAO.Database
     
    Dim Id_Article As Integer
    Dim Reference As String
    Dim Prix As Integer
    Dim designation As String
     
    Dim i As Long, lignevide as long
     
    Set odb = CurrentDb
     
    Id_Article = Me.lstResults
    '============================Prix et référence de l'id sélectionné
    sql = "select * from tbl_Article Where Id_Article = " & Id_Article & " "
    Set oRst = odb.OpenRecordset(sql, dbOpenDynaset)
    Reference = oRst.Fields("Ref_Article").Value
    Prix = Nz(oRst.Fields("PrixUnitaireStock").Value, 0)
    '=============================Désignation de l'id selectionnée
     sql = "SELECT tbl_Article.Ref_Article, tbl_Designation.Designation FROM tbl_Designation INNER JOIN tbl_Article ON tbl_Designation.Id_Designation = tbl_Article.Id_Designation where tbl_Article.Id_Article = " & Id_Article & ""
     Set oRst = odb.OpenRecordset(sql, dbOpenDynaset)
     designation = oRst.Fields("Designation").Value
     
    On Error Resume Next
     
       If xlApp Is Nothing Then
          Set xlApp = CreateObject("Excel.Application")
       End If
     
       xlApp.Visible = True
       xlApp.WindowState = xlMaximized
     
       Set xlBook = xlApp.Workbooks.Open(AdresseGmao + "Dossiers GMAO\Ecriture Access vers Excel\Commande temporaire\Commande Vierge.xls")
       Set xlSheet = xlApp.Worksheets("Commande")
    '==============================récupère le numéro de la ligne vide 
    lignevide = Worksheets("Commande").Range("A1").End(xlDown).Row
    '==============================si ta plage d'avant est réservée	alors tu change la valeur
    	If lignevide<= 25 then 
    		lignevide=25
    	end if 
            Worksheets("Commande").Range("A" & lignevide).Value = designation
            Worksheets("Commande").Range("B" & lignevide).Value = Reference
            Worksheets("Commande").Range("C" & lignevide).Value = Quantité
            Worksheets("Commande").Range("D" & lignevide).Value = Prix
     
    End sub
    J'avais pas vu que ton curseur renverrait au maximum un résultat.
    Tu me diras si c'est bon?

    @+

  6. #6
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Non ça ne fonctionne pas, sa vient toujours se coller en A25, il manque une incrémentation je pense à un moment donné.

    Cordialement

  7. #7
    Membre régulier Avatar de zibi7
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 75
    Points
    75
    Par défaut
    salut,

    si l'événement est un bouton, et que tu récupère une ligne(un produit); alors le lignevide aura toujours une nouvelle valeur (à chaque clique).
    Tu peux envoyer les fichiers que je teste?

    @+

  8. #8
    Membre régulier Avatar de zibi7
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 75
    Points
    75
    Par défaut
    Une idée!

    est ce que tu ferme la feuille et tu l'enregistre à la fin de la procédure?

  9. #9
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Re, Je ne peux t'envoyer que le bon de commande si tu le souhaite.

    Pour ce qui est de l'application, elle est trop volumineuse...

    Sinon, non je n'enregistre pas à la fin de ma procédure. Je voudrais enristrer quand j'aurai terminé d'ajouté se que je souhaite.

  10. #10
    Membre régulier Avatar de zibi7
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 72
    Points : 75
    Points
    75
    Par défaut
    Salut,

    C'était pour voir pas à pas ce qui se passe.
    En effet, si tu n'enregistre pas, je pense qu'à chaque appel de la fonction, tu ouvre un nouvelle feuille, comme tu ne la ferme pas, il se peut que le second appel, en crée une qui a le même nom et que c'est pour cette raison que c'est toujours à la ligne 25 que s'effectue le collage???
    Il faut exécuter pas à pas pour voir ce qui se passe.

    @+

  11. #11
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Je croyé avoir réussi, mais en fait non. Pour que vous compreniez mieux, je vous ai mis le bon de commande vierge en annexe.

    J'ai testé le code suivant :

    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
    Private Sub CmdAjouterArticle_Click()
     
    Dim sql As String
    Dim oRst As DAO.Recordset
    Dim oRstMAJ As DAO.Recordset
    Dim oRstArticle As DAO.Recordset
    Dim odb As DAO.Database
     
    Dim Id_Article As Integer
    Dim Reference As String, message As String, ValeurInuptBox As String, Titre As String
    Dim Prix As Integer
    Dim designation As String
     
    Dim i As Long, lignevide As Long
     
    Set odb = CurrentDb
     
    GetAdresseGMAO
     
    Id_Article = Me.lstResults
    '============================Prix et référence de l'id sélectionné
    sql = "select * from tbl_Article Where Id_Article = " & Id_Article & " "
    Set oRst = odb.OpenRecordset(sql, dbOpenDynaset)
    Reference = oRst.Fields("Ref_Article").Value
    Prix = Nz(oRst.Fields("PrixUnitaireStock").Value, 0)
    '=============================Désignation de l'id selectionnée
     sql = "SELECT tbl_Article.Ref_Article, tbl_Designation.Designation FROM tbl_Designation INNER JOIN tbl_Article ON tbl_Designation.Id_Designation = tbl_Article.Id_Designation where tbl_Article.Id_Article = " & Id_Article & ""
     Set oRst = odb.OpenRecordset(sql, dbOpenDynaset)
     designation = oRst.Fields("Designation").Value
     
    message = "Quantité à commander : "
    Titre = "Veuillez indiquer la quantité à commander"
    ValeurInuptBox = InputBox(message, Titre)
     
    If ValeurInuptBox = "" Then
    Exit Sub
    Else
    End If
     
    If IsNull(ValeurInuptBox) Then
    MsgBox ("Veuillez Indiquer une valeur dans la zone de saisie")
    Exit Sub
    Else
    End If
     
    If ValeurInuptBox < 1 Then
    MsgBox ("Veuillez entrer une valeur différente de 0 ou positive")
    Exit Sub
    Else
    End If
     
    On Error GoTo err_book
     
       If xlApp Is Nothing Then
          Set xlApp = CreateObject("Excel.Application")
       End If
     
       xlApp.Visible = True
       xlApp.WindowState = xlMaximized
     
       xlBook.Activate ' active ou teste si le classeur est ouvert
     
       Set xlSheet = xlApp.Worksheets("Commande")
    '==============================récupère le numéro de la ligne vide
    lignevide = xlSheet.Range("A23").End(xlDown).Row
    '==============================si ta plage d'avant est réservée alors tu change la valeur
        If lignevide < 25 Then
            lignevide = 25
     
            xlSheet.Range("A" & lignevide).Value = designation
            xlSheet.Range("B" & lignevide).Value = Reference
            xlSheet.Range("C" & lignevide).Value = ValeurInuptBox
            xlSheet.Range("D" & lignevide).Value = Prix
     
            Else
     
            lignevide = lignevide + 1
     
            xlSheet.Range("A" & lignevide).Value = designation
            xlSheet.Range("B" & lignevide).Value = Reference
            xlSheet.Range("C" & lignevide).Value = ValeurInuptBox
            xlSheet.Range("D" & lignevide).Value = Prix
     
            End If
     
    Exit Sub
     
    err_book: ' si classeur fermé
    Set xlBook = xlApp.Workbooks.Open(AdresseGmao + "Dossiers GMAO\Ecriture Access vers Excel\Commande temporaire\Commande Vierge.xls")
     
    Resume ' Retour à la suite de l'erreur.
     
    End Sub
    Pour la première ligne, ça va ça se colle en A25, mais après ça récrase toujours.

    Le résultat renvoyé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lignevide = xlSheet.Range("A23").End(xlDown).Row
    Est toujours 24, même s'il y a qulque chose en A25...

    Comment cela est-il possible?
    Fichiers attachés Fichiers attachés

  12. #12
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    J'ai pensé à quelque chose. Je pense que en partant de A24, c'était la bonne solution.

    Seulement, en A48, j'ai quelque chose d'écrit, donc lui automatiquement il écrit en A49.

    Il faudrais que je le limite à écrire entre A25 et A45 et que si il dépasse A45 alors il crée une nouvelle feuille en récupérant Entete, Date... et en écrivant dans la nouvelle feuille en A25.

    Quand même quelque chose que je ne comprend pas

    Pour le moment, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lignevide = xlSheet.Range("A23").End(xlDown).Row
    Donc si je suis mon raisonnement qui n'est peut être pas le bon:

    Au début on dit que Ligne vide s'accroche en A23 et qu'il cherche la prochaine ligne vide.

    Comme j'ai une entete en A24, il devrais me dire A25. Mais ici il me retourne A24???

    Bref, après je lui dit de toute façon que si :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If lignevide < 25 Then
            lignevide = 25
    Donc là, c'est logique, il colle en 25.

    Je simule un nouvel ajout

    J'ai quelque chose en A24, quelque chose en A25, il devrais me dire que ligne vide = A26?

    Eh bien non, ligneVide est encore égal a A24, donc il me récrase ce que j'avais collé précédement en A25.

    C'est pour ça que ça n'incrémente pas. Je pense que ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lignevide = xlSheet.Range("A23").End(xlDown).Row
    Ne me permet pas de chercher la dernière ligne vide.

    Maintenant autre Test

    Si a la place de A23, je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lignevide = xlSheet.Range("A24").End(xlDown).Row
    Même si j'ai quelque chose en A25, il vient me dire que dernière ligne = A48, là où sur mon bon de commande vierge, il y a "Responsable Maintenance".

    Qui peux m'expliquer ce qui ne va pas parce que là je ne vois pas comment il faut faire...

    En fait ce qui se passe, c'est que ce code me renvoi la première ligne qu'il trouve sur son chemin et non pas la dernière ligne non vide qu'il trouve.

Discussions similaires

  1. [Débutant] [POO] Tester si la cellule est vide dans un tableau de cellules
    Par ghada97 dans le forum MATLAB
    Réponses: 2
    Dernier message: 23/09/2013, 13h27
  2. [XL-2010] Trouver la dernière cellule non vide dans un classeur excel fermé
    Par julienIS dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/03/2013, 11h49
  3. Réponses: 23
    Dernier message: 21/07/2009, 14h19
  4. [VBA-E]Tester si une cellule est vide dans un cas particulier
    Par tonnick dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/09/2007, 10h12
  5. Tester si une cellule est vide
    Par amka dans le forum Access
    Réponses: 1
    Dernier message: 09/08/2006, 15h58

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