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

Dois-je faire une "Loop" en VBA ou une formule ???

  • Initiateur de la discussion Initiateur de la discussion Eltech
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

E

Eltech

Guest
Bonjour,
Je suis vraiment Nouveau en VBA, pour le pas dire à ma première tentative...
Je coterais mes compétences sur Excel disons à 8/10 dans mon travail mais comparativement au Pro sur ce forum sûrement que je descend à 1-2/10.

Ma question est la suivante (Voir exemple plus bas): J'ai une série de date en colonne de A1 à A5 et une série de chiffres de B1 à B5...(qui vont ensemble)

Date Nbr de congé
2011-05-13 5
2011-05-14 2
2011-05-15 1
2011-05-18 4
2011-05-20 2

Je voudrais recréer une colonne qui me donnerais la liste des dates du 2011-05-13 au 2011-05-20 incluant les dates manquantes, et dans une autre colonne le nombre correspondant et d'y écrire "0" si la date était manquante dans la liste de départ.

J'espère que vous comprendrez ce que je veux dire...car sa me serait d'une grande utilité. Car dans la vrai vie les lignes vont jusqu'à 900 !!!!

Merci à l'avance des conseils !!!

David
 

Pièces jointes

Dernière modification par un modérateur:
Re : Dois-je faire une "Loop" en VBA ou une formule ???

Bonjour David,

Voici un bout de code qui semble faire le travail... (pourrait sûrement être optimisé pour éviter les boucles, mais en 5 minutes ça donne ça...😉)

Code:
Sub Dates()
Dim rg1 As Range, rg2 As Range
Dim dateFin As Date, dateDebut As Date

Application.ScreenUpdating = False

'date de départ
Set rg1 = Sheets("Feuil1").Range("A1")
dateDebut = rg1.Value

'date de fin
dateFin = Sheets("Feuil1").Range("A60000").End(xlUp)

'écriture de toutes les dates
Set rg2 = Sheets("Feuil1").Range("D1")      'à changer selon où tu veux écrire les résultats
Do Until dateDebut = dateFin + 1
    rg2 = dateDebut
    dateDebut = dateDebut + 1
    Set rg2 = rg2.Offset(1, 0)      'ligne suivante
Loop

'écriture des congés
Set rg2 = Sheets("Feuil1").Range("D1")
Do Until IsEmpty(rg2)
   Set rg1 = Sheets("Feuil1").Range("A1")
   rg2.Offset(0, 1) = "0"            'valeur par défaut
   Do Until rg1 = rg2 Or IsEmpty(rg1)
        Set rg1 = rg1.Offset(1, 0)
   Loop
    If rg2 = rg1 Then
        rg2.Offset(0, 1) = rg1.Offset(0, 1)
    End If
Set rg2 = rg2.Offset(1, 0)
Loop

Application.ScreenUpdating = True

End Sub

A+
 
Re : Dois-je faire une "Loop" en VBA ou une formule ???

Bonsoir


Il est tard (désolé si j'ai mal compris la question)
Code:
Sub Ap_Classic()
Dim d As Date, f As Date, nbj&

f = [A65536].End(3)
d = [A2]
nbj = f - d
[C2].Value = [A2].Value
[C2].AutoFill Destination:=Range("C2").Resize(nbj), Type:=xlFillWeekdays
End Sub

PS: ceci c'est pour me détendre avant d'aller dormir 😉
Code:
Sub a_fun()
Dim d As Date, f As Date, nbj&
f = [A65536].End(3): d = [A2]
nbj = f - d: [C2].Value = [A2].Value: [C2].AutoFill [C2].Resize(nbj), 6
End Sub
 
Re : Dois-je faire une "Loop" en VBA ou une formule ???

Tout ces codes...sont pour l'instant pour moi que du chinois...je vais commencer par essayer de trouver où il faut écrire ces fameux codes et ensuite y trouver une signification. Si vous avez un fichier ou un mode d'emploi pour "Beginner" en VBA, je serais preneur !!!

Merci de votre attention et de votre temps pour un newbie comme je le suis...
 
Re : Dois-je faire une "Loop" en VBA ou une formule ???

Bonsoir,

Pour insérer le code tu dois aller dans l'éditeur Vba en faisant ALT-F11, insérer un nouveau module (bouton de droite, insérer) et copier le code. Pour exécuter la macro, tu fais ALT-f8. Désolé pour les explications télégraphiques, je suis sur mon iPod. J'ajouterai un fichier si j'ai le temps demain.
A+
 
Re : Dois-je faire une "Loop" en VBA ou une formule ???

bonjour

Sur ton fichier
En tenant compte que les dates ne sont pas nécessairement en ordre.

Mettre en C1 et tirer vers le bas

Code:
=SI(LIGNE()>MAX(A:A)-MIN(A:A)+1;"";MIN(A:A)+LIGNE()-1)

mettre en D1 et tirer vers le bas
Code:
=SI(D1="";"";SI(ESTNA(EQUIV(D1;A:A;0));0;INDEX(B:B;EQUIV(D1;A:A;0);0)))


Attention, sur 900 lignes, tu peux facilement passé a 1800 lignes.
Le recalcul risque d'être laborieux.


Voici une fonction VBA
Code:
Sub test()
mi# = Application.WorksheetFunction.Min(Range("A:A")): ma# = Application.WorksheetFunction.Max(Range("A:A"))
Dim v(), r As Range: ReDim v(1 To ma - mi + 1, 1 To 2)
For i% = LBound(v) To UBound(v)
    v(i, 1) = mi + i - 1: Set r = Range("A:A").Find(what:=CDate(v(i, 1)))
    If r Is Nothing Then v(i, 2) = 0 Else: v(i, 2) = r.Offset(, 1)
Next i
[C1].Resize(UBound(v), 2) = v
End Sub
 
Dernière édition:
Re : Dois-je faire une "Loop" en VBA ou une formule ???

Bonjour à tous
Une autre contribution à la question.​
ROGER2327
#5269


Mercredi 11 Merdre 138 (Saint Memnon, vidangeur - fête Suprême Quarte)
9 Prairial An CCXIX, 4,4498h - serpolet
2011-W21-6T10:40:46Z
 

Pièces jointes

Re : Dois-je faire une "Loop" en VBA ou une formule ???

Bonjour David, et à tous,

Je joint ici le fichier avec mon code original (vraiment pas optimisé)😡. J'y ai ajouté des commentaires pour que tu puisses comprendre.

Je me suis aussi permis d'inclure le code de Habitude et de le commenter car il ressemble pas mal à ce que j'aurais voulu faire si j'avais eu un peu plus de temps hier.

La version de Roger2327 est vraiment la plus rapide! Mais je ne pense pas que j'aurais pensé à cette méthode.

À titre comparatif :
Méthode Grand Chaman (boucles) : 21.47 secondes 😡
Méthode Habitude (tableau) : 2.36 secondes
Méthode Roger2327 (collection) : 0.21 secondes

A+
 

Pièces jointes

Re : Dois-je faire une "Loop" en VBA ou une formule ???

Bonjour le fil


GrandChaman: tu n'as as testé ma proposition 😉
Une raison à cela ?

Je la poste avec des commentaires cette fois
VB:
Sub a_bis()
Dim d As Date, f As Date, nbj&
f = [A65536].End(3) 'dernière date en colonne A
d = [A2] ' première date
nbj = f - d 'différence en nombre de jours entre la 1ère et dernière date
[D2].Value = [A2].Value ' on donne à D2 la valeur de A2
[D2].AutoFill [D2].Resize(nbj + 1), 5
'ici on se sert en VBA de la copie avec le choix:
'Incrémenter les jours : 5= jours ; 6= jours ouvrés
End Sub

PS: la colonne A doit être triée en ordre croissant.
 
Dernière édition:
Re : Dois-je faire une "Loop" en VBA ou une formule ???

Bonjour Staple,

C'est parce que ta solution est incomplète 😉.
Il ne faut pas seulement ajouter les dates manquantes mais aussi le nombre correspondant à chaque date...

 
Re : Dois-je faire une "Loop" en VBA ou une formule ???

Re

GrandChaman:
Tu as raison, il manquait un bout de réponse à la question

EDITION
: GrandChaman: je viens de tester sur ton fichier
Résultat : 0,122 😛

Alors voici ma version complète
VB:
Sub a_TER()
Dim d As Date, f As Date, nbj&, r As Range, P$

Set r = Range([A2], [A65536].End(3))

f = [A65536].End(3)
d = [A2]
nbj = f - d

[D2].Value = [A2].Value
[D2].AutoFill [D2].Resize(nbj + 1), 5

P = r.Resize(, 2).Address(4, 4, xlR1C1)

With [E2]
    .Formula = "=IF(ISNA(VLOOKUP(RC[-1]," & P & ",2,0)),0,VLOOKUP(RC[-1]," & P & ",2,0))"
    .AutoFill Destination:=Range("E2").Resize([D65536].End(3).Row - 1), Type:=xlFillDefault
    .Value = .Value
End With
End Sub

PS: j'obtiens le même résultat qu'Habitude et ROGER2327*
(s'il n'y pas de de dates en doublons dans la colonne A)

*: le code de Roger ne mets pas de zéro
 
Dernière édition:
Re : Dois-je faire une "Loop" en VBA ou une formule ???

Effectivement le code a Staple est plus rapide
Du fait qu'il n'y a pas de recherche car le code tient compte que la colonne A est trier


Avec formule sur 2000 Lignes j'obtiens un surprenant recalcul a 0.3 secondes
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

J
Réponses
9
Affichages
2 K
B
Réponses
2
Affichages
1 K
benabdelouahed mohamed
B
C
Réponses
2
Affichages
5 K
Cloudy-sky
C
C
Réponses
1
Affichages
1 K
F
Réponses
0
Affichages
966
Fabienc75
F
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…