Si une colonne vide alors ..

Résolu/Fermé
Signaler
-
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
-
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

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 667
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
________________________________________________________


http://www.cjoint.com/c/FDgkF0prswp

Désolé j'ai oublié de mettre le lien ^^ merci de ta réponse ;)
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 667
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

Merci de ton aide ,
mais cela ne fonctionne toujours pas :/
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 667 > 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
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 .. :'(
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 667 > julien
Alors, décris nous ce que tu souhaites faire.
Du style :
Sur les lignes de 3 à la fin de la colonne O,
Si le contenu de la cellule O&Ligne est présent en colonne R Et que la colonne U n'est pas vide
Alors
etc...
Désolé , je dois mal m'exprimer .. On va comparer par rapport a la colonne s car vide

Alors je formule clairement :

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.

Logique :

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

En gros , sur la même ligne :

Le message correspondant au code dans la colonne O devra donc s'afficher dans la colonne P et seulement si la valeur de la colonne S n'est pas vide .

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

Merci de ton aide , vraiment ..
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 667
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


Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 667 > 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...
Exact ,

> SI 03 est dans R ET S3 Non Vide ALORS ==> On copie le message correspondant au code (Offset de -1 par rapport à R )
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 667 > julien
Essaie ce code.
Avec le fichier que tu as transmis cela ne fait rien car la colonne S est vide.
Or tu demandes : SI S3 Non Vide ALORS
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
Dim r As Range

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, 19).Value <> "" Then 'si Range("S" & j) est non vide
            Set r = .Columns(18).Cells.Find(.Cells(j, 15).Value)
            If Not r Is Nothing Then
                .Cells(j, 16) = .Cells(r.Row, 17).Value
            End If
        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
Ouiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii :D :D

Je ne sais pas comment te remercier , tu as égayé ma journée , heureusement que des personnes comme toi existe :) :)

Merci beaucoup , et à bientôt peut-être :)
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 667 > julien
De rien beaucoup ;-)

A++