Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
 
Réactions: cp4

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
 
Réactions: cp4

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
Réactions: cp4

cp4

XLDnaute Barbatruc
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
@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
 
Réactions: cp4

cp4

XLDnaute Barbatruc
Mon cher mapomme 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.
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…