Boucle qui recherche les mois [Résolu]

Zaza - 8 juil. 2015 à 09:45 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention
- 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.
Afficher la suite 

35 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 8 juil. 2015 à 16:01
0
Utile
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 ?
Commenter la réponse de ucfoutu
0
Utile
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.
Commenter la réponse de Zaza
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 8/07/2015 à 21:33
0
Utile
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 8 juil. 2015 à 22:01
0
Utile
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.
Commenter la réponse de ucfoutu
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - 9 juil. 2015 à 08:24
0
Utile
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


Commenter la réponse de zazaote
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 9 juil. 2015 à 08:56
0
Utile
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 ==>>
Commenter la réponse de ucfoutu
0
Utile
C'est vraiment gentil de ta part
Je vais essayer le code et je te renvoi un message
Encore merci
Commenter la réponse de Zaza
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 9/07/2015 à 10:36
0
Utile
2
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.
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - 9 juil. 2015 à 10:54
Désolée j'utiliserai mon compte pour discuter dorénavant
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - 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)
Commenter la réponse de ucfoutu
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - 9 juil. 2015 à 10:49
0
Utile
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

Commenter la réponse de zazaote
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 9 juil. 2015 à 11:39
0
Utile
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 !!!
Commenter la réponse de ucfoutu
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - Modifié par ucfoutu le 9/07/2015 à 13:27
0
Utile
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
Commenter la réponse de zazaote
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 9 juil. 2015 à 13:31
0
Utile
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 !
Commenter la réponse de ucfoutu
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - 9 juil. 2015 à 13:35
0
Utile
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
Commenter la réponse de zazaote
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 9 juil. 2015 à 14:51
0
Utile
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 !
Commenter la réponse de ucfoutu
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - Modifié par zazaote le 9/07/2015 à 14:58
0
Utile
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
Commenter la réponse de zazaote
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 9 juil. 2015 à 15:36
0
Utile
Ah ?
Non ! (testé) : mon code (une autre fois : testé) ne recopie pas "que les valeurs", mais également les formules..
Bonne chance
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 9/07/2015 à 15:51
0
Utile
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.
Commenter la réponse de ucfoutu
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - Modifié par ucfoutu le 9/07/2015 à 21:35
0
Utile
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"
Commenter la réponse de zazaote
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 10/07/2015 à 00:01
0
Utile
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 10 juil. 2015 à 13:16
0
Utile
5
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 ...

pijaku 12205 Messages postés jeudi 15 mai 2008Date d'inscriptionModérateurStatut 13 septembre 2017 Dernière intervention - 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?
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention > pijaku 12205 Messages postés jeudi 15 mai 2008Date d'inscriptionModérateurStatut 13 septembre 2017 Dernière intervention - 10 juil. 2015 à 15:01
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).
pijaku 12205 Messages postés jeudi 15 mai 2008Date d'inscriptionModérateurStatut 13 septembre 2017 Dernière intervention > ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 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 !
zazaote 13 Messages postés jeudi 9 juillet 2015Date d'inscription 22 juillet 2015 Dernière intervention - 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
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Boucle qui recherche les mois - page 2