XL 2010 [RESOLU] IIF imbriqués

cp4

XLDnaute Barbatruc
Bonjour:),

J’ai un souci avec un IIF imbriqué. Je sollicite votre aide en vous remerciant par avance.
VB:
Option Explicit

Sub IIF_imbriqué()
   Dim Dl As Long, NbLig As Long, j As Long, Compte

   Dl = Range("A" & Rows.Count).End(xlUp).Row
   NbLig = Dl - 1

   For j = 2 To NbLig * 3
      Compte = IIf(j <= NbLig + 1, "627002", IIf(NbLig + 1 > j >= NbLig + 1 * 2, "580002", "512002"))
      .Cells(j, 3) = Compte
      .Cells(j, 3).NumberFormat = "General"   'on format cellule car excel convertit chiffre en date
   Next j
End Sub
En colonne A j’ai un certain nombre (variable) de lignes avec des dates. Je voudrais multiplier ce nombre de lignes par 3.
C’est-à-dire recopier/coller ces dates 2 fois à la suite.
Cependant, le problème que je n’arrive pas à résoudre est l’utilisation du IIF mais imbriqué pour insérer des codes (3) en colonne C et
en utilisant le nombre de lignes initial (Dl).
Dans le cas présent la dernière ligne non vide Dl=297, j’ai donc nblig= Dl-1 soit 296 lignes de données.
Je voudrais avec un iif imbriqué reporter des codes en colonne C comme suit :
627002 de ligne 2 à Dl,
580002 pour les lignes comprises entre dl+1 à nblig*2
et 512002 pour les lignes comprise entre nblig*2+1 et nblig*3.
En espérant avoir été explicite.
Bonne journée.
 

Pièces jointes

  • IIf imbriqué.xlsm
    15.2 KB · Affichages: 11

M12

XLDnaute Accro
Bonjour,

Plus simple

VB:
Sub test()
  Dim NbLig As Long
  NbLig = Range("A" & Rows.Count).End(xlUp).Row - 1
  Range(Cells(2, 3), Cells(NbLig + 1, 3)) = "627002"
  Range(Cells(NbLig + 2, 3), Cells(NbLig + 1 + NbLig, 3)) = "580002"
  Range(Cells(NbLig + 2 + NbLig, 3), Cells(NbLig + NbLig + NbLig + 1, 3)) = "512002"
End Sub
 

youky(BJ)

XLDnaute Barbatruc
Bonjour tous,
Comme c'est fait j'envoie quand même, la macro copie 2 fois
Bruno
VB:
Sub IIF_imbriqué()
Dim Dl As Long, j As Long, Compte
Dl = Range("A" & Rows.Count).End(xlUp).Row
Range("C2:C" & Dl).Value = "627002"
For j = 1 To 2
Range("A2:A" & Dl).Copy Destination:=Cells([A65000].End(3).Row + 1, 1)
Compte = IIf(j = 1, "580002", "512002")
Range(Cells([C65000].End(3).Row + 1, 3), Cells([A65000].End(3).Row, 3)).Value = Compte
Next
End Sub
 

cp4

XLDnaute Barbatruc
Bonjour MJ12;),

En effet, c'est plus simple ainsi. Cependant, mon but est d'apprendre un truc nouveau pour moi.

Je sais utiliser le if immédiat seul, je voulais apprendre à l'utiliser pour quelque chose de plus compliqué.

Aurais-tu une idée, pour résoudre ce problème en utilisant le IIF?

Avec mes sincères remerciements.:)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Une méthode rapide sans gestion compliquée d'indice. Voir module 1 (avec commentaire).
VB:
Sub tripler()
Dim xrg As Range, i&
   Set xrg = Range("a2:a" & Range("A" & Rows.Count).End(xlUp).Row)
   For i = 0 To 2
      xrg.Offset(i * xrg.Rows.Count).Value = xrg.Value
      xrg.Offset(i * xrg.Rows.Count, 2) = Array(627002, 580002, 512002)(i)
   Next i
End Sub
 

Pièces jointes

  • cp4- recopie- plage- v1.xlsm
    18.5 KB · Affichages: 3

cp4

XLDnaute Barbatruc
Bonjour tous,
Comme c'est fait j'envoie quand même, la macro copie 2 fois
Bruno
VB:
Sub IIF_imbriqué()
Dim Dl As Long, j As Long, Compte
Dl = Range("A" & Rows.Count).End(xlUp).Row
Range("C2:C" & Dl).Value = "627002"
For j = 1 To 2
Range("A2:A" & Dl).Copy Destination:=Cells([A65000].End(3).Row + 1, 1)
Compte = IIf(j = 1, "580002", "512002")
Range(Cells([C65000].End(3).Row + 1, 3), Cells([A65000].End(3).Row, 3)).Value = Compte
Next
End Sub
Je te remercie beaucoup Youky(BJ):) pour ton code qui fonctionne parfaitement.
Cependant, comme je viens de le dire à @M12 , je voudrais apprendre à imbriquer ces fameux IIF.
Encore merci. Je vous souhaite une bonne journée.

ET UNE TRÈS JOYEUSE FÊTE DE NOEL
 

cp4

XLDnaute Barbatruc
Bonjour à tous,

Une méthode rapide sans gestion compliquée d'indice. Voir module 1 (avec commentaire).
VB:
Sub tripler()
Dim xrg As Range, i&
   Set xrg = Range("a2:a" & Range("A" & Rows.Count).End(xlUp).Row)
   For i = 0 To 2
      xrg.Offset(i * xrg.Rows.Count).Value = xrg.Value
      xrg.Offset(i * xrg.Rows.Count, 2) = Array(627002, 580002, 512002)(i)
   Next i
End Sub
@mapomme ;), un très grand merci.
Je n'ai pas encore testé ton code mais sans voir je te fais confiance.
Je voudrais poursuivre dans ma logique compliquée juste pour apprendre à gérer ce iif par imbrication
Merci beaucoup.

:):):)JOYEUSES FÊTES DE FIN D’ANNÉE;););)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @cp4 ;)
Je voudrais poursuivre dans ma logique compliquée juste pour apprendre à gérer ce iif par imbrication
Avec des IIF:
VB:
Sub IIF_imbriqué()
   Dim Der As Long, NbLig As Long, j As Long
   Der = Range("A" & Rows.Count).End(xlUp).Row
   NbLig = Der - 1

   'on commence par copier les dates (ce sera fait)
   Range("a2:a" & Der).Copy Cells(Der + 1, "a").Resize(2 * NbLig)

   'on remplit la colonne C. On compare du plus grand au plus petit
   For j = 1 To 3 * NbLig
      Cells(1 + j, 3) = IIf(j > 2 * NbLig, 512002, IIf(j > NbLig, 580002, 627002))
     Next j
End Sub
 

cp4

XLDnaute Barbatruc
Re @cp4 ;)

Avec des IIF:
VB:
Sub IIF_imbriqué()
   Dim Der As Long, NbLig As Long, j As Long
   Der = Range("A" & Rows.Count).End(xlUp).Row
   NbLig = Der - 1

   'on commence par copier les dates (ce sera fait)
   Range("a2:a" & Der).Copy Cells(Der + 1, "a").Resize(2 * NbLig)

   'on remplit la colonne C. On compare du plus grand au plus petit
   For j = 1 To 3 * NbLig
      Cells(1 + j, 3) = IIf(j > 2 * NbLig, 512002, IIf(j > NbLig, 580002, 627002))
     Next j
End Sub
Mon cher mapomme:cool::cool: c'est parfait. Exactement ce que je voulais comprendre. Je suis mêlé les pinceaux comme on dit.
Pour être honnête je me suis noyé pour déterminer les priorités et le bornage des lignes devant recevoir tel ou tel code.

Toute ma gratitude.

Bonne soirée.:):)
 

Statistiques des forums

Discussions
312 274
Messages
2 086 703
Membres
103 377
dernier inscrit
fredy45