Placer une condition dans ma boucle

bonjour,

Dans le code repris ci-dessous, j'ajoute des lignes dans un feuille suivant que dans feuil6(BD Articles) la colonne M5 à fin de tableau comporte un nombre supérieur à zéro et différent de rien (en fait effectue une commande automatique).

j'aimerai traiter cette commande automatique en tenant compte des commandes en cours. il faudrait pour cela ajouter une double condition avant d'inscrire la ligne:

regarder dans la feuille (feuil1(souffrances)) si le code se trouvant de B2 jusque fin de tableau correspond à un code de la feuil6(BD Articles) se trouvant de A5 à fin de tableau de la ligne que l'on va ajouter

ET

que la cellule de la feuil1(Souffrances) L2 à fin de tableau correspondant à la ligne B2 fin de tableau soit bien vide .

Si répond oui aux deux conditions ajoute la ligne, si répond non à la première condition ajoute la ligne

Merci de votre aide

Option Explicit

Private Sub CommandButton1_Click()
 'commande Trimestrielle via bouton dans le menu

Application.CommandBars("Workbook tabs").ShowPopup

Dim wk_fichier As Workbook
Dim ws_feuil1 As Worksheet
Dim ws_feuil2 As Worksheet

Dim lstrw_feuil1 As Long, lstrw_feuil2 As Long

Dim ligne_coller As Long
Dim i As Integer
Dim VariableNom As String
Dim msg, Style, Title, Help, Ctxt, Reponse1, Reponse2, MyString

msg = "Avez-vous effectué la mise à jour avec le listing marchés LOG?"    ' Definition du message.
Style = vbOKCancel    ' Definition bouton.
Title = "Vérification de mise à jour"    ' Definition du titre.
Help = "DEMO.HLP"    ' Define Help file.
Ctxt = 2000    ' Define topic context.
Reponse1 = MsgBox(msg, Style, Title, Help, Ctxt)

   If Reponse1 = vbCancel Then
      Exit Sub
   Else

VariableNom = ActiveSheet.Name

msg = "Voulez-vous insérer la Cde pour la période " & VariableNom & "?"    ' Definition du message.
Style = vbOKCancel    ' Definition bouton.
Title = "CONFIRMATION D'INSERTION DE COMMANDE"    ' Definition du titre.
Help = "DEMO.HLP"    ' Define Help file.
Ctxt = 2000    ' Define topic context.
Reponse2 = MsgBox(msg, Style, Title, Help, Ctxt)

   If Reponse2 = vbCancel Then
      Exit Sub
   Else

   'Partie ou l'on remplit les codes à commander avec les informations de la BD Articles

'définir les variables fichiers et onglets
Set wk_fichier = ActiveWorkbook
Set ws_feuil1 = wk_fichier.Worksheets("BD Articles") '6 entre parenthèse indique la feuille 1 qui est la BD articles
Set ws_feuil2 = ActiveSheet  'onglet période désigné par le choix Application.CommandBars listant les onglets

'identifier dernière ligne colonne A feuil1 (BD ARTICLES)
lstrw_feuil1 = ws_feuil1.Cells(Rows.Count, 1).End(xlUp).Row

'commencer la boucle sur les lignes
For i = 5 To lstrw_feuil1

    'identifier le Nbre à commander dans la feuil1 (BD ARTCILES), et si supérieur à zéro, copier coller dans la période de commande désignée (feuille2)
            If ws_feuil1.Cells(i, 13) <> "" And ws_feuil1.Cells(i, 13) > 0 Then

             'identifier nombre de lignes remplies dans la feuille identifiée par l'onglet actif via Application.CommandBars
              lstrw_feuil2 = ws_feuil2.Cells(Rows.Count, 2).End(xlUp).Row

              'Définit la variable pour la boucle FOR incrémentée d'une ligne
              ligne_coller = lstrw_feuil2 + 1

              'copier coller de la BD Articles vers onglet actif selectionnée via Application.CommandBars
              ws_feuil2.Cells(ligne_coller, 2) = ws_feuil1.Cells(i, 1)
              ws_feuil2.Cells(ligne_coller, 3) = ws_feuil1.Cells(i, 2)
              ws_feuil2.Cells(ligne_coller, 4) = ws_feuil1.Cells(i, 7)
              ws_feuil2.Cells(ligne_coller, 5) = ws_feuil1.Cells(i, 13)
              ws_feuil2.Cells(ligne_coller, 8) = "I"
              ws_feuil2.Cells(ligne_coller, 10) = ws_feuil1.Cells(i, 14)
              ws_feuil2.Cells(ligne_coller, 13) = ws_feuil1.Cells(i, 15)
              ws_feuil2.Cells(ligne_coller, 14) = ws_feuil1.Cells(i, 16)
              ws_feuil2.Cells(ligne_coller, 15) = ws_feuil1.Cells(i, 17)
              ws_feuil2.Cells(ligne_coller, 16) = ws_feuil1.Cells(i, 18)
              ws_feuil2.Cells(ligne_coller, 17) = ws_feuil1.Cells(i, 19)
              ws_feuil2.Cells(ligne_coller, 18) = ws_feuil1.Cells(i, 20)
              ws_feuil2.Cells(ligne_coller, 19) = ws_feuil1.Cells(i, 21)
              ws_feuil2.Cells(ligne_coller, 20) = ws_feuil1.Cells(i, 22)
              ws_feuil2.Cells(ligne_coller, 21) = ws_feuil1.Cells(i, 23)
              ws_feuil2.Cells(ligne_coller, 22) = ws_feuil1.Cells(i, 24)

                     With ws_feuil2 'place un lien hypertexte permettant un retour sur l'article plus facile
                     .Hyperlinks.Add Anchor:=.Cells(ligne_coller, 1), _
                      Address:="", SubAddress:="'" & VariableNom & "'!A" & ligne_coller, TextToDisplay:=VariableNom
                    End With

            End If  'fin de condition afin de ne créer la ligne que si il y à une commande effective
Next    'suite de la boucle jusqu'au nombres de llignes que comporte la BD Articles (lstrw_feuil1)

    End If  'fin de condition assurance de mise à jour fichier log
    End If  'Fin de condition assurance d'être dans le bon fichier pour inserer la commande

End Sub

Bonjour Vuerings,

Il manque le fichier SVP

A+

7cdeauto.xlsm (282.20 Ko)

info, pour lancer une commande passer par le menu et sélectionner commande trimestrielle , choisir son trimestre et voila.

du coup le fichier souffrance se met à jour

Re,

Je regarde dès que je peux, merci pour le fichier 👍

A+

Merci à vous surtout

Re,

J'espère avoir tout bien cerné voici le code (optimisé) à tester en mode pas à pas

Private Sub CommandButton1_Click()
  'commande Trimestrielle via bouton dans le menu
  Application.CommandBars("Workbook tabs").ShowPopup
  Dim ShtBdD As Worksheet
  Dim dLigBdArt As Long, LigBdArt As Long
  Dim ShtSouf As Worksheet
  Dim dLigSouf As Long, LigSouf As Long
  Dim ShtD As Worksheet
  Dim nLigD As Long
  '
  ' Poser la question
  If MsgBox("Avez-vous effectué la mise à jour avec le listing marchés LOG ?", _
    vbOKCancel, "Vérification de mise à jour", "DEMO.HLP", 2000) = vbCancel Then Exit Sub
  '
  ' Sinon
  If MsgBox("Voulez-vous insérer la Cde pour la période " & ActiveSheet.Name & "?", _
    vbOKCancel, "CONFIRMATION D'INSERTION DE COMMANDE", "DEMO.HLP", 2000) = vbCancel Then Exit Sub
  '
  ' Partie ou l'on remplit les codes à commander avec les informations de la BD Articles
  ' définir les variables fichiers et onglets
  Set ShtBdD = ThisWorkbook.Sheets("BD Articles")
  Set ShtSouf = ThisWorkbook.Sheets("Souffrances")
  Set ShtD = ActiveSheet  'onglet période désigné par le choix Application.CommandBars listant les onglets
  ' Dernière ligne de la feuille SOUFFRANCE
  dLigBdArt = ShtBdD.Range("A" & Rows.Count).End(xlUp).Row
  ' Pour chaque ligne de la feuille BD Articles
  For LigBdArt = 5 To dLigBdArt
    ' Si la cellule de colonne M est Null ou = 0, on passe à la ligne suivante
    If ShtBdD.Range("M" & LigBdArt) = "" Or ShtBdD.Range("M" & LigBdArt) = 0 Then GoTo SuiteLigne
    ' Sinon chercher cet article dans la feuille Souffrances
    LigSouf = LigArtF(ShtSouf.Range("B" & LigBdArt).Value)
    ' Si l'article n'a pas été trouvé dans BD Articles, on passe à la ligne suivante
    If LigSouf = 0 Then GoTo SuiteLigne
    ' Sinon, si la cellule de la colonne "L" de la lgine trouvée est vide
    If ShtSouf.Range("L" & LigSouf) = "" Then
      ' Nouvelle ligne dans l'onglet actif
      nLigD = ShtD.Cells(Rows.Count, 2).End(xlUp).Row + 1
      'copier coller de la BD Articles vers onglet actif selectionnée via Application.CommandBars
      ShtD.Cells(nLigD, 2) = ShtBdD.Cells(LigBdArt, 1)
      ShtD.Cells(nLigD, 3) = ShtBdD.Cells(LigBdArt, 2)
      ShtD.Cells(nLigD, 4) = ShtBdD.Cells(LigBdArt, 7)
      ShtD.Cells(nLigD, 5) = ShtBdD.Cells(LigBdArt, 13)
      ShtD.Cells(nLigD, 8) = "I"
      ShtD.Cells(nLigD, 10) = ShtBdD.Cells(LigBdArt, 14)
      ShtD.Cells(nLigD, 13) = ShtBdD.Cells(LigBdArt, 15)
      ShtD.Cells(nLigD, 14) = ShtBdD.Cells(LigBdArt, 16)
      ShtD.Cells(nLigD, 15) = ShtBdD.Cells(LigBdArt, 17)
      ShtD.Cells(nLigD, 16) = ShtBdD.Cells(LigBdArt, 18)
      ShtD.Cells(nLigD, 17) = ShtBdD.Cells(LigBdArt, 19)
      ShtD.Cells(nLigD, 18) = ShtBdD.Cells(LigBdArt, 20)
      ShtD.Cells(nLigD, 19) = ShtBdD.Cells(LigBdArt, 21)
      ShtD.Cells(nLigD, 20) = ShtBdD.Cells(LigBdArt, 22)
      ShtD.Cells(nLigD, 21) = ShtBdD.Cells(LigBdArt, 23)
      ShtD.Cells(nLigD, 22) = ShtBdD.Cells(LigBdArt, 24)

      With ShtD 'place un lien hypertexte permettant un retour sur l'article plus facile
        .Hyperlinks.Add Anchor:=.Cells(nLigD, 1), _
          Address:="", SubAddress:="'" & ShtD.Name & "'!A" & nLigD, TextToDisplay:=ShtD.Name
      End With
    End If  'fin de condition afin de ne créer la ligne que si il y à une commande effective

SuiteLigne:
  Next LigBdArt    'suite de la boucle jusqu'au nombres de llignes que comporte la BD Articles (lstrw_feuil1)

End Sub

La fonction LigArtF(CodeArt)

' Fonction pour trouver la ligne de l'article cherché
Function LigArtF(CodeArt As String)
  Dim CelF As Range
  With ThisWorkbook.Sheets("Souffrances")
    Set CelF = .Range("B:B").Find(What:=CodeArt, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
  End With
  If Not CelF Is Nothing Then LigArtF = CelF.Row Else LigArtF = 0
End Function

Et le fichier

13vuerings-cdeauto.xlsm (284.22 Ko)

A+

Merci de la rapidite. Je teste cela demain en matinee .

belle soiree

bonjour. Merci pour le code mais à la ligne

Ligsouf = LigArtF jai un code erreur sub ou fonction non definie pour LigArtF....

Bonjour Vuerings,

Désolé j'ai répondu un peu trop vite vendredi

Il y a une fonction qui va avec le code, j'ai tout mis dans ma réponse précédente

A+

bonsoir, après le test du fichier joint avec votre correction, je ne vois pas de changement au résultat...

Pour le tester, il y à déjà une commande trimestrielle en cours (1Trim). la feuille souffrances est un recap des commandes en cours, et rien n'est donc inscrit en direct dedans mais cela vous l'aviez compris.

si je lance une 2Trim via le menu, si une référence est placée dans la colonne "BC" colonne L dans la 1Trim, cette référence ne devrais plus apparaitre en commande dans la 2Trim, alors qu'ici elle y apparait toujours...

Espère avoir expliqué de façon compréhensible, désolé, pas facile

Si je résume, quand on lance une commande trimestrielle, il faut regarder chaque ligne de la feuille BD Articles si en colonne M, un chiffre y est indiqué et, que si cette même référence existe déjà dans l'onglet souffrance et que la case BC n'est pas remplie, alors nous pouvons ajouter la ligne dans la 2Trim, si un BC colonne L est renseigné, cette référence ne doit pas être prise en compte.

Merci de votre aide

Bonjour vuerings,

Alors je n'irais pas par quatre chemins

1) Ce n'est pas ce que vous expliquez dans votre tout 1er post, vous ne parlez que de "BD Articles" et "Souffrances"

2) Dans le fichier joint, il n'y a aucune référence BC dans la colonne "L", donc toutes les lignes sont reprises

Donc résultat, je perds mon temps et je n'aime pas ça

Peut-être qu'un autre contributeur comprendra mieux que moi... perso je laisse tomber (je ne suis pas patient)

à la première condition il va bien dans la BD articles chercher les besoins mais à la deuxième condition si l'article apparaît déjà dans la feuille souffrance et que la colonne bc est remplie l'article ne dois pas être pris en compte. Désolé de ne pas s'être compris

Et je suis daccord que rien nest encore encodé dans la comonne bc mais si il y avait quelqie chose la ligne ne devrais pas se creer

Merci à BRUNO M45, il ne devait pas être loin de la solution, mais....

Rechercher des sujets similaires à "placer condition boucle"