Se connecter avec
S'enregistrer | Connectez-vous

VBA: cherche formule de test pour macro

Dernière réponse : dans Programmation

Bonjour à tous, :hello: 

je suis à la recherche d'une formule de test à intégrer dans VBA pour une macro excel, qui est:
Je test une cellule (où il y a une date) pour déterminer le mois.
A partir de là, je vais copier la ligne pour la coller soit dans la feuille (1) (janvier), soit dans dans la (2) (février), ... en fonction du mois déterminer par la date. :pt1cable: 

Si quelqu'un peu m'aider sur ce sujet, je le (la) remerçi d'avance.
Bon soirée.
Mallow76

Autres pages sur : vba cherche formule test macro

Lassé par la pub ? Créez un compte

Bonjour,
désolé, mais je ne comprend pas ce que veut dire "RTFM à la page Month".
J'ai recherché dans le forum, mais je n'ai pas trouvé mon bonheur. je suis peut etre passé devant sans le voir, il y en a tellement.
Si vous pouviez, ce serait super.
Merci d'avance.
A+
Mallow76

Je vois que les débutants ne sont pas accepté sur ce forum.
Il me semblait qu'un forum avait pour but l'entraide, mais il n'en ai rien.
Je vais donc me débrouiller par mes propres moyens, y passer des heures s'il le faut, j'étais loin de m'attendre à ce genre de réponse.
Amusez vous à faire une recherche de programmation sur plus de 1000 thèmes ouvert.
J'aimerai vous y voir.
Je regrette seulement que l'administrateur de ce forum tolère cela.
Tout le monde n'a pas la chance d'être un as de l'informatique, je débute dans VBA, je ne connais rien à la programmation, je maitrise à peu prêt les macro excel (via un enregistrement).
Bref, un petit coup de main aurait été le bienvenu.
Domage que certain ne comprenne pas cela.
Bonne soirée à tous.
Mallow76

PS: j'ai remarqué (dans mes recherches) que la personne qui se cache sous le pseudo "Zeb" est un as du RTFM. Pourquoi répondre?? ça n'aide personne. Il en faut peu pour s'amuser. Les réponses intelligentes lui sont rarement dédiées
Expert Programmation

Salut, moi c'est zeb.

J'ai la prétention d'aider les gens sur ce forum.
Les questions très simples trouvent leur solution dans l'aide en ligne.

Comme tu ne savais même pas où chercher, (avant de trouver, il faut chercher), je t'ai proposé de lire ce putain de manuel (Passe moi l'expression, elle vient du Massachusetts Institute of Technology :ange:  ). Il me semble même que je t'indique quoi chercher : MONTH. Qui veut dire MOIS en anglais, c'est-à-dire EXACTEMENT ce que tu cherches.

Et à chaque fois qu'un problème aura sa solution dans le manuel, la réponse sera RTFM.

D'ailleurs, je signale moi-même mon comportement indigne aux administrateurs sur le champ.

OK,
c'est un peu plus clair, mais comme je te l'ai dis, je suis novice, j'ai compris ce que voulais dire RTFM, je veux bien y rechercher month mais où?
Dans l'aide VBA?
lorsque je tape month, cela me donne cet exemple, comment y intégrer une fonction derriere?

Dim MyDate, MyMonth
MyDate = #12 february 1969# ' Attribue une date.
MyMonth = Month(MyDate) ' MyMonth contient 2.

je recherche un test qui me permet d'aller copier une ligne vers une feuille 1 (pour janvier), une feuille 2 (pour février), .... à partir d'une cellule qui me détermine le mois d'une autre cellule par:

=mois(b30)

ça fait 3 jours que je tourne en rond sans trouver, voilà tout

OK, je comprend le principe,
restez dans votre bulle de connaissance et ne la partagez surtout pas.
Vous pouvez cloturer ce sujet, je vais chercher de l'aide vers des gens un peu plus compréhensifs, qui ne se prennent pas pour "dieu le père".
Bonne soirée à tous.
Mallow76

bon mallow76 vu que zeb a ete sanctionne (c qui est dommage car il aide vraiment bien ^^) je vais t'aider
alors reexplique ton probleme plz
moi j'ai compris que tu essaye de trouver un mois dans un tableau alors si le mois est en lettres tu utilise la fonction "format" (et je vais dire la meme chose que zeb : cherche dans l'aide en ligne . quand on dit sa c pas pour ne pas t'aider mais pour que tu comprenne ce que tu fais car on peut te donner le code deja tout fait mais tu ne saura pas t'en servir alors j'espere que tu comprends cela :)  )

Merci bcq de vouloir m'aider.
je connais un peu les macro sous excel, mais ce que je cherche à faire c'est un test qui va, selon un mois identifié, copier les données (saisies de compte) vers une feuille par mois (la feuille 01 étant le mois de janvier, la feuille 02 le mois de février, ect ...)
donc voilà comment j'ai procédé.
- je note sur une ligne (dans des cellules différentes), le jour, le libéllé de l'opération, débit ou crédit, ...
Sur une autre cellule (m30), j'ai tapé la formule "=mois(b30)" (b30 étant la cellule de la date), ainsi j'ai le mois en chiffre qui est déterminé.
- par une validation macro, je souhaite faire la copie de ces données, sur une autre feuille (expliqué plus haut)
On m'a expliqué qu'il valait mieux faire un test en programation VBA qui, selon ma cellule m30 irait faire la copie.
J'ai essayé d'utiliser la fonction "If Then Else", mais sans succès.
voilà comment j'ai procédé:

If "m30" = "number" Then
estnumber = "1" ' Application.Run "'nom du fichier.xls'!macrojanvier"
Else
estnumber = "2" ' Application.Run "'nom du fichier.xls'!macrofevrier"
Else
...

Je cherche depuis 4 jours maintenant comment taper ma fomule qui testera mon mois pour exécuter la copie (macrojanvier ou les autres) comme je le souhaite.
je pourrais tout simplement tout coller sur la même feuille et faire une macro pour afficher uniquement le mois voulu, mais je souhaite apprendre et évoluer. Si je ne me creuse pas la cervelle, je n'y arriverai pas.
J'ai analysé différent code, je commence à comprendre le principe, mais je ne sais pas comment assembler le tout.

Voilà, j'espère avoir été le plus clair possible, si il manque des infos, il ne faut pas hésiter.
Merci.
Mallow76

tout d'abord met ton code etre ballise "
  1.  
"
puis si tu met plusieurs else a la suite il faut ecrire
  1. If "m30" = "number" Then
  2. estnumber = "1" ' Application.Run "'nom du fichier.xls'!macrojanvier"
  3. ElseIf "m30"="number+1" Then
  4. estnumber = "2" ' Application.Run "'nom du fichier.xls'!macrofevrier"
  5. ElseIf "m30"="number+2" Then
  6. ...

et tu peux nous dire a quoi correspond "number" et "estnumber" cela peux nous aider car ce n'est pas tres pratique de mettre
  1. estnumber = "1" ' Application.Run "'nom du fichier.xls'!macrojanvier"

donc je te conseille de le mettre directement :
  1. Application.Run "'nom du fichier.xls'!macrojanvier"

et si tu peux nous donner ton code entier (si tu en a un ) merci

ce que j'ai voulu écrir c'est:
"si ma cellule "m30" est égal à un nombre
alors
ce nombre égal à "1" entraine l'application de la macro janvier
ou alors
ce nombre égal à "2" entraine l'application de la macro février
...
Je me rend compte que "number" n'est pas le bon choix.
Par contre qu'appelles tu le code, est ce ma formule de condition ou la macro qu'elle entraine?
...
Expert Programmation

"La cellule m30" se dit en VBA : Range("M30").
"Est-ce un nombre ?" se dit en VBA : IsNumeric( .. ).
"La valeur du contenu de la cellule X" se dit en VBA : Range(X).Value.
Donc "La cellule m30 contient-elle un nombre" se dit : IsNumeric(Range("M30").Value).

Une succession de "Si Alors Sinon" peut s'écrire avec un Select Case.

Encore faut-il savoir de quelle feuilles de départ et d'arrivée on parle.

Alors pourquoi pas cet algorithme :

Si la cellule B30 (de quelle feuille) est une date, prendre le mois de cette date.
Copier une ligne (laquelle ?) de cette feuille, vers une autre (laquelle ?), dans une autre feuille dont le nom est 1 pour Janvier, 2 pour Février.

Ce qui se dit en VBA :
  1. If IsDate(Sheets(feuille_de_départ).Range("B30")) Then
  2. Sheets(feuille_de_départ).Rows(quelle ligne ?).Copy Destination:=Sheets(CStr(Month(Sheets(feuille_de_départ).Range("B30")))).Range(ligne_d'arrivée)
  3. End If

Donc si je comprend bien;
j'extrait d'abord le mois de la cellule b30 puis je copie la ligne déterminée vers la feuille du mois correspondant par le biais de "CStr" qui est une donnée en chaine dont l'origine est le mois.
je viens d'essayer cet algorithme mais j'ai une erreur d'execution 9.
J'ai beau chercher quel indice se trouve en dehors de la plage, mais je ne vois pas.
Donc je me suis repenché sur le 1er algorithme et j'ai écris:

  1. If IsNumeric(Sheets(Operation_bancaire!).Range("m30")) = "1" Then
  2. ' Application.Run "janvier"
  3. ElseIf IsNumeric(Sheets(Operation_bancaire!).Range("m30")) = "1" Then
  4. ' Application.Run "fevrier"
  5.  
  6. End If
(J'ai ajouté les balises CODE. C'est très vilain de ne pas les mettre !!!!!)

Mais j'ai toujours une erreur 9.

Pour répondre à ta question Hoegarden31, je recherchais un nombre par "number".
Merci à Zeb de m'avoir corrigé.
Donc, je suis bloqué car Je ne vois pas quel indice se trouve en dehors de la plage.

je pense que ton bout de programme marche pas car si tu regarde l'aide de "IsNumeric", tu verra qu'il renvoi un booleen donc il faut le comparer a vrai au faux (true, false) donc a mon avis ce n'est pas la bonne solution car il n'y a que 2 possibilites donc pour le mois mars tu es bloquer
(j'espere que zeb me corrigera si je me trompe )

L'algorithme qu'à proposer Zeb n'a pas besoin de tester la valeur du mois actuelle, car finalement le test if mois = 1 elseif mois = 2... est totalement inutile. Par contre il n'a pas mis les lignes ou tu réalises l'ajout donc il faut les remplacer (j'espère que tu l'a fait)

Ensuite 2eme point qui peut poser problème c'est le nom de tes onglets, est ce que les mois sont écrit 1..12 ou 01,02..12
Si c'est "01" alors il faut modifier :

  1. If IsDate(Sheets(feuille_de_départ).Range("B30" )) Then
  2. Sheets(feuille_de_départ).Rows(quelle ligne ?).Copy Destination:=Sheets(CStr(format(Sheets(feuille_de_départ).Range("B30" ),"mm")).Range(ligne_d'arrivée)
  3. End If

oui est si c'est en lettres il faut mettre :
  1. If IsDate(Sheets(feuille_de_départ).Range("B30" )) Then
  2. Sheets(feuille_de_départ).Rows(quelle ligne ?).Copy Destination:=Sheets(CStr(format(Sheets(feuille_de_départ).Range("B30" ),"mmmm" )).Range(ligne_d'arrivée)
  3. End If
Expert Programmation

Et si c'est en chiffre romain ?
Spoiler
WorksheetFunction.Roman() :lol: 


Et si Operation_bancaire n'est pas une variable, mais le nom de la feuille, il faut le mettre entre guillemets.
Si l'Option Explicit avait été placée, ceci ne serait pas arrivé.
hoegarden31> Tu vois qu'il faut toujours mettre cette fichue option.
mallow76> Utilise Option Explicit !

Bonjour,
dsl, j'étais en déplacement.
Donc j'ai tenu compte de toutes vos remarque, et j'ai écris:

Sub valider()
'
' valider Macro
' Macro enregistrée le 28/06/2007 par Gil
'

'
If IsDate(Sheets(Opération_bancaire!).Range("b30")) Then
Sheets(Opération_bancaire!).Rows("B30:L30").Copy Destination:=Sheets(CStr(Format(Sheets(Opération_bancaire!).Range("b30"), "mm"))).Range("9:9")
End If

End Sub

J'ai bien des feuilles numéroté 01, 02, 03, ...
J'ai tapé "Option Explicit" mais je ne sais pas si je l'ai placé au bon endroit, je l'ai positionné devant "Sub valider()".
J'ai toujours l'erreur d'indice n'appartenant pas à la sélection.
La 1ère ligne est en jaune CàD:
If IsDate(Sheets(Opération_bancaire!).Range("b30")) Then
Expert Programmation

Citation :
Donc j'ai tenu compte de toutes vos remarque
NON.
Ici et , nous t'expliquons et/ou nous te donnons le bon exemple.

Lire les règles, les comprendre et les appliquer !

Et puisque tu ne comprends ni le jargon et les usages (normal pour un nouveau), ni les consignes et les règles en français (anormal ! C'est à toi de faire l'effort, pas à nous), je te fais un dessin :

Merci
Dsl pour l'introduction des codes, mais je passais par "Réponse rapide", donc impossible de suivre cette procédure. Je passerai par "Répondre" maintenant.
J'ai fais le modif pour le nom de la feuille, malheureusement, toujours le même défaut.
Hai hai
Expert Programmation

Citation :
donc impossible de suivre cette procédure
Bien sûr que c'est possible !!!! Mets [cpp] au début de ton code, et [/cpp] à la fin.


Redonne nous ton code (correctement présenté) avec les corrections déjà apportées.

  1. Sub valider()
  2. '
  3. ' valider Macro
  4. ' Macro enregistrée le 28/06/2007 par Gil
  5. '
  6.  
  7. '
  8. If IsDate(Sheets("Opération_bancaire").Range("m30")) Then
  9. Sheets("Opération_bancaire").Rows("30:30").Copy Destination:=Sheets(CStr(Format(Sheets("Opération_bancaire").Range("m30"), "mm"))).Range("9:9")
  10. End If
  11.  
  12. End Sub
Expert Programmation

Non, hoegarden31, mallow76 a raison :o 

mallow, éclate ton code pour savoir où se trouve le problème :
(Ce code est sensiblement identique au tien. J'ai viré le CStr puisque Format renvoie une chaine et j'ai utilisé Rows pour désigner une ligne plutôt que Range("9:9") qui n'est pas faux mais moins joli.)
  1. Dim ws_source As WorkSheet
  2. Dim ws_dest As WorkSheet
  3. Dim s_M30 As String
  4.  
  5. Set ws_source = Sheets("Opération_bancaire")
  6. s_M30 = ws_source.Range("M30").Text
  7. s_M30 = Format(s_M30, "mm")
  8. Set ws_dest = Sheets(s_M30)
  9.  
  10. ws_source.Rows(30).Copy Destination:=ws_dest.Rows(9) ' // Rhoooo !
  11. ' // Merci pour mallow, Freeman ;)
  12.  
  13. Set ws_source = Nothing
  14. Set ws_dest = Nothing


Où est l'erreur 9, maintenant ?

  1. Dim ws_source As WorkSheet
  2. Dim ws_dest As WorkSheet
  3. Dim s_M30 As String
  4.  
  5. Set ws_source = Sheets("Opération_bancaire")
  6. s_M30 = ws_source.Range("M30").Text
  7. s_M30 = Format(s_M30, "mm")
  8. Set ws_dest = Sheets(s_M30)
  9.  
  10. ws_source.Rows(30).Copy Destination:=ws_dest.Rows(9) 'manquait un ws_
  11.  
  12. Set ws_source = Nothing
  13. Set ws_dest = Nothing
Expert Programmation

Range("A")
C'est la colonne A

Range("9")
C'est la ligne 9

Range("A1:C3")
C'est en fait :
Range(Range("A1"), Range("C3"))


Range("9:9")
=
Range(Range("9"), Range("9"))
C'est dont la ligne 9. C'est idiot inutile de l'écrire comme ça. Et comme Rows(9) est bien plus explicite...

Expert Programmation

C'est pas moi qui ai écrit Range("9:9") dans un de mes programmes :o 
Et je n'y écris pas non plus Range("9"), puisque j'y écris Rows(9).

Citation :
c'est idiot

C'est ce crétin d'enregistreur de macro qui écrit comme ça. :o 
Lassé par la pub ? Créez un compte