Boucle qui recherche les mois

Résolu
Zaza - Modifié par Whismeril le 22/07/2015 à 21:26
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 22 juil. 2015 à 20:55
Bonjour,

Je viens de début sur vba
Et j'ai un petit problème avec une boucle.
Voici mon problème:

J'ai mon fichier avec les mois de l'année en ligne, dans la colonne du mois de janvier figure des formules, que je souhaite copier sur le mois de février et ainsi de suite pour le mois de février je copierai les formules sur le mois de mars etc.. Jusque là tout va bien


Cependant je souhaiterai faire une boucle qui recherche les mois, c'est à dire que au mois de janvier be souhaiterai que ma macro cherche le mois de février et des qu'elle trouve le mois de février ma macro s'arrête et copie les formules.

Voici le programme que j'ai fais mais qui ne fonctionne pas :

Sub macro 1()
For i = 1 to 12
Range ("A"& i -1).select
Selection.copy
Range ("A" & +1).select
Selection.pasteSpecial Paste:=xlPasteFormulas , Operation:=xlNone, SkipBlanks:=False, transpose:=False
next i 
End sub


EDIT: Ajout de la coloration syntaxique.

27 réponses

ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
8 juil. 2015 à 16:01
Bonjour,
Besoin réel d'explication très claires :
1)
c'est à dire que au mois de janvier be souhaiterai que ma macro cherche le mois de février

Veut dire exactement quoi ?
--- que si la date de l'ordinateur est du mois de janvier ?
ou
--- autre chose et quoi exactement ?
2)
des qu'elle trouve le mois de février

dépend très sérieusement de la réponse au 1)
--- si par rapport à date interne ===>> le N° de la colonne est celui du mois + 1, tout simplement
--- si selon autre chose : quelle est cette "autre chose" exacte ?

Question subsidiaire : quels sont les titres exacts (tes mois) sur la ligne 1 ?
0
Bonjour,
En fait je me suis complètement mélangé au niveau de mes informations

Voilà ce que je désire faire tellement.
J'ai un classeur avec deux feuilles. En feuille 1 se trouve les mois de l'année
Et en feuille dans la colonne 1 se trouve les formules.

Ce que je souhaiterai faire c'est copier la formule de la colonne A de la feuille 2 vers le mois de janvier de la feuille 1 mais si le mois de janvier est rempli alors on copie les données sur le mois suivant.


Pour y voir plus clair je peux vous envoyer mon fichier excel ce soir.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 8/07/2015 à 21:33
Non : pas de fichier, mais une image de ta feuille1 et une image de ta feuille2. Mets ces deux images ici, car tes explications ne sont pas claires.
Sur l'image de ta feuille2 : colorie en rouge les cellules comprtant des formules
Dur l'image de ta feuille1 : colorie en rouge les cellules du mois de janvier qui doivent avoir ces formules.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
8 juil. 2015 à 22:01
Ce que je peu te dire à ce stade (ret qui devrait te permettre de travailler) :
1)
ce code, placé sur la feuille où tu veux coller tes formules :
Dim toto As Range
On Error Resume Next
Set toto = Rows(2).SpecialCells(xlCellTypeFormulas)
If Not toto Is Nothing Then
non_remplie = toto.Columns.Count + 1
Else
non_remplie = 1
End If
On Error GoTo 0
MsgBox "prochaine colonne de la ligne 2 sans formule = colonne " & non_remplie

Te fera savoir quelle est la 1ère colonne de la ligne 2 qui ne contient pas encore de formule

2) on ne travaille pas à coups de select, copy, paste, etc ..., mais directement sur les objets de Excel.
Ce code (exemple) :
Worksheets("Feuil6").Range("A1:A10").Copy Destination:=Worksheets("Feuil5").Cells(2, non_remplie)

copiera dans la colonne numérotée non_remplie (calculée plus haut) de la feuille Feuil5 , à partir de la ligne 2 ce qui se trouve dans la plage A1:A10 de la feuille Feuil6. Si ce sont des formules, les copiera également.
A toi de jouer un peu avec cela, maintenant.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

9 juil. 2015 à 08:24
Bonjour ucfoutu,

Voici les imprim ecran de la feuille 1 et de la feuille 2

Enfait en feuille 1 figure les mois de l'année et en feuille 2 figure mes formules en colonne (Colonne A). Ce sont des formules qui ne changeront jamais.
Ainsi je souhaite affecter ces formules à chaque mois de l'année.

Et ce que je souhaite faire, c'est dire à ma macro que si le mois de janvier n'est pas rempli alors je colle les formules mais si le mois de janvier est rempli alors je passe au mois suivant et je colle les formule, ainsi de suite pour tous les mois.

Et je sais pas comment je pourrais traduire ça en VBA etant donnée que je viens de débuter.

Merci d'avance


0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
9 juil. 2015 à 08:56
Vu ! c'est donc légèrement décalé par rapport à ce que tu disais ===>> on décale alors le code que je t'ai montré plus haut (la première partie) ===>>
 Dim toto As Range
On Error Resume Next
Set toto = Range(Cells(2, 1), Cells(2, Columns.Count)).SpecialCells(xlCellTypeFormulas)
If Not toto Is Nothing Then
non_remplie = toto.Columns.Count + 2
Else
non_remplie = 2
End If
On Error GoTo 0
MsgBox "prochaine colonne de la ligne 2 sans formule = colonne " & non_remplie
Worksheets("Feuil6").Range("A1:A10").Copy Destination:=Worksheets("Feuil5").Cells(2, non_remplie)

la seconde partie reste la même ==>>
0
C'est vraiment gentil de ta part
Je vais essayer le code et je te renvoi un message
Encore merci
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 9/07/2015 à 10:36
Ce qui (en total) devrait donc être écrit ainsi pour correspondre à tes feuilles, telles que montrées ===>>
Dim toto As Range
On Error Resume Next
Set toto = Worksheets("Feuil1").Range(Cells(2, 1), Cells(2, Columns.Count)).SpecialCells(xlCellTypeFormulas)
If Not toto Is Nothing Then
non_remplie = toto.Columns.Count + 2
Else
non_remplie = 2
End If
On Error GoTo 0
Worksheets("Feuil2").Columns(1).SpecialCells(xlCellTypeFormulas).Copy Destination:=Worksheets("Feuil1").Cells(2, non_remplie)


EDIT : évite s'il te plait d'intervenir ici un coup en tant que "zaza", un coup en tant que "zazaote".
Ma référence va vers "zazaote" (en se loggant en tant que zazaote, membre inscrit).
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

9 juil. 2015 à 10:54
Désolée j'utiliserai mon compte pour discuter dorénavant
0
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

9 juil. 2015 à 11:01
J'ai bien tapé ton code mais j'ai une erreur au niveau de :
Destination:= worksheets("Feuil1").cellls(2,non_remplie)
0
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

9 juil. 2015 à 10:49
J'ai un beug au niveau de la l'avant derniere ligne et la la derniere ligne

L'erreur suivante m'est indiquée : "Erreur de compilation: Attendu: Expression

Voici l'erreur que j'ai en photo avec la ligne surligné en jaune

0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
9 juil. 2015 à 11:39
Copie ici ton code (par copier/coller).
Il semble que tu aies écrit sur deux lignes :
Worksheets("Feuil2").Columns(1).SpecialCells(xlCellTypeFormulas).Copy Destination:=Worksheets("Feuil1").Cells(2, non_remplie)

au lieu d'une seule !!!
0
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

Modifié par ucfoutu le 9/07/2015 à 13:27
Voici mon code

Sub macro2 ()
Dim colonne as range
On error resume next
Set colonne = worksheets ("Feuil1").Range(cells 2,1),cells (2,columns.count)).SpecialCells(xlCellTypeFormulas)
If not colonne is nothing then
Non_remplie = 2
End If

On error goto 0
Worksheets ("Feuil2").columns(1).SpecialCells(xlCellTypeFormulas).Copy Destination:=Worksheets ("Feuil1").Cells(3,non_remplie)

End sub
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
9 juil. 2015 à 13:31
Je t'ai dit :
Copie ici ton code (par copier/coller)

la simple comparaison du code que tu montres avec l'image montrée plus haut met en évidence que tel n'est pas le cas !
0
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

9 juil. 2015 à 13:35
Je ne peux pas copier coller par téléphone car je suis actuellement en déplacement et je travail sur mon PC sur lequel je n'es pas accès à internet et actuellement je discute avec vous grâce à mon téléphone d'où l'impossibilité e faire un copier coller et donc j'ai du réécrire le code
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
9 juil. 2015 à 14:51
On ne peut pas "travailler" ainsi.
Tu aurais au moins dû le dire, que ce n'était pas ce que je te demandais, mais du "de mémoire, qui ne m'intéresse pas !
Pour ton information : celui (le code) de ton image montre un code écrit sur DEUX lignes là ou UNE SEULE était attendue !
Pour la compléter, ton information : j'ai testé MON code ===>> marche impeccablement.
Nous attendrons donc, si tu le veux bien, que tu sois RELLEMENT devant ta machine de développement pour continuer !
0
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

Modifié par zazaote le 9/07/2015 à 14:58
Oki il n'y a pas de problèmes, j'ai résolu mon problème avec votre aide et l'aide de plusieurs forum.

J'ai tapé un code plus simple et ce code me recopie les formules lorsqu'il prenfs les données de la feuille 2
Alors que le votre recopiait uniquement les valeurs et non les formules de la feuille 2


Mais merci pour votre aide
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
9 juil. 2015 à 15:36
Ah ?
Non ! (testé) : mon code (une autre fois : testé) ne recopie pas "que les valeurs", mais également les formules..
Bonne chance
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 9/07/2015 à 15:51
Et en outre :
si c'est là, la solution retenue :
http://forum.excel-pratique.com/excel/copier-coller-formule-mois-m-1-t66246-10.html

1) nous ne sommes plus sur les mêmes bases
2) elle est loin d'être plus simple. Ce qui est certain, par contre, c'est qu'elle est plus lourde :
a) elle boucle sur les 12 colonnes
b) elle compte le nombre de cellules remplies sur chaque colonne

Du "bourrin" absolu, quoi.

Fais comme tu l'entends, mais je ne la conseille certes pas. Ce n'est pas parce qu'elle fonctionne, que c'est la meilleure solution.
La meilleure solution, en informatique, n'est pas celle qui est la plus simple à écrire, mais celle dont la durée d'exécution est la moindre...


________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

Modifié par ucfoutu le 9/07/2015 à 21:35
Voila j'ai essayé ton code et j'ai une erreur au niveau de la ligne 2 sans savoir pourquoi.

Voici un copier coller du code que j'ai saisie

Sub macro1()


Dim colonne As Range
On Error Resume Next
Set colonne = worksheets ("Feuil1").Range(cells 2,1),cells (2,columns.count)).SpecialCells(xlCellTypeFormulas)
If Not colonne Is Nothing Then
non_remplie = 2
End If

On Error GoTo 0
Worksheets("Feuil2").Columns(1).SpecialCells(xlCellTypeFormulas).Copy Destination:=Worksheets("Feuil1").Cells(3, non_remplie)
End Sub




Et ca me mets une erreur au niveau de la ligne 3 "Set colonne..." en me sortant comme erreur : "Erreur de Synthaxe"
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Modifié par ucfoutu le 10/07/2015 à 00:01
tu as une erreur parce que tu n'as pas copié mon code correctement !
Regarde ce que je t'ai dit d'écrire :

Set toto = Range(Cells(2, 1), Cells(2, Columns.Count)).SpecialCells(xlCellTypeFormulas)

et regarde ce que tu as écrit :

Set colonne = worksheets ("Feuil1").Range(cells 2,1),cells (2,columns.count)).SpecialCells(xlCellTypeFormulas)

T'aurais pas comme l'impression de ce que tu as omis une parenthèse (celle que j'ai mise en gras souligné), par hasard ????
cells 2,1) n'est pas une cellule ! Cells(2,1) en est une !
Prends s'il te plait mon code ===>>> copie-le ===>> colle-le ===>> puis change si tu veux toto par colonne, mais ne tripote pas le reste.
Au fait : je comprends bien que toto (je mets des toto et des titi partout) ne te plaise pas (pas parlant). Mais colonne est très faussement "parlant" : ce serait alors plutôt :
plage_des_colonnes_deja_dotees.

Edit : lorsque tu auras retrouvé tes esprits, je vais te montrer ce que j'avais d'abord écrit (même méthode, mais sans nécessité d'une gestion d'erreur et plus court) et que j'ai jugé trop éloigné de ta portée ...
Dis-moi lorsque tu seras prêt(e).


________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
10 juil. 2015 à 13:16
Tiens ! :
1) silence radio du demandeur
2) réaction du forum (qui s'y est intéressé un peu plus que le demandeur, mais qui veut maintenant ne plus encombrer sa machine) :
La voilà, l'autre solution du même type que la première, mais sans nécessité de gestion d'erreur et sans variable toto :
Dim non_remplie As Integer
Select Case Worksheets("Feuil1").Range("B2").HasFormula
Case False
non_remplie = 2
Case Else
non_remplie = Worksheets("Feuil1").Range(Cells(2, 1), Cells(2, Columns.Count)).SpecialCells(xlCellTypeFormulas).Columns.Count + 2
End Select
If non_remplie < 14 Then
Worksheets("Feuil2").Columns(1).SpecialCells(xlCellTypeFormulas).Copy Destination:=Worksheets("Feuil1").Cells(2, non_remplie)
End If

Bien évidemment : à copier sans intervention "personnelle" inconsidérée, hein ...

0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
14
10 juil. 2015 à 14:46
Salut,

Je me pose la question de l'utilité du traitement d'erreur de ton code précédent.
Dim toto As Range
On Error Resume Next
Set toto = Worksheets("Feuil1").Range(Cells(2, 1), Cells(2, Columns.Count)).SpecialCells(xlCellTypeFormulas)
If Not toto Is Nothing Then
  non_remplie = toto.Columns.Count + 2
Else
  non_remplie = 2
End If
On Error GoTo 0
Worksheets("Feuil2").Columns(1).SpecialCells(xlCellTypeFormulas).Copy Destination:=Worksheets("Feuil1").Cells(2, non_remplie)


Pour moi il n'a aucun intérêt, puisque tu attribues un Range via ton Set. Mais peut être me trompe-je?
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235 > pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021

Modifié par ucfoutu le 10/07/2015 à 15:08
Bonjour Franck,
Dans CE code (mon code précédent, donc) : si la colonne du mois de janvier ne contient elle-même pas encore des formules, cette ligne :
Set toto = Worksheets("Feuil1").Range(Cells(2, 1), Cells(2, Columns.Count)).SpecialCells(xlCellTypeFormulas)

provoquera nécessairement une erreur, à gérer.
Essaye et tu verras (et c'est normal).
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
14 > ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018

10 juil. 2015 à 15:41
Exact!
Et bien si je m'attendais à cela...
Pour moi, toto aurait du être = Nothing!
Et bien non.
J'aurais encore appris quelque chose.
Notamment le message d'erreur inconnu pour moi :
Pas de cellules correspondantes...
Chapeau bas, merci.
A++
Amicalement,
Franck
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
10 juil. 2015 à 17:56
Surtout honte à l'équipe de Microsoft Office qui n'ont pas (c'était possible) géré internement ce cas.
Ce cas intervient chaque fois que l'on déclare et veut initialiser une plage qui ne contient aucun des critères que l'on veut retenir !
0
zazaote
Messages postés
13
Date d'inscription
jeudi 9 juillet 2015
Statut
Membre
Dernière intervention
22 juillet 2015

10 juil. 2015 à 18:08
Bonjour
Désolé mais ce n'est pas un silence radio c'est juste que je n'ai pas eu le temps de me connecter sur le forum aujourd'hui car j'étais sur un autre projet
Je test votre code dans la soirée ou durant de long weekend et je vous ferai un retour

Mais encore merci pour l'aide que vous m'apportez
0