Si une colonne vide alors ..

Résolu
julien -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Ci joint mon programme qui fonctionne parfaitement,

Après modification du cahier des charges j'aimerais que ce programme s'exécute que si la colonne 21 n'est pas vide ..

J'ai essayé avec des for , des if et rien ne marche je n'arrive pas à ce que je veux ..

Pouvez vous m'aider s'il vous plait ?

3 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Ci joint mon programme qui fonctionne parfaitement
    Malheureusement, pas de fichier joint au message.


    Pour joindre un fichier sur les forums de ccm il faut:
    ________________________________________________________
    - se rendre sur le site : https://www.cjoint.com/
    - cliquer sur parcourir
    - rechercher le fichier
    - cliquer sur ouvrir
    - cliquer sur créer le lien Cjoint
    - copier le lien
    - revenir ici le coller dans une réponse
    ________________________________________________________


    0
    1. julien
       
      http://www.cjoint.com/c/FDgkF0prswp

      Désolé j'ai oublié de mettre le lien ^^ merci de ta réponse ;)
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Alors, si j'ai bien compris, tu as une ,Sub principale (appelons là Sub Main()) qui lance ta Sub Message.
    Or tu souhaites qu'elle ne se lance que si et seulement si la colonne 21 n'est pas vide.
    Si oui, ta Sub Main() devient :

    Sub Main()
    'code
    'du code
    'encore du code
    With Sheets("Feuil1") 'ADAPTE LE NOM DE LA FEUILLE
        If WorksheetFunction.CountA(.Columns(21)) > 0 Then Call Message
    End With
    'le reste du code
    'encore du code
    'encore un peu de code
    'fini
    End Sub

    0
    1. julien
       
      Enfait , je veux qu'elle ne traite que la ligne pour la quelle la colonne 21 n'est pas vide ..

      Ton programme c'est ce que je faisais mais ca converti toutes les lignes .. je te fourni un programme complet cette fois : http://www.cjoint.com/c/FDgluPyk6dp

      Merci de ton aide ..
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > julien
       
      Teste ceci :

      Sub Main()
      'code
      'du code
      'encore du code
      Call Message_2
      'le reste du code
      'encore du code
      'encore un peu de code
      'fini
      End Sub
      
      Sub Message_2()
      
      ' Ce programme va chercher, pour chaque FMC, le message de panne qui lui correspond si il existe et l'afficher sur la deuxieme page
      
      
      Application.ScreenUpdating = False     'Désactivation de l'actualisation de l'écran pour exécution plus rapide
      Dim j As Integer                       'Déclaration de la variable j
      Dim i As Integer                       'Déclaration de la variable i
      Dim DL As Integer
      
      With Sheets("Feuil1")
          DL = derlig_reelle(.Columns(15))   'dernière ligne non vide de la colonne O
          For j = 3 To DL
              For i = 3 To DL
                  If .Cells(i, 18).Value = .Cells(j, 15).Value And .Cells(i, 21).Value <> "" Then
                      .Cells(j, 16) = .Cells(i, 18).Offset(0, -1).Value
                      Exit For
                  End If
              Next i
              If .Cells(j, 16).Value = "" Then .Cells(j, 16).Value = "No messages available"
          Next j
      End With
      Call tri                               ' Appel de la fonction de tri
      Application.ScreenUpdating = True      ' Réactivation de l'actualisation de l'écran
      End Sub
      
      Private Function derlig_reelle(plage As Range) As Long
         'cas d'absence de données dans la plage à traiter :
         If WorksheetFunction.CountA(plage) = 0 Then derlig_reelle = 1: Exit Function
         'dans tous les autres cas :
         derlig_reelle = plage.Find("*", , , , , xlPrevious).Row
      End Function
      
      Sub tri()
      ' Ce programme a pour but d'effectuer un "tri" afin de ne plus afficher les données inutiles comme les "zéros"
      ' créés lors de l'application de l'algorithme. Ca permettera de présenter les résultats de manière claire et sans données superflues
      
      Dim i As Integer            'Déclaration de la variable i
      
      i = 3                       'La valeur i prend la valeure 3
      Do While i < 382 And ActiveCell.Value <> ""  ' Boucle , tant que i est inférieur a 382 et que la valeur de la cellule active est non nulle
          If Cells(i, 15).Value = 0 Then                 ' Si la cellule active est égale à 0
              Cells(i, 15).EntireRow.Hidden = True        ' Masquage de la ligne
          End If                  ' Fin de la condition
          i = i + 1               ' La variable i prend la valeure i+1
      Loop                        ' Boucle
      Cells(3, 1).Select          ' Selection de la cellule (3,1)
      End Sub
      
      
      
      0
    3. julien
       
      Merci de ton aide ,
      mais cela ne fonctionne toujours pas :/
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > julien
       
      J'ai modifié mon code dans le message précédent...
      remplacer
      And .Cells(j, 21).Value <> "" Then
      par
      And .Cells(i, 21).Value <> "" Then
      0
    5. julien
       
      Toujours pas .. rien ne se passe dans ton code , la colonne reste blanche ..

      Je viens de remarquer que dans la colonne équipement il y 'a un espace donc les instructions ne doivent pas être "" mais " " ;;

      Même après correction cela ne marche pas .. :'(
      0
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Donc, tu veux que le contrôle se fasse sur la même ligne?

    Si c'est ça, essaie :

    Sub Main()
    'code
    'du code
    'encore du code
    Call Message_2
    'le reste du code
    'encore du code
    'encore un peu de code
    'fini
    End Sub
    
    Sub Message_2()
    
    ' Ce programme va chercher, pour chaque FMC, le message de panne qui lui correspond si il existe et l'afficher sur la deuxieme page
    
    
    Application.ScreenUpdating = False     'Désactivation de l'actualisation de l'écran pour exécution plus rapide
    Dim j As Integer                       'Déclaration de la variable j
    Dim i As Integer                       'Déclaration de la variable i
    Dim DL As Integer
    
    With Sheets("Feuil1")
        DL = derlig_reelle(.Columns(15))   'dernière ligne non vide de la colonne O
        For j = 3 To DL
            If .Cells(j, 18).Value = .Cells(j, 15).Value And .Cells(j, 19).Value <> "" Then
                .Cells(j, 16) = .Cells(j, 17).Value
            End If
            'If .Cells(j, 16).Value = "" Then .Cells(j, 16).Value = "No messages available"
        Next j
    End With
    Call tri                               ' Appel de la fonction de tri
    Application.ScreenUpdating = True      ' Réactivation de l'actualisation de l'écran
    End Sub
    
    Private Function derlig_reelle(plage As Range) As Long
       'cas d'absence de données dans la plage à traiter :
       If WorksheetFunction.CountA(plage) = 0 Then derlig_reelle = 1: Exit Function
       'dans tous les autres cas :
       derlig_reelle = plage.Find("*", , , , , xlPrevious).Row
    End Function
    
    Sub tri()
    ' Ce programme a pour but d'effectuer un "tri" afin de ne plus afficher les données inutiles comme les "zéros"
    ' créés lors de l'application de l'algorithme. Ca permettera de présenter les résultats de manière claire et sans données superflues
    
    Dim i As Integer            'Déclaration de la variable i
    
    i = 3                       'La valeur i prend la valeure 3
    Do While i < 382 And ActiveCell.Value <> ""  ' Boucle , tant que i est inférieur a 382 et que la valeur de la cellule active est non nulle
        If Cells(i, 15).Value = 0 Then                 ' Si la cellule active est égale à 0
            Cells(i, 15).EntireRow.Hidden = True        ' Masquage de la ligne
        End If                  ' Fin de la condition
        i = i + 1               ' La variable i prend la valeure i+1
    Loop                        ' Boucle
    Cells(3, 1).Select          ' Selection de la cellule (3,1)
    End Sub


    0
    1. julien
       
      Rien ne se passe , rien ne se copie dans la colonne ...

      Je doit partir je reviens demain matin , en espérant que tu n'en ai pas marre ^^

      A demain et bonne soirée .. MERCI
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > julien
       
      Bonjour,

      Je reviens, et on va te faire ça...

      Tu dis :
      Ce programme à pour but d'afficher le message relatif au code , deux colonne cachées ( Q et R ) contiennent les référence ( Q = message , R = code ) , le programme doit afficher en colonne P le message du code contenu dans la colonne O.

      Je comprends :
      que tu as, en colonnes Q et R une liste des messages en fonctions de code.

      Tu dis :
      De la ligne 3 à la dernière ligne , Si la valeur de la cellule de la colonne O et la même que celle de la colonne R et que la cellule de la colonne S n'est pas vide , alors faire un offset de 1 et copier la valeur de la colonne Q dans la colonne P

      Je comprends :
      > SI O3 = R3 ET S3 Non Vide ALORS => on copie le message.
      > SI O4 = R4 ET S4 Non Vide ALORS => on copie le message.
      > SI O5 = R5 ET S5 Non Vide ALORS => on copie le message.
      > etc...
      Mais je suis sur que ce n'est pas ce que tu veux.

      Tu dis :
      Si la colonne est vide on ne fait pas cette opération ==> la cellule reste donc vide .

      Oui, mais là, ta colonne dans le fichier communiqué, est remplie... Donc tu souhaites qu'on efface son contenu quand la condition n'est pas vérifiée???
      0
    3. julien
       
      Désolé du retard , j'ai répondu mais apparemment le message s'est perdu ^^

      Tu as presque tout compris , à un détail ,

      Les code contenus dans la colonne O peuvent se trouver n'importe ou dans la colonne R et le but est de rechercher la ligne de la colonne R qui correspond au code présent dans 03 ( par exemple ) et copier le message associé ..

      Si la colonne S est vide , il ne faut rien faire ( donc si on ne fait rien les cases seront vide)

      Il ne faut pas effacer puisqu'il y aura d'autre données dedans ^^

      ...

      Je m'emmêle les pinceaux moi-même :(
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > julien
       
      Si je comprends bien :

      > SI O3 est dans R ET S3 Non Vide ALORS => on copie le message.
      > SI O4 est dans R ET S4 Non Vide ALORS => on copie le message.
      > SI O5 est dans R ET S5 Non Vide ALORS => on copie le message.
      > etc...
      0
    5. julien
       
      Exact ,

      > SI 03 est dans R ET S3 Non Vide ALORS ==> On copie le message correspondant au code (Offset de -1 par rapport à R )
      0