Formule si/et/ou en VBA

Bonjour à tous

Il y a absolument 3 conditions obligatoire à respecter pour chaque possibilité afin mettre le commentaire "Pas de décompte" :

Si la cellule (j,13) est vide et que si la cellule (j,14) est vide et que (j,19)<15000 alors "pas de décompte" sinon "décompte à émettre"

Deuxième possibilité : si la cellule (j,13) est vide et que la cellule(j,8)="002160" ou "001170" ou "001121" et que (j,19) <15000 alors "pas de décompte" sinon "décompte à émettre"

Voici la macro mais qui fonctionne pas !

Sub test3()

With Sheets("SUIVTRANS EN COURS")

Derligne = .Range("A" & Rows.Count).End(xlUp).Row

For j = 2 To Derligne

If .Cells(j, 13).Value = "" And _

.Cells(j, 14).Value = "" And _

.Cells(j, 19).Value < 15000 And _

.Cells(j, 8).Value = "002160" Or _

.Cells(j, 8).Value = "001170" Or _

.Cells(j, 8).Value = "001121" Then

.Cells(j, 13).Value = "PAS DE DECOMPTE"

Else

.Cells(j, 13).Value = "DECOMPTE A EMETTRE"

End If

Next j

End With

End Sub

Si ca peut vous aider voici une formule qui traduit ce que je veux faire sous VBA :

=SI(ET(Q7="";OU(H7="001121";H7="001170";H7="002160");ABS(S7)<15000);"PAS DE DECOMPTE";"DECOMPTE A EMETTRE")

Bonjour KOBD, le forum,

Demande déjà en cours ici :

https://forum.excel-pratique.com/viewtopic.php?f=2&t=118886

Je t'avais d'ailleurs posté une proposition et attendais un retour....

Cordialement,

Ah désolé j'avais vu ta réponse ...

Je viens de tester et ça ne fonctionne toujours pas

Re,

Qu'est-ce qui ne fonctionne pas ?

Si N est vide et Q est vide et si R est inférieur à 15000 et ou H= 1121, H= 1170, H=2160 alors on indique PAS DE DECOMPTE, sinon DECOMPTE A EMETTRE ?

Ça semble pourtant fonctionner chez moi....à condition de cliquer sur le bouton....

Cordialement,

Bonjour,

Il y a des chances qu'on se trompe de problème, et qu'il ne s'agit pas d'un soucis de syntaxe mais plutôt d'un soucis lié aux données ou aux plages de références. Pour ça, il faudrait que l'on travaille sur un fichier, et pas juste sur un extrait de code ou de formule...

Il prend pas en compte une condition. Exemple : si en cellule Q c'est pas vide et que il y as bien en en colonne H l'une des 3 valeur et que en R <15000 alors pas de décompte sinon décompte à émettre.

Je me réexplique :

Il y a absolument 4 conditions obligatoire à respecter pour mettre le commentaire "Pas de décompte" :

Si la cellule (j,13) est vide et que si la cellule (j,14) est vide et que cellule (j,17) est vide et que (j,19)<15000 alors "pas de décompte" sinon "décompte à émettre"

Deuxième possibilité : si la cellule (j,13) est vide et que si la cellule (j,14) est vide et que la cellule(j,8)="002160" ou "001170" ou "001121" et que (j,19) <15000 alors "pas de décompte" sinon "décompte à émettre"

J'espère tu as mieux compris la logique et se que je voudrais faire dans ma formule !

On a bien compris la logique, c'est le 2ème post que tu fais sur le sujet, et tu redonnes le même énoncé. Etant donné que de notre côté on ne reproduit pas ton erreur, je pense pas qu'elle se situe à ce niveau. C'est pourquoi on attend de toi que tu fournisses un fichier comme base de travail...

Case Cells(j, "N") = "" And Cells(j, "M") = "" And Cells(j, "Q") = "" Or Cells(j, "R") <> "", Cells(j, "S") < 15000, Cells(j, "H").Value = 1121 Or Cells(j, "H").Value = 1170 Or Cells(j, "H").Value = 2160

Sur cette ligne que ca bloque aussi

Voici mon fichier ! Merci beaucoup de votre aide !

63obadj.xlsx (15.73 Ko)

Une fois ajouté, ton code à l'air de fonctionner pour moi. Donc je ne vois pas bien où ce situe ton problème. Lorsque tu lances la macro, qu'est ce qui se passe ?

  • -> Rien
  • -> Les valeurs obtenues ne sont pas les bonnes
  • -> Tu as une erreur d’exécution (quel code d'erreur ? Quelle ligne est surlignée ?)

La macro fonctionne sauf que les valeur ne sont pas les bonnes....

Je crois que ma toute première proposition sur ton premier post permettait bien de résoudre le problème. Voilà le code révisé :

Sub test3()

With Sheets(1)
    Derligne = .Range("A" & Rows.Count).End(xlUp).Row
    For j = 2 To Derligne
        If .Range("M" & j) = "" And .Range("N" & j) = "" And .Range("S" & j) < 15000 And (.Range("H" & j) = "002160" Or .Range("H" & j) = "001170" Or .Range("H" & j) = "001121") Then
            .Range("M" & j) = "PAS DE DECOMPTE"
        Else
            .Range("M" & j) = "DECOMPTE A EMETTRE"
        End If
    Next j
End With

End Sub

J'ai changé le mode de référence pour les cellules, pour mieux s'y retrouver (mais ça ne change rien au fonctionnement du code), et j'ai ajouté les parenthèses autour des conditions "Or".

Je retrouve bien, à priori, les résultats attendus.

Précision importante, en l'absence des parenthèse, VBA interprète les conditions dans l'ordre. Ce qui revenait à écrire :

Si (Condition1 et Condition2 et Conition3 et Condition4) ou Condition5 ou Condition6, alors...

Avec cette écriture, il faut soit que les 4 premières conditions soient toutes vraies, ou qu'au moins une des 2 dernières soit vraie pour que l'on exécute les instructions directement situées après "alors".

Bonjour à tous,

La formule marche mais elle ne prends pas en compte la colonne 17 qui doit être = à rien.... Pourtant la formule l'indique bien....

Ensuite, lorsque que je lance la macro, elle veut pas aller jusqu'à la dernière ligne donc du coup j'indique qu'il faut qu'il prenne la ligne de 537 à 4000 par exemple. Sauf que la, la macro ce lance et s’arrête à la ligne 2183 et ça m'affiche direct un message d' "erreur d'éxécution '13 : incomptaibilité de type" Et ca me surligne cette ligne en jaune alors qu'elle est totalement correcte !

Code :

If .Cells(j, 14) = "" And .Cells(j, 13) = "" And .Cells(j, 17) = "" And CDbl(.Cells(j, 19)) < 15000 And (.Cells(j, 8).Value = "002160" Or .Cells(j, 8).Value = "001170" Or .Cells(j, 8).Value = "001121") Then

Vraiment je ne comprends pas pourquoi il me fait ça et même sur les lignes qu'il me sort, quand je lance la macro jusqu'à qu'elle bloque à la ligne 2183 : les résultats ne prennent pas en compte ma colonne 17 qui doit être vide ... !!!

Merci de votre AIDE LES AMIS !

Bonjour,

La détermination de la dernière ligne repose sur la colonne A, qui doit donc être complétée correctement. L'opération est équivalente au fait de te placer dans la dernière cellule du tableur en colonne A, puis à appuyer sur CTRL + FLECHE HAUT.

"CDbl()" est inutile si le contenu de la cellule est un nombre. C'est d'ailleurs ce qui doit poser problème à la ligne 2183. Le contenu n'est pas un nombre et ne peut être converti, ce qui génère une erreur.

Ensuite, l'une de tes conditions repose sur le fait que ta cellule en colonne M est vide, auquel cas tu y inscris quelque chose. Donc quand tu lances à nouveau la macro, prend la peine d'effacer le contenu de cette colonne, ou supprime la condition.

Concernant la colonne 17, vérifie qu'elle est réellement vide, ou supprime le contenu même si rien n’apparaît à l'écran (ex: un espace est invisible, mais la cellule n'est alors pas vide).

Pedro tu as raison il y a un problème dans ma colonne 17 : dans certaine cellule qui sont vide il y a des espaces et dans d'autre cellule ou ya des dates il y a aussi des espaces...

Donc, ma colonne 17 comporte de nombreux espaces ainsi que des caractères spéciaux.... et je suis obligé de corriger cette colonne pour que mon autre marco fonctionne

J'aimerais savoir comment je pourrais modifier cela : "05 10 2018" par lui dire qu'il supprime tous les espaces avant, après et au milieu des caractère dans la cellule et qu'il me remplace par "05/10/2018" sans espaces.

J'ai déjà coder ça sauf qu'il faut que je rajoute qu'il me rajoute les "/" entre les chriffre à la place des espaces par exemple entre le "05" et le "10" et ainsi de suite

J'ai commencer par coder comme ça, pouvez vous m'aider svp !

Sub espaces()

With Sheets("SUIVTRANS EN COURS")

Derligne = .Range("A" & Rows.Count).End(xlUp).Row

For j = 2 To Derligne

Cells(j, 17) = Application.Trim(Application.Substitute(Cells(j, 17), Chr(160), Chr(32)))

Next j

End With

End Sub

Merci

Bonjour KOBD,

Avant de proposer un code, merci de transmettre un fichier ne contenant que cette colonne, avec tous les cas de figure possibles. On évitera de travailler sur des solutions inadaptées à cause de cas non répertoriés...

Il ne suffit pas d'écrire la date au format JJ/MM/AAAA, il faut aussi la convertir en date pour qu'Excel puisse l'utiliser correctement. Sinon pour lui ce sera juste du texte...

Ok merci beaucoup Pedro voici le fichier je t'ai mis juste la colonne 17 :

C'est toujours le même format au final, donc assez simple à gérer. Je te propose 2 codes :

1.

Sub ConvertDate()

Dim i As Long, Temp As String

With Sheets("SUIVTRANS EN COURS")
    Derligne = .Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To Derligne
        If Not IsEmpty(.Cells(i, 17)) And Not IsError(.Cells(i, 17)) Then
            Temp = Replace(.Cells(i, 17), " ", "")
            .Cells(i, 17) = DateSerial(CInt(Right(Temp, 4)), CInt(Mid(Temp, 3, 2)), CInt(Left(Temp, 2)))
        End If
    Next i
End With

End Sub

2. Fonction perso :

Private Function ConvertirEnDate(ByVal DateTexte As String) As Date

DateTexte = Replace(DateTexte, " ", "")
ConvertirEnDate = DateSerial(CInt(Right(DateTexte, 4)), CInt(Mid(DateTexte, 3, 2)), CInt(Left(DateTexte, 2)))

End Function
'...
 .Cells(i, 17) =  ConvertirEnDate(.Cells(i, 17))
'...

Merci c'est génial pour le 1er code il y a un blocage sur cette ligne qui affiche une érreur de type 13 :

.Cells(i, 17) = DateSerial(CInt(Right(Temp, 4)), CInt(Mid(Temp, 3, 2)), CInt(Left(Temp, 2)))

Rechercher des sujets similaires à "formule vba"