Améliorer VBA et format date

  • Initiateur de la discussion Initiateur de la discussion JC de Lorient
  • 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 !

J

JC de Lorient

Guest
Bonjour le forum,
Je relance un post puisque je vais bientôt passer en 2ème page donc mes espoirs s’amenuisent !! concernant le code suivant :

Sub deb()
Set maplage = Sheets("Récap").UsedRange.Rows
madate = Sheets("Edition").Range("I5")
n = 0
For Each i In maplage
If i.Columns(1) = madate Then
a = i.Columns(1).Offset(0, 1)

Sheets("Edition").Range("b8").Offset(n, 0) = i.Columns(1).Offset(0, 0)
Sheets("Edition").Range("b8").Offset(n, 1) = i.Columns(1).Offset(0, 1)
Sheets("Edition").Range("b8").Offset(n, 2) = i.Columns(1).Offset(0, 2)
Sheets("Edition").Range("b8").Offset(n, 3) = i.Columns(1).Offset(0, 3)
Sheets("Edition").Range("b8").Offset(n, 4) = i.Columns(1).Offset(0, 4)
Sheets("Edition").Range("b8").Offset(n, 5) = i.Columns(1).Offset(0, 6)
Sheets("Edition").Range("b8").Offset(n, 6) = i.Columns(1).Offset(0, 8)
Sheets("Edition").Range("b8").Offset(n, 7) = i.Columns(1).Offset(0, 9)
Sheets("Edition").Range("b8").Offset(n, 8) = i.Columns(1).Offset(0, 12)

n = n + 1
End If
Next
End Sub

J’ai 2 questions :
1) est il possible de simplifier cette macro ? si oui comment j’ai pensé à une boucle mais aucune connaissance !
2) dans cette formule : madate = Sheets("Edition").Range("I5")

« I5 » me ramène toujours une date sous la forme du 1er du mois
J’aimerais qu’à partir de cette date ma sélection se fasse sur le mois et l’année en cours ex si date = 01/01/2005 vérifier tous les jours du mois de janvier 2005


Merci a tous et toutes

JC
 
Salut JC, salut le forum,

Si j'ai bien compris tes explications, voici ta macro modifiée qui devrait te convenir :


Sub deb()
'********* Déclaration des variables ***************
Dim maplage As Range 'déclare la variable maplage
Dim maplage2 As Range 'déclare la variable maplage2
Dim i As Range 'déclare la variable i
Dim cel As Range 'déclare la variable cel
Dim madate As Date 'déclare la variable madate
Dim mois As Byte 'déclare la variable mois
Dim a As Variant 'déclare la variable a (dans cet exemple cette variable ne sert à rien...)
Dim col As Integer 'déclare la variable col
Dim n As Byte 'déclare la variable n
'********* Déclaration des variables ***************

Sheets("Récap").Select 'sélectionne l'onglet "Récap" (au cas où tu lancerais la macro à partie d'un autre onglet)
ActiveSheet.UsedRange.Select 'sélectionne la plage utilisée de l'onglet "Récap"
ActiveCell.Select 'sélectionne la cellule active
col = ActiveCell.Column 'définit la variable col
'définit la variable maplage
Set maplage = Sheets("Récap").Range(ActiveCell, Sheets("Récap").Cells(65536, col).End(xlUp))
'définit la variable madate
madate = DateValue(Sheets("Edition").Range("I5"))
'définit la variable mois
mois = Month(madate)
n = 0 'définit la variable n
'boucle 1 sur toutes les cellules de maplage
For Each i In maplage
'condition : la date de la cellule est égale à madate
If DateValue(i.Value) = madate Then
'définit la plage maplage2 (31 cellules vers le bas à partir de i)
Set maplage2 = Range(i, i.Offset(30, 0))
'boucle 2 sur toutes les cellules de maplage2
For Each cel In maplage2
'sort de la boucle 2 au changement de mois
If Month(DateValue(cel.Value)) > mois Then Exit For
a = i.Offset(0, 1) 'dans cet exemple cette variable ne sert à rien...
'place les valeurs
Sheets("Edition").Cells(8 + n, 2) = DateValue(cel)
Sheets("Edition").Cells(8 + n, 3) = cel.Offset(0, 1)
Sheets("Edition").Cells(8 + n, 4) = cel.Offset(0, 2)
Sheets("Edition").Cells(8 + n, 5) = cel.Offset(0, 3)
Sheets("Edition").Cells(8 + n, 6) = cel.Offset(0, 4)
Sheets("Edition").Cells(8 + n, 7) = cel.Offset(0, 6)
Sheets("Edition").Cells(8 + n, 8) = cel.Offset(0, 8)
Sheets("Edition").Cells(8 + n, 9) = cel.Offset(0, 9)
Sheets("Edition").Cells(8 + n, 10) = cel.Offset(0, 12)

n = n + 1 'redéfinit la variable n
Next cel 'prochaine cellule de maplage2
Exit For 'sort de la boucle 1
End If 'fin de la condition
Next i 'prochaine cellule de la boucle 1
End Sub


À plus,

Robert
 
Bonjour Robert, le forum

je viens de consulter ton dernier message je n'ai pas pu l'essayer je ne suis pas chez moi !
De ce que j'ai pu comprendre (c encore de l'hébreu pour moi) je n'ai pas forcément 31 jour dans mon mois Je peux en avoir de zéro (mais là pas besoine d'étiter) ou de 1 à 31 valeurs
je crois que ton code prend les 31 valeurs après une certaine colonne

concernant ausi le mois j'ai cru comprendre que si c le mois de janvier qui est concerné il va me prendre tous les mois de janvier (ai 2004 de rentrer déjà dans ma base) alors que je souhaite un calcul sur janvier 2005 par exemple

tu l'as peut etre configuré pour mais je ne sais pas ou ! je ne sais pas encore lire le VBA

en tous cas mille merci de ton aide et pour la correction éventuelle que tu y apporteras

JC
 
Re JC,

En fait la macro fonctionne de la manière suivante :
Recherche la date dans la plage. Quand elle la trouve, elle redéfinit une nouvelle plage de 31 cellules. J'ai mis 31 pour être sûr d'avoir tous les jours du mois mais s'il y en a moins, seules les valeurs du mois désigné seront pises en comptes (If Month(DateValue(cel.Value)) > mois Then Exit For).

Pour l'année je me suis basé sur la date en I5. Si elle ne comporte pas d'année je ne sait pas comment va se comporter la macro...

À plus,

Robert
 
Re Robert

je viens d'essayer ça plante sur la ligne qui est entre les "retours chariots "
erreur 13 incompatibilité de Type !!!
ça serait très cool de voir ça car moi en suis bien incapable !!!

JC


Sub deb()
'********* Déclaration des variables ***************
Dim maplage As Range 'déclare la variable maplage
Dim maplage2 As Range 'déclare la variable maplage2
Dim i As Range 'déclare la variable i
Dim cel As Range 'déclare la variable cel
Dim madate As Date 'déclare la variable madate
Dim mois As Byte 'déclare la variable mois
Dim a As Variant 'déclare la variable a (dans cet exemple cette variable ne sert à rien...)
Dim col As Integer 'déclare la variable col
Dim n As Byte 'déclare la variable n
'********* Déclaration des variables ***************

Sheets("Récap").Select 'sélectionne l'onglet "Récap" (au cas où tu lancerais la macro à partie d'un autre onglet)
ActiveSheet.UsedRange.Select 'sélectionne la plage utilisée de l'onglet "Récap"
ActiveCell.Select 'sélectionne la cellule active
col = ActiveCell.Column 'définit la variable col
'définit la variable maplage
Set maplage = Sheets("Récap").Range(ActiveCell, Sheets("Récap").Cells(65536, col).End(xlUp))
'définit la variable madate
madate = DateValue(Sheets("Edition").Range("I5"))
'définit la variable mois
mois = Month(madate)
n = 0 'définit la variable n
'boucle 1 sur toutes les cellules de maplage
For Each i In maplage
'condition : la date de la cellule est égale à madate

If DateValue(i.Value) = madate Then

'définit la plage maplage2 (31 cellules vers le bas à partir de i)
Set maplage2 = Range(i, i.Offset(30, 0))
'boucle 2 sur toutes les cellules de maplage2
For Each cel In maplage2
'sort de la boucle 2 au changement de mois
If Month(DateValue(cel.Value)) > mois Then Exit For
a = i.Offset(0, 1) 'dans cet exemple cette variable ne sert à rien...
'place les valeurs
Sheets("Edition").Cells(8 + n, 2) = DateValue(cel)
Sheets("Edition").Cells(8 + n, 3) = cel.Offset(0, 1)
Sheets("Edition").Cells(8 + n, 4) = cel.Offset(0, 2)
Sheets("Edition").Cells(8 + n, 5) = cel.Offset(0, 3)
Sheets("Edition").Cells(8 + n, 6) = cel.Offset(0, 4)
Sheets("Edition").Cells(8 + n, 7) = cel.Offset(0, 6)
Sheets("Edition").Cells(8 + n, 8) = cel.Offset(0, 8)
Sheets("Edition").Cells(8 + n, 9) = cel.Offset(0, 9)
Sheets("Edition").Cells(8 + n, 10) = cel.Offset(0, 12)

n = n + 1 'redéfinit la variable n
Next cel 'prochaine cellule de maplage2
Exit For 'sort de la boucle 1
End If 'fin de la condition
Next i 'prochaine cellule de la boucle 1
End Sub
 
Re JC,

T'as pas traîner beaucoup on dirait...

Si cette ligne plante If DateValue(i.Value) = madate Then
c'est soit un poblème de version (je suis sur Excel 2000 avec Windows XP familial) soit que la range i ne contient pas de date. Je t'avoue que n'ayant pas ton tableau sous les yeux c'est difficile car j'ai été obligé de simuler chez moi en créant un tableau mais tu n'as donné que le minimum d'explication. D'ailleurs en pièce jointe, le fichier que j'ai construit pour aboutir à la macro. Dans l'onglet "Edition" clique sur le bouton Macro qui correspond exactement au code que je t'ai donné.Peut-être ça t'aidera.
L'idéal serait d'avoir ton fichier à toi ou au moins la partie qui nous intéresse. Déjà pour me faciliter la tâche, mais surtout pour pouvoir travailler dans la réalité de ton problème et non pas dans de l'abstrait.

À plus,

Robert
 
Bonjour Robert, le forum

ben je crois que ce post sera le dernier concernant le code !!

ça marche du tonnerre

je n'ai pas les mots pour te remercier car sans toi j'étais loin d'y arriver

merci pour les indications fournies sur le code, j'espère que ça m'aidera a avancer dans la compréhension de VBA
pour info : suis sur XP et Excel 2003

très bon dimanche et encore mille merci

JC
 
re tout le monde

c'était trop beau

j'ai encore une erreur du même type sur If Month(date......
erreur 13 incompatibilité de type

For Each cel In maplage2 'sort de la boucle 2 au changement de mois
If Month(DateValue(cel.Value)) > mois Then Exit For
a = i.Offset(0, 1) 'dans cet exemple cette variable ne sert à rien...

Pourtant quand ça plante je vé sur débogage, sans rien changé je reviens sur ma feuille Edition et là j'ai mes infos ! très surprenant non ?

merci une nouvelle fois !

JC
 
re

Robert suis navré de te "harceler" !!!
suite au précédent post
l'édition de janvier ne pose pas de problème par contre février oui "bug" voir ci dessus

un autre soucis quoique gérable assez facilement si je n'ai pas au moins une date au 1er du mois ça ne marche pas ceci dit pas de message d'erreur
en clair si je commence mon mois au 02 pas d'édition possible

merci encore

JC
 
re
j'ai rectfié comme ceci :

For Each cel In maplage2 'sort de la boucle 2 au changement de mois
If Month(cel.Value) > mois Then Exit For

a l'air de vouloir bien marcher !

reste le problème du 1er du mois ?

merci encore

JC
 
- 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

Réponses
4
Affichages
460
Réponses
2
Affichages
335
  • Question Question
Microsoft 365 Question code VBA
Réponses
2
Affichages
539
Réponses
28
Affichages
2 K
Réponses
2
Affichages
441
Retour