Fonction If et ElseIf dans situation complexe

wilfrid18

XLDnaute Nouveau
Bonjour,
C'est la 1ère fois que je viens sur le forum. Je me présente. Je connais très peu VBA, mais je tente d'écrire un script pour la gestion d'une petite association.
J'ai une macro principale que je dois réécrire car il y a une condition essentielle que j'ai omise. C'est du genre : "If ActiveCell.Value >= Sheets("y").Range("E2") Then Selection.Offset(1, 0).Select" et s'ensuit d'autres codes. Sauf que je dois introduire "ElseIf ActiveCell.Value < Sheets("y").Range("E2")". La macro fonctionnait correctement jusqu'à ce que je rencontre la condition: Quand les dates de la colonne (C:C) sont inférieures à aujourdh'ui.
J'ai essayé pas mal de choses, je n'arrive pas à trouver la solution. Ce que j'ai fait me semble plausible et pourtant cela ne fonctionne pas.
Quelqu'un peut-il m'aider à y voir plus clair ?
J'envoie un petit fichier excel.
Merci d'avance pour toute aide.
 

Pièces jointes

  • Classeur3.xlsm
    57 KB · Affichages: 56
  • Classeur3.xlsm
    57 KB · Affichages: 53
  • Classeur3.xlsm
    57 KB · Affichages: 57

Papou-net

XLDnaute Barbatruc
Re : Fonction If et ElseIf dans situation complexe

Bonjour wilfrid18, et bienvenue,

Un premier essai de ton code laisse apparaître l'erreur dans la ligne suivante :

Code:
Range("dateremb").Resize(, 11).Font.Bold = False
La plage nommée "dateremb" n'existe pas dans ton classeur.

Par ailleurs, il me semble que certaines opérations de sélection et de décalage de cellules sont parfaitement inutiles. Si tu expliquais le but de ta macro, il serait plus facile de t'aider à mieux le structurer et l'optimiser.

Cordialement.
 

wilfrid18

XLDnaute Nouveau
Re : Fonction If et ElseIf dans situation complexe

Salut,

Merci pour ta réponse. J'ai encore fait l'erreur de laisser trainer des reliquats du vrai script, car comme demandé je suis tenue de transformer le vrai en test pour ne pas donner des renseignements trop perso. Je présente mes excuses.
dateremb doit être remplacé par "mot". Ceci dit la vraie macro est 10 fois supérieure à ce que j'ai envoyé, mais je ne peux pas tout envoyer. Ce que je souhaite : Sélectionner toute la partie qui est avant et égale à la date d'aujourdh'ui et la mettre en gras, en se basant sur les dates de la colonne (C:C). Bien entendu cela peut varier énormément d'un dossier à l'autre. Certains dossiers n'ont que des dates avant aujourd'hui, d'autres après, d'autres du jour même, d'autres encore toutes ces dates mélangées. Si toutes les dates sont avant aujourd'hui, il ne devrait rien mettre en gras, si toutes les dates sont avant aujourdh'ui, il devrait tout mettre en gras. Les dates se suivent, un exemple si le 1er mois de paiement est mai, mai sera tout en bas de la liste, ensuite juin en second, juillet en 3ème, etc.; le mois le plus récent est toujours en haut. Je ne sais si je m'exprime bien.
Si tu as besoin d'autres renseignements, n'hésite pas à me le demander.
Merci pour ton intervention.
 

Papou-net

XLDnaute Barbatruc
Re : Fonction If et ElseIf dans situation complexe

Bonsoir wilfrid18,

Après lecture de ton message, il me semble qu'il est possible de simplifier énormément ton code.

S'il ne s'agit que de modifier la mise en gras de certaines lignes, en fonction de la date du jour, voici comment écrire la procédure :

Code:
Sub WorkBook_Open()
Dim Cel As Range, Dte As Date
Dte = Sheets("y").Range("E2").Value
With Sheets("x")
  For Each Cel In .Range("C12:C" & Rows.Count).SpecialCells(xlCellTypeConstants)
    .Range(Cel, Cel.Offset(0, 10)).Font.Bold = IIf(Cel.Value < Dte, True, False)
  Next
End With
End Sub
S'il y a d'autres actions à effectuer, voici comment je l'écrirais :

Code:
Sub WorkBook_Open()
Dim Cel As Range, Dte As Date
Dte = Sheets("y").Range("E2").Value
With Sheets("x")
  For Each Cel In .Range("C12:C" & Rows.Count).SpecialCells(xlCellTypeConstants)
    Select Case Cel.Value
      Case Is < Dte
        .Range(Cel, Cel.Offset(0, 10)).Font.Bold = True
       ...... ici les autres lignes de code
      Case Is >= Dte
        .Range(Cel, Cel.Offset(0, 10)).Font.Bold = False
        ...... ici les autres lignes de code
    End Select
  Next
End With
End Sub
Tu remarqueras que je n'ai pas utilisé le nom de plage que tu avais prévu, ce qui à mon avis n'est pas indispensable. La boucle limite la lecture aux cellules non vides de la colonne C, depuis C12 jusqu'au bas de la colonne, grâce à l'instruction "SpecialCells".

A toi de voir si une de ces deux solutions répond à ta demande dans le cadre de ton fichier de travail.

Si cela ne convient pas, n'hésite pas à revenir sur ce sujet.

Cordialement.
 

Staple1600

XLDnaute Barbatruc
Re : Fonction If et ElseIf dans situation complexe

Bonsoir à tous


Papou-net: On peut encore alléger le code ;) en zappant l'IIF
Code:
Sub WorkBook_Open()
Dim Cel As Range, Dte As Date
Dte = Sheets("y").Range("E2").Value
With Sheets("x")
  For Each Cel In .Range("C12:C" & Rows.Count).SpecialCells(xlCellTypeConstants)
     Cel.Resize(,10).Font.Bold =(Cel.Value < Dte)
  Next
End With
End Sub

PS: C'est marrant t'avais pour resizer en message #2
 
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Fonction If et ElseIf dans situation complexe

Bonsoir JM,

C'est exact, c'est un peu plus court en effet.

Mais je n'utilise jamais Resize que je trouve nettement moins explicite et plus abscon à la lecture du code que IIf.

Il faudra bien que je m'y mette un jour, en tout cas ce sera grâce à toi.

Merci pour ce rappel.

Cordialement.
 

wilfrid18

XLDnaute Nouveau
Re : Fonction If et ElseIf dans situation complexe

Bonjour Staple,
Je vais essayer ton script et je reviens. Cela ne m'étonne pas que tu l'as changé. Car étant petit amateur et mes collègues de l'association modifiant constamment les besoins, j'ai joué simpliste.
Merci pour ton travail. Je reviens te dire comment je l'ai adapté.
 

wilfrid18

XLDnaute Nouveau
Re : Fonction If et ElseIf dans situation complexe

Bonjour Staple,

Je m'adresse à toi car c'est toi qui est intervenu et qui m'a trouvé la solution. Ton code fonctionne très bien dans toutes les circonstances. Je devrais fermer le message. Mais il m'a créé un autre petit problème. J'ai tout misé sur la sélection de plage dans ce script. La partie grasse ne reste pas sélectionnée, du coup je ne sais pas la nommer dans ces circonstances. J'ai tout misé sur la sélection de plage dans ce script. Le but du code que j'ai rajouté est de sélectionner la colonne(I:I) de la partie grasse, d'où l'emploi d'intersect. Si tu pouvais me dire comment sélectionner cette partie grasse que l'on vient de créer, je pourrais continuer le code.
J'ai l'impression d'abuser, mais ne m'en veux pas.
Merci d'avance.
 

Pièces jointes

  • Classeur3.xlsm
    59 KB · Affichages: 47
  • Classeur3.xlsm
    59 KB · Affichages: 46
  • Classeur3.xlsm
    59 KB · Affichages: 51

Staple1600

XLDnaute Barbatruc
Re : Fonction If et ElseIf dans situation complexe

Bonsoir à tous

wilfrid18
Euh... Comment dire? Je suis pas tout seul sur le forum...;)
Et le code VBA initial n'est pas de moi, mais de Papou_net (je l'ai juste mis à ma sauce)
Je fais chauffer le four, prépare un croque-monsieur puis je repasse
(En espérant que d'ici là d'autres seront venus visiter ton fil et t'apporter assistance)

PS: En attendant la fin du préchauffage du four, j'ai ouvert ta PJ
Je n'y vois trace de ma sauce donc j'ai du mal à comprendre en quoi je t'ai apporté une solution. ;)
De plus j'évite comme la peste tout ce qui ressemble de loin ou de près aux Selection et autres Activate
Et pourquoi tu mets ta macro dans WorkBook_Open(au fait) car tant qu'un classeur n'est pas ouvert, aucune sélection n'est faite non ?
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Fonction If et ElseIf dans situation complexe

Re

De retour après la graille ;)
Donc sans Sélection et dans un module
VB:
Sub WorkBookOppenheimer()
Dim Cel As Range, Dte As Date, p As Range, pl As Range, adr$, t, total As Variant
Dte = Sheets("y").Range("E2").Value
Application.ScreenUpdating = False
With Sheets("x")
Set p = .Range("C12:C" & Rows.Count).SpecialCells(xlCellTypeConstants)
  For Each Cel In p
    Cel.Resize(, 11).Font.Bold = (Cel.Value < Dte)
    If Cel.Font.Bold Then
    adr = adr & Cel.Address & ";"
    End If
  Next
End With
t = Split(Left(adr, Len(adr) - 1), ";")
Set pl = Range(t(0), t(UBound(t))).Resize(, 11)
pl.Name = "za"
MsgBox [za].Address ' pour test
'je suis pas sur de comprendre ce que tu veux faire ensuite ;o)
'ActiveWorkbook.Worksheets("x").Names.Add Name:="za", RefersTo:="=" & Selection.Address
'Range("za").Select
'Range("za").CurrentRegion.Rows(Range("za").CurrentRegion.Rows.Count).Select
'ActiveCell.Offset(0, 7).Activate
'ActiveWorkbook.Worksheets("x").Names.Add Name:="dercel", RefersTo:="=" & Selection.Address
'    Range("dercel", "I12").Select
'ActiveWorkbook.Worksheets("x").Names.Add Name:="ze", RefersTo:="=" & Selection.Address
'Application.Intersect(Range("ze"), Range("ze")).Select
'ActiveWorkbook.Worksheets("x").Names.Add Name:="in", RefersTo:="=" & Selection.Address
'For Each Cel In Range("in")
'If Cel = "" Then
'total = total + Cel.Count
'End If
'Next
End Sub
 

wilfrid18

XLDnaute Nouveau
Re : Fonction If et ElseIf dans situation complexe

Bonjour,

J'ai utilisé le code de Staple. Il ne fonctionne pas, il ne met plus en gras.
Je reviens au 1er code simple de Papou du 12/12/12- 20h46. Ce code fonctionne parfaitement (en passant je m'excuse auprès de Papou, j'ai confondu les noms). Pour pouvoir mettre en gras la partie visée, il faut bien la sélectionner à un moment donné. Ce que je souhaite c'est garder la sélection pour pouvoir la nommer et l'exploiter après.
Quelqu'un saurait-il comment garder cette sélection ?
Je retourne le fichier avec la dernière version de Staple.
Merci d'avance pour toute réponse.
 

Pièces jointes

  • Classeur3.xlsm
    56.8 KB · Affichages: 47
  • Classeur3.xlsm
    56.8 KB · Affichages: 51
  • Classeur3.xlsm
    56.8 KB · Affichages: 45

Papou-net

XLDnaute Barbatruc
Re : Fonction If et ElseIf dans situation complexe

Bonjour Wilfried18, JM,

La macro de JM fonctionne parfaitement, c'est simplement qu'il manque le rafraîchissement d'écran à la fin (Application.ScreenUpdating = True).

Voici la macro modifiée qui, de surcroît, enregistre la sélection.

Cette sélection est stockée dans la variable "za". Elle est affichée, pour démonstration, par la dernière ligne qui peut être supprimée sans problème.

Code:
Sub WorkBookOppenheimer()
Dim Cel As Range, Dte As Date, p As Range, za As Range
Dte = Sheets("y").Range("E2").Value
Application.ScreenUpdating = False
With Sheets("x")
Set p = .Range("C12:C" & Rows.Count).SpecialCells(xlCellTypeConstants)
  For Each Cel In p
    Cel.Resize(, 11).Font.Bold = (Cel.Value < Dte)
    If Cel.Font.Bold Then
      If za Is Nothing Then
        Set za = Cel.Resize(, 11)
        Else
        Set za = Application.Union(za, Cel.Resize(, 11))
      End If
    End If
  Next
End With
Application.ScreenUpdating = True
za.Select ' Pour vérification (à supprimer)
End Sub
Cordialement.

PS : j'ai supprimé les déclarations des variables non utilisées.
 

wilfrid18

XLDnaute Nouveau
Re : Fonction If et ElseIf dans situation complexe

Bonjour,

J'ai enfin compris. Merci Papou. A nouveau, la macro rend gras la partie désignée. J'ai dû changé "Sub WorkBookOppenheimer()" en "Private Sub WorkBook_Open()". Elle fonctionne bien, mais la partie grasse ne reste toujours pas sélectionnée. Le curseur va se poser sur une cellule aléatoire G28. Je cherche à sélectionner depuis le 1ère cellule de la partie grasse jusqu'à la dernière de cette même partie grasse et ensuite nommer cette plage de cellules "za". Vous avez fait un travail professionnel, du coup je ne sais plus lui dire de sélectionner cette partie. Les cellules étant aléatoires, je ne puis le faire manuellement.
Merci pour toute aide concernant cette sélection.
 

Papou-net

XLDnaute Barbatruc
Re : Fonction If et ElseIf dans situation complexe

RE wilfrid18,

Voilà qui devrait enfin répondre à la demande initiale :

Code:
Private Sub Workbook_Open()
Dim Cel As Range, Dte As Date, p As Range, za As Range
Dte = Sheets("y").Range("E2").Value
Application.ScreenUpdating = False
With Sheets("x")
Set p = .Range("C12:C" & Rows.Count).SpecialCells(xlCellTypeConstants)
  For Each Cel In p
    Cel.Resize(, 11).Font.Bold = (Cel.Value < Dte)
    If Cel.Font.Bold Then
      If za Is Nothing Then
        Set za = Cel.Resize(, 11)
        Else
        Set za = Application.Union(za, Cel.Resize(, 11))
      End If
    End If
  Next
End With
Application.ScreenUpdating = True
With ActiveWorkbook.Names("za")
' Modification de la plage nommée "za" en fonction de la nouvelle valeur
  .Name = "za"
  .RefersToR1C1 = za
  za.Range("A1").Activate ' Active la cellule en haut et à gauche de la plage "za"
End With
End Sub
Je joins la copie du fichier modifié et testé avec succès. A ton tour de le tester.

Cordialement.
 
Dernière édition:

wilfrid18

XLDnaute Nouveau
Re : Fonction If et ElseIf dans situation complexe

Salut,

Quand quelqu'un fait tant d'efforts pour moi, je lui suis vraiment reconnaissante.
Pour l'instant le curseur se porte sur la 1ère cellule de la partie grasse, c'est déjà quelque chose. La plage "za" n'est pas nommée. Le code "With ActiveWorkbook.Names("za")", il ne reconnait pas et je suppose que c'est pour cela qu'il fait un débogage.
J'espère que vous aller trouver une solution, personnellement ce script m'a déjà fait passer des nuits blanches.
Merci encore.
 

Pièces jointes

  • Classeur3.xlsm
    58.9 KB · Affichages: 46
  • Classeur3.xlsm
    58.9 KB · Affichages: 49
  • Classeur3.xlsm
    58.9 KB · Affichages: 50

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 213
Membres
103 158
dernier inscrit
laufin