Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Procedure trop longue suite

17 réponses
Avatar
IMER09
Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance
--
IMER09

10 réponses

1 2
Avatar
Misange
Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu
économises réellement en faisant appel à une macro externe. Ensuite ça
rend le code de la macro principale et le déverminage beaucoup plus
facile : tu peux tester séparément chaque bout de ta macro.

Tu verras qu'en structurant ainsi tes macros, tu gagneras aussi beaucoup
de temps et de compétences : c'est bien plus pratique ensuite pour
récupérer des bouts de codes déjà écrits !

Autre point important si tu as des problèmes de macros trop longues : si
tu as utilisé pas mal l'enregistreur de macros pour écrire ton code,
rappelle toi qu'il fait deux trucs inutiles : 1) il sélectionne toujours
ce sur quoi il travaille (feuille, cellule...) ce qui est complètement
inutile dans la majorité des cas. 2) il précise toutes les valeurs pour
tous les arguments, même optionnels, de chaque instruction. On peut donc
99,9 fois sur 100 considérablement élaguer le code de l'enregistreur.
Là encore, pour tester ces instructions, tu les mets dans une macro test
que tu appelles depuis la macro principale et tu mets en commentaire
petit à petit les différentes lignes du verbiage de l'enregistreur
jusqu'à isoler la plus petite portion de code qui fait seulement ce dont
tu as besoin.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance


Avatar
IMER09
Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu
économises réellement en faisant appel à une macro externe. Ensuite ça
rend le code de la macro principale et le déverminage beaucoup plus
facile : tu peux tester séparément chaque bout de ta macro.

Tu verras qu'en structurant ainsi tes macros, tu gagneras aussi beaucoup
de temps et de compétences : c'est bien plus pratique ensuite pour
récupérer des bouts de codes déjà écrits !

Autre point important si tu as des problèmes de macros trop longues : si
tu as utilisé pas mal l'enregistreur de macros pour écrire ton code,
rappelle toi qu'il fait deux trucs inutiles : 1) il sélectionne toujours
ce sur quoi il travaille (feuille, cellule...) ce qui est complètement
inutile dans la majorité des cas. 2) il précise toutes les valeurs pour
tous les arguments, même optionnels, de chaque instruction. On peut donc
99,9 fois sur 100 considérablement élaguer le code de l'enregistreur.
Là encore, pour tester ces instructions, tu les mets dans une macro test
que tu appelles depuis la macro principale et tu mets en commentaire
petit à petit les différentes lignes du verbiage de l'enregistreur
jusqu'à isoler la plus petite portion de code qui fait seulement ce dont
tu as besoin.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance





Avatar
IMER09
Bin me revoila je pietine un peu, un petit ex simple serait le bien venu
Un UF avec plusieur Box, la valeur de chaque box concatener en A1 par ex
--
IMER09



Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu
économises réellement en faisant appel à une macro externe. Ensuite ça
rend le code de la macro principale et le déverminage beaucoup plus
facile : tu peux tester séparément chaque bout de ta macro.

Tu verras qu'en structurant ainsi tes macros, tu gagneras aussi beaucoup
de temps et de compétences : c'est bien plus pratique ensuite pour
récupérer des bouts de codes déjà écrits !

Autre point important si tu as des problèmes de macros trop longues : si
tu as utilisé pas mal l'enregistreur de macros pour écrire ton code,
rappelle toi qu'il fait deux trucs inutiles : 1) il sélectionne toujours
ce sur quoi il travaille (feuille, cellule...) ce qui est complètement
inutile dans la majorité des cas. 2) il précise toutes les valeurs pour
tous les arguments, même optionnels, de chaque instruction. On peut donc
99,9 fois sur 100 considérablement élaguer le code de l'enregistreur.
Là encore, pour tester ces instructions, tu les mets dans une macro test
que tu appelles depuis la macro principale et tu mets en commentaire
petit à petit les différentes lignes du verbiage de l'enregistreur
jusqu'à isoler la plus petite portion de code qui fait seulement ce dont
tu as besoin.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance







Avatar
MichDenis
Tu peux publier ton code ici ... mais pour faciliter la tâche à tous,

A ) Tu publies ton code ici par tranche de 25 lignes environ.
en expliquant ce que chaque tranche de code est supposée
faire (nul besoin d'expliquer chaque ligne de code)

B ) il y a sûrement quelqu'un qui t'aidera à améliorer chaque tranche
de code ...

C ) Tu peux à l'aide de l'aide du site de Cjoint.com publier ton fichier
en nous indiquant ici l'adresse où se trouve ton fichier ici, en ne
laissant à l'intérieur que l'essentiel. Tu as droit à 500 Kilo octets.
(sans oublier les informations sur ce que tu tentes de réaliser )






"IMER09" a écrit dans le message de news:

Bin me revoila je pietine un peu, un petit ex simple serait le bien venu
Un UF avec plusieur Box, la valeur de chaque box concatener en A1 par ex
--
IMER09



Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu
économises réellement en faisant appel à une macro externe. Ensuite ça
rend le code de la macro principale et le déverminage beaucoup plus
facile : tu peux tester séparément chaque bout de ta macro.

Tu verras qu'en structurant ainsi tes macros, tu gagneras aussi beaucoup
de temps et de compétences : c'est bien plus pratique ensuite pour
récupérer des bouts de codes déjà écrits !

Autre point important si tu as des problèmes de macros trop longues : si
tu as utilisé pas mal l'enregistreur de macros pour écrire ton code,
rappelle toi qu'il fait deux trucs inutiles : 1) il sélectionne toujours
ce sur quoi il travaille (feuille, cellule...) ce qui est complètement
inutile dans la majorité des cas. 2) il précise toutes les valeurs pour
tous les arguments, même optionnels, de chaque instruction. On peut donc
99,9 fois sur 100 considérablement élaguer le code de l'enregistreur.
Là encore, pour tester ces instructions, tu les mets dans une macro test
que tu appelles depuis la macro principale et tu mets en commentaire
petit à petit les différentes lignes du verbiage de l'enregistreur
jusqu'à isoler la plus petite portion de code qui fait seulement ce dont
tu as besoin.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance







Avatar
IMER09
J'ai 8 Cobox ds un UF, chaque box recupere les criteres de 8 colonnes d'une
feuil archive qui comporte 39 colonnes
Avec un bouton valider je cree une feuil dont le non et une compilation des
CB renseigner je trie ensuite la feuille archive en fonction des criteres de
chaque CB que je colle ds ma new feuil cree(code ci dessous)
Pour finir je fait un certain nbre de calcul ds cette feuil cree
J'ai donc une macro tres longue que je voudrai encore agrandir
Le pb, je croix, est que mes CB n'ont pas forcement toute une valeur,
certaine reste blanche. J'ai donc du mettre ds mon code un nbr de If
important
Rien que pour le trie par ex j'ai 11 If qui corresponde a 11 critere de
trie possible

voici une partie de mon Code:

Sheets("Archive").Select
Dim Ligne As Long, C As Range
With Sheets(ShDepart)


'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value =
"" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If


'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value =
"" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 _
And C.Offset(, 3) = Me.ComboBox2 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If

Etc...

Pour le nom de la feuil c'est la meme chose etc

J'espere avoir ete explicite merci et malgres tout pas trop long !!!

--
IMER09



Tu peux publier ton code ici ... mais pour faciliter la tâche à tous,

A ) Tu publies ton code ici par tranche de 25 lignes environ.
en expliquant ce que chaque tranche de code est supposée
faire (nul besoin d'expliquer chaque ligne de code)

B ) il y a sûrement quelqu'un qui t'aidera à améliorer chaque tranche
de code ...

C ) Tu peux à l'aide de l'aide du site de Cjoint.com publier ton fichier
en nous indiquant ici l'adresse où se trouve ton fichier ici, en ne
laissant à l'intérieur que l'essentiel. Tu as droit à 500 Kilo octets.
(sans oublier les informations sur ce que tu tentes de réaliser )






"IMER09" a écrit dans le message de news:

Bin me revoila je pietine un peu, un petit ex simple serait le bien venu
Un UF avec plusieur Box, la valeur de chaque box concatener en A1 par ex
--
IMER09



Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu
économises réellement en faisant appel à une macro externe. Ensuite ça
rend le code de la macro principale et le déverminage beaucoup plus
facile : tu peux tester séparément chaque bout de ta macro.

Tu verras qu'en structurant ainsi tes macros, tu gagneras aussi beaucoup
de temps et de compétences : c'est bien plus pratique ensuite pour
récupérer des bouts de codes déjà écrits !

Autre point important si tu as des problèmes de macros trop longues : si
tu as utilisé pas mal l'enregistreur de macros pour écrire ton code,
rappelle toi qu'il fait deux trucs inutiles : 1) il sélectionne toujours
ce sur quoi il travaille (feuille, cellule...) ce qui est complètement
inutile dans la majorité des cas. 2) il précise toutes les valeurs pour
tous les arguments, même optionnels, de chaque instruction. On peut donc
99,9 fois sur 100 considérablement élaguer le code de l'enregistreur.
Là encore, pour tester ces instructions, tu les mets dans une macro test
que tu appelles depuis la macro principale et tu mets en commentaire
petit à petit les différentes lignes du verbiage de l'enregistreur
jusqu'à isoler la plus petite portion de code qui fait seulement ce dont
tu as besoin.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance












Avatar
MichDenis
On pourrait remplacer ton code je crois par ceci :

Tu as compris que je n'ai pas l'environnement pour tester ceci :
'----------------------
Sub test()

Dim Ligne As Long, C As Range
Dim Rg As Range, A As Integer

Sheets("Archive").Select
With Sheets(ShDepart)
'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" And _
.ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))

For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
For A = 1 To 39
.Cells(Ligne, A) = Cells(C.Row, A)
Next
Ligne = Ligne + 1
End If
Next

'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" _
And ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))

For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
For A = 1 To 39
.Cells(Ligne, A) = Cells(C.Row, A)
Next
Ligne = Ligne + 1
End If
Next
End If

End Sub
'----------------------




"IMER09" a écrit dans le message de news:

J'ai 8 Cobox ds un UF, chaque box recupere les criteres de 8 colonnes d'une
feuil archive qui comporte 39 colonnes
Avec un bouton valider je cree une feuil dont le non et une compilation des
CB renseigner je trie ensuite la feuille archive en fonction des criteres de
chaque CB que je colle ds ma new feuil cree(code ci dessous)
Pour finir je fait un certain nbre de calcul ds cette feuil cree
J'ai donc une macro tres longue que je voudrai encore agrandir
Le pb, je croix, est que mes CB n'ont pas forcement toute une valeur,
certaine reste blanche. J'ai donc du mettre ds mon code un nbr de If
important
Rien que pour le trie par ex j'ai 11 If qui corresponde a 11 critere de
trie possible

voici une partie de mon Code:

Sheets("Archive").Select
Dim Ligne As Long, C As Range
With Sheets(ShDepart)


'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If


'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 _
And C.Offset(, 3) = Me.ComboBox2 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If

Etc...

Pour le nom de la feuil c'est la meme chose etc

J'espere avoir ete explicite merci et malgres tout pas trop long !!!

--
IMER09



Tu peux publier ton code ici ... mais pour faciliter la tâche à tous,

A ) Tu publies ton code ici par tranche de 25 lignes environ.
en expliquant ce que chaque tranche de code est supposée
faire (nul besoin d'expliquer chaque ligne de code)

B ) il y a sûrement quelqu'un qui t'aidera à améliorer chaque tranche
de code ...

C ) Tu peux à l'aide de l'aide du site de Cjoint.com publier ton fichier
en nous indiquant ici l'adresse où se trouve ton fichier ici, en ne
laissant à l'intérieur que l'essentiel. Tu as droit à 500 Kilo octets.
(sans oublier les informations sur ce que tu tentes de réaliser )






"IMER09" a écrit dans le message de news:

Bin me revoila je pietine un peu, un petit ex simple serait le bien venu
Un UF avec plusieur Box, la valeur de chaque box concatener en A1 par ex
--
IMER09



Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu
économises réellement en faisant appel à une macro externe. Ensuite ça
rend le code de la macro principale et le déverminage beaucoup plus
facile : tu peux tester séparément chaque bout de ta macro.

Tu verras qu'en structurant ainsi tes macros, tu gagneras aussi beaucoup
de temps et de compétences : c'est bien plus pratique ensuite pour
récupérer des bouts de codes déjà écrits !

Autre point important si tu as des problèmes de macros trop longues : si
tu as utilisé pas mal l'enregistreur de macros pour écrire ton code,
rappelle toi qu'il fait deux trucs inutiles : 1) il sélectionne toujours
ce sur quoi il travaille (feuille, cellule...) ce qui est complètement
inutile dans la majorité des cas. 2) il précise toutes les valeurs pour
tous les arguments, même optionnels, de chaque instruction. On peut donc
99,9 fois sur 100 considérablement élaguer le code de l'enregistreur.
Là encore, pour tester ces instructions, tu les mets dans une macro test
que tu appelles depuis la macro principale et tu mets en commentaire
petit à petit les différentes lignes du verbiage de l'enregistreur
jusqu'à isoler la plus petite portion de code qui fait seulement ce dont
tu as besoin.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance












Avatar
MichDenis
Une autre façon de présenter le même code (toujours pas tester)

Un bout de macro que l'on répartit en 2 macros distinctes.
De mémoire un module ne peut faire plus de 64 Kilo-octets
quand tu scindes ton code, la procédure appelée peut être
mise dans un autre module au besoin !

Évidemment, cette façon de faire est un peu plus compliquée
puisqu'il s'agit de passer des paramètres d'une procédure à l'autre !

'-----------------------------------
Sub test()

Dim Ligne As Long, C As Range
Dim Rg As Range, A As Integer

Sheets("Archive").Select
With Sheets(ShDepart)
'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" And _
.ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1

Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))
'Appelle l'autre procédure
Execution Ligne, Rg

'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" _
And ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))
'Appelle l'autre procédure
Execution Ligne, Rg
End If
End With
End Sub
'-----------------------------------
Sub Execution(Ligne As Long, Rg As Range)

With Sheets(ShDepart)
For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
For A = 1 To 39
.Cells(Ligne, A) = Cells(C.Row, A)
Next
Ligne = Ligne + 1
End If
Next
End With
End Sub
'-----------------------------------




"IMER09" a écrit dans le message de news:

J'ai 8 Cobox ds un UF, chaque box recupere les criteres de 8 colonnes d'une
feuil archive qui comporte 39 colonnes
Avec un bouton valider je cree une feuil dont le non et une compilation des
CB renseigner je trie ensuite la feuille archive en fonction des criteres de
chaque CB que je colle ds ma new feuil cree(code ci dessous)
Pour finir je fait un certain nbre de calcul ds cette feuil cree
J'ai donc une macro tres longue que je voudrai encore agrandir
Le pb, je croix, est que mes CB n'ont pas forcement toute une valeur,
certaine reste blanche. J'ai donc du mettre ds mon code un nbr de If
important
Rien que pour le trie par ex j'ai 11 If qui corresponde a 11 critere de
trie possible

voici une partie de mon Code:

Sheets("Archive").Select
Dim Ligne As Long, C As Range
With Sheets(ShDepart)


'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If


'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 _
And C.Offset(, 3) = Me.ComboBox2 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If

Etc...

Pour le nom de la feuil c'est la meme chose etc

J'espere avoir ete explicite merci et malgres tout pas trop long !!!

--
IMER09



Tu peux publier ton code ici ... mais pour faciliter la tâche à tous,

A ) Tu publies ton code ici par tranche de 25 lignes environ.
en expliquant ce que chaque tranche de code est supposée
faire (nul besoin d'expliquer chaque ligne de code)

B ) il y a sûrement quelqu'un qui t'aidera à améliorer chaque tranche
de code ...

C ) Tu peux à l'aide de l'aide du site de Cjoint.com publier ton fichier
en nous indiquant ici l'adresse où se trouve ton fichier ici, en ne
laissant à l'intérieur que l'essentiel. Tu as droit à 500 Kilo octets.
(sans oublier les informations sur ce que tu tentes de réaliser )






"IMER09" a écrit dans le message de news:

Bin me revoila je pietine un peu, un petit ex simple serait le bien venu
Un UF avec plusieur Box, la valeur de chaque box concatener en A1 par ex
--
IMER09



Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu
économises réellement en faisant appel à une macro externe. Ensuite ça
rend le code de la macro principale et le déverminage beaucoup plus
facile : tu peux tester séparément chaque bout de ta macro.

Tu verras qu'en structurant ainsi tes macros, tu gagneras aussi beaucoup
de temps et de compétences : c'est bien plus pratique ensuite pour
récupérer des bouts de codes déjà écrits !

Autre point important si tu as des problèmes de macros trop longues : si
tu as utilisé pas mal l'enregistreur de macros pour écrire ton code,
rappelle toi qu'il fait deux trucs inutiles : 1) il sélectionne toujours
ce sur quoi il travaille (feuille, cellule...) ce qui est complètement
inutile dans la majorité des cas. 2) il précise toutes les valeurs pour
tous les arguments, même optionnels, de chaque instruction. On peut donc
99,9 fois sur 100 considérablement élaguer le code de l'enregistreur.
Là encore, pour tester ces instructions, tu les mets dans une macro test
que tu appelles depuis la macro principale et tu mets en commentaire
petit à petit les différentes lignes du verbiage de l'enregistreur
jusqu'à isoler la plus petite portion de code qui fait seulement ce dont
tu as besoin.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance












Avatar
MichDenis
On peut même remplacer la boucle
For a = 39 dans la procédure proposée par
la première procédure par simplement
un copie d'une plage de cellules proposée
dans la deuxième procédure
'-------------------------
Sub Execution(Ligne As Long, Rg As Range)

With Sheets(ShDepart)
For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
For A = 1 To 39
.Cells(Ligne, A) = Cells(C.Row, A)
Next
Ligne = Ligne + 1
End If
Next
End With
End Sub
'-----------------------

par

'-------------------------
Sub Execution(Ligne As Long, Rg As Range)

With Sheets(ShDepart)
For Each C In Rg
Range(Cells(C.Row, 1), Cells(C.Row, 39)).Address
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
'Copie de la plage de cellule
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)).value= _
Range(Cells(C.Row, 1), Cells(C.Row, 39)).value
Ligne = Ligne + 1
End If
Next
End With
End Sub
'------------------------------

Dans la toute première procédure proposée, tu obtiendrais quelque chose dans le gennre :


Sub test()

Dim Ligne As Long, C As Range
Dim Rg As Range, A As Integer

Sheets("Archive").Select
With Sheets(ShDepart)
'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" And _
.ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))

For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)) = _
Range(Cells(C.Row, 1), Cells(C.Row, 39))
Ligne = Ligne + 1
End If
Next

'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" _
And ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))

For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)) = _
Range(Cells(C.Row, 1), Cells(C.Row, 39))
Ligne = Ligne + 1
End If
Next
End If

End Sub
'----------------------






"IMER09" a écrit dans le message de news:

J'ai 8 Cobox ds un UF, chaque box recupere les criteres de 8 colonnes d'une
feuil archive qui comporte 39 colonnes
Avec un bouton valider je cree une feuil dont le non et une compilation des
CB renseigner je trie ensuite la feuille archive en fonction des criteres de
chaque CB que je colle ds ma new feuil cree(code ci dessous)
Pour finir je fait un certain nbre de calcul ds cette feuil cree
J'ai donc une macro tres longue que je voudrai encore agrandir
Le pb, je croix, est que mes CB n'ont pas forcement toute une valeur,
certaine reste blanche. J'ai donc du mettre ds mon code un nbr de If
important
Rien que pour le trie par ex j'ai 11 If qui corresponde a 11 critere de
trie possible

voici une partie de mon Code:

Sheets("Archive").Select
Dim Ligne As Long, C As Range
With Sheets(ShDepart)


'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If


'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 _
And C.Offset(, 3) = Me.ComboBox2 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If

Etc...

Pour le nom de la feuil c'est la meme chose etc

J'espere avoir ete explicite merci et malgres tout pas trop long !!!

--
IMER09



Tu peux publier ton code ici ... mais pour faciliter la tâche à tous,

A ) Tu publies ton code ici par tranche de 25 lignes environ.
en expliquant ce que chaque tranche de code est supposée
faire (nul besoin d'expliquer chaque ligne de code)

B ) il y a sûrement quelqu'un qui t'aidera à améliorer chaque tranche
de code ...

C ) Tu peux à l'aide de l'aide du site de Cjoint.com publier ton fichier
en nous indiquant ici l'adresse où se trouve ton fichier ici, en ne
laissant à l'intérieur que l'essentiel. Tu as droit à 500 Kilo octets.
(sans oublier les informations sur ce que tu tentes de réaliser )






"IMER09" a écrit dans le message de news:

Bin me revoila je pietine un peu, un petit ex simple serait le bien venu
Un UF avec plusieur Box, la valeur de chaque box concatener en A1 par ex
--
IMER09



Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu
économises réellement en faisant appel à une macro externe. Ensuite ça
rend le code de la macro principale et le déverminage beaucoup plus
facile : tu peux tester séparément chaque bout de ta macro.

Tu verras qu'en structurant ainsi tes macros, tu gagneras aussi beaucoup
de temps et de compétences : c'est bien plus pratique ensuite pour
récupérer des bouts de codes déjà écrits !

Autre point important si tu as des problèmes de macros trop longues : si
tu as utilisé pas mal l'enregistreur de macros pour écrire ton code,
rappelle toi qu'il fait deux trucs inutiles : 1) il sélectionne toujours
ce sur quoi il travaille (feuille, cellule...) ce qui est complètement
inutile dans la majorité des cas. 2) il précise toutes les valeurs pour
tous les arguments, même optionnels, de chaque instruction. On peut donc
99,9 fois sur 100 considérablement élaguer le code de l'enregistreur.
Là encore, pour tester ces instructions, tu les mets dans une macro test
que tu appelles depuis la macro principale et tu mets en commentaire
petit à petit les différentes lignes du verbiage de l'enregistreur
jusqu'à isoler la plus petite portion de code qui fait seulement ce dont
tu as besoin.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Bonjour a tous
J'ai donc essaye de cinder ma procedure en 2
La procedure est sur un bouton VALIDER ds un UF1, la procedure cree une
feuille puis aplique des valeurs à certaine cellule en fonction des combobox
renseignées ds UF1, puis tjs en fonction des combobox renseignee ds UF1 me
fait un tri d'une feuil pour copier ce tri sur la nouvelle feuil creer,puis
encore en fonction des combobox renseigne ds UF1 me fait etc...

J'ai donc cindé la premiere parti en la copiant ds un modul Sub SUITE()et
Call SUITE j'ai un Bug Objet Requis
Qd j'affecte cette macro a un deuxieme bouton ds UF1 (Par ex VALIDER 2) tout
fonctionne parfaitement, mais 2 bouton c'est pas terrible!!!
J'ai fait plusieur essai sans resultat c'est pourquoi je me tourne vers vous
une nouvelle fois
Merci d'avance












Avatar
IMER09
Merci MichDenis pour tout ce travail
Je n'est pas pu tester il se fait tard
Est ce que tu croix que le fait de racourcir:

.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4) etc

par

'Copie de la plage de cellule
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)).value= _
Range(Cells(C.Row, 1), Cells(C.Row, 39)).value
Ligne = Ligne + 1

va regler mon pb de procedure trop longue, j'avais l'impression que c'etait
plutot le nbr de If a la suite qui me rendait cette procedure trop longue.
Par contre ta seconde proposition m'enleve en effet un If a chaque fois soit
11 If, la piste me semble bonne.
Mais ne serait il pas possible de prendre en compte que les ComboBox
renseignés avant de faire le trie auquel cas je n'aurai plus qu'1 seule
partie et non plus 11, cela me laisssrai par la meme occasion la possibilté
d'ajoute des cas

J'espere mettre bien expliqué, merci encore
Je ne manquerai pas de te tenir au courant du resultat dès que j'aurai un
peu de temps pour tout remanier
--
IMER09



On peut même remplacer la boucle
For a = 39 dans la procédure proposée par
la première procédure par simplement
un copie d'une plage de cellules proposée
dans la deuxième procédure
'-------------------------
Sub Execution(Ligne As Long, Rg As Range)

With Sheets(ShDepart)
For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
For A = 1 To 39
.Cells(Ligne, A) = Cells(C.Row, A)
Next
Ligne = Ligne + 1
End If
Next
End With
End Sub
'-----------------------

par

'-------------------------
Sub Execution(Ligne As Long, Rg As Range)

With Sheets(ShDepart)
For Each C In Rg
Range(Cells(C.Row, 1), Cells(C.Row, 39)).Address
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
'Copie de la plage de cellule
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)).value= _
Range(Cells(C.Row, 1), Cells(C.Row, 39)).value
Ligne = Ligne + 1
End If
Next
End With
End Sub
'------------------------------

Dans la toute première procédure proposée, tu obtiendrais quelque chose dans le gennre :


Sub test()

Dim Ligne As Long, C As Range
Dim Rg As Range, A As Integer

Sheets("Archive").Select
With Sheets(ShDepart)
'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" And _
.ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))

For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)) = _
Range(Cells(C.Row, 1), Cells(C.Row, 39))
Ligne = Ligne + 1
End If
Next

'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" _
And ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))

For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)) = _
Range(Cells(C.Row, 1), Cells(C.Row, 39))
Ligne = Ligne + 1
End If
Next
End If

End Sub
'----------------------






"IMER09" a écrit dans le message de news:

J'ai 8 Cobox ds un UF, chaque box recupere les criteres de 8 colonnes d'une
feuil archive qui comporte 39 colonnes
Avec un bouton valider je cree une feuil dont le non et une compilation des
CB renseigner je trie ensuite la feuille archive en fonction des criteres de
chaque CB que je colle ds ma new feuil cree(code ci dessous)
Pour finir je fait un certain nbre de calcul ds cette feuil cree
J'ai donc une macro tres longue que je voudrai encore agrandir
Le pb, je croix, est que mes CB n'ont pas forcement toute une valeur,
certaine reste blanche. J'ai donc du mettre ds mon code un nbr de If
important
Rien que pour le trie par ex j'ai 11 If qui corresponde a 11 critere de
trie possible

voici une partie de mon Code:

Sheets("Archive").Select
Dim Ligne As Long, C As Range
With Sheets(ShDepart)


'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value > "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If


'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value > "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 _
And C.Offset(, 3) = Me.ComboBox2 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If

Etc...

Pour le nom de la feuil c'est la meme chose etc

J'espere avoir ete explicite merci et malgres tout pas trop long !!!

--
IMER09



Tu peux publier ton code ici ... mais pour faciliter la tâche à tous,

A ) Tu publies ton code ici par tranche de 25 lignes environ.
en expliquant ce que chaque tranche de code est supposée
faire (nul besoin d'expliquer chaque ligne de code)

B ) il y a sûrement quelqu'un qui t'aidera à améliorer chaque tranche
de code ...

C ) Tu peux à l'aide de l'aide du site de Cjoint.com publier ton fichier
en nous indiquant ici l'adresse où se trouve ton fichier ici, en ne
laissant à l'intérieur que l'essentiel. Tu as droit à 500 Kilo octets.
(sans oublier les informations sur ce que tu tentes de réaliser )






"IMER09" a écrit dans le message de news:

Bin me revoila je pietine un peu, un petit ex simple serait le bien venu
Un UF avec plusieur Box, la valeur de chaque box concatener en A1 par ex
--
IMER09



Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu








Avatar
MichDenis
| va régler mon pb de procedure trop longue,

Voici un bout de texte qui commente le poids que peut avoir
le code d'un module... malheureusement, je n'ai plu l'auteur
de ces lignes ...probablement, cette limite ne s'adresse pas
à la version Excel 2007

********************
"VBA has an undocumented "soft limit" on the maximum size of any single
standard code module. A standard code moldule should not exceed 64 KB as
measured by its text file size when exported from the project.Your
project will not crash immediately upon a single module exceeding this
64KB limit, but consistently exceeding this limit will almost invariably
lead to an unstable application."
********************

Et 64 Kb, c'est déjà beaucoup !

Je n'ai jamais rien vu ou lu quelque chose qui limiterait le nombre de
if ... Then dans une procédure ou une limitation quant au nombre
limite de lignes de code qu'une procédure peut contenir. (ceci ne
signifie pas que cela n'existe pas...)

Les messages précédents représentent simplement une autre façon d'écrire
le code mais d'une manière plus concise. (En supposant qu'elles fonctionnent
car elles n'ont pas été testées)... Est-ce que le code représente bien ce que
tu tentes de faire ? Ça c'est une autre question que je ne saurais répondre.




"IMER09" a écrit dans le message de news:

Merci MichDenis pour tout ce travail
Je n'est pas pu tester il se fait tard
Est ce que tu croix que le fait de racourcir:

.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4) etc

par

'Copie de la plage de cellule
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)).value= _
Range(Cells(C.Row, 1), Cells(C.Row, 39)).value
Ligne = Ligne + 1

va regler mon pb de procedure trop longue, j'avais l'impression que c'etait
plutot le nbr de If a la suite qui me rendait cette procedure trop longue.
Par contre ta seconde proposition m'enleve en effet un If a chaque fois soit
11 If, la piste me semble bonne.
Mais ne serait il pas possible de prendre en compte que les ComboBox
renseignés avant de faire le trie auquel cas je n'aurai plus qu'1 seule
partie et non plus 11, cela me laisssrai par la meme occasion la possibilté
d'ajoute des cas

J'espere mettre bien expliqué, merci encore
Je ne manquerai pas de te tenir au courant du resultat dès que j'aurai un
peu de temps pour tout remanier
--
IMER09



On peut même remplacer la boucle
For a = 39 dans la procédure proposée par
la première procédure par simplement
un copie d'une plage de cellules proposée
dans la deuxième procédure
'-------------------------
Sub Execution(Ligne As Long, Rg As Range)

With Sheets(ShDepart)
For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
For A = 1 To 39
.Cells(Ligne, A) = Cells(C.Row, A)
Next
Ligne = Ligne + 1
End If
Next
End With
End Sub
'-----------------------

par

'-------------------------
Sub Execution(Ligne As Long, Rg As Range)

With Sheets(ShDepart)
For Each C In Rg
Range(Cells(C.Row, 1), Cells(C.Row, 39)).Address
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
'Copie de la plage de cellule
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)).value= _
Range(Cells(C.Row, 1), Cells(C.Row, 39)).value
Ligne = Ligne + 1
End If
Next
End With
End Sub
'------------------------------

Dans la toute première procédure proposée, tu obtiendrais quelque chose dans le gennre :


Sub test()

Dim Ligne As Long, C As Range
Dim Rg As Range, A As Integer

Sheets("Archive").Select
With Sheets(ShDepart)
'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" And _
.ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))

For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)) = _
Range(Cells(C.Row, 1), Cells(C.Row, 39))
Ligne = Ligne + 1
End If
Next

'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" _
And ComboBox3.Value = "" And ComboBox4.Value = "" _
And ComboBox5.Value = "" And ComboBox6.Value = "" _
And ComboBox7.Value <> "FAUX" And ComboBox8.Value = "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
Set Rg = Range("AJ4", Range("AJ65536").End(xlUp))

For Each C In Rg
If C = Me.ComboBox7 And C.Offset(, 3) = Me.ComboBox2 Then
.Range(.Cells(Ligne, 1), .Cells(Ligne, 39)) = _
Range(Cells(C.Row, 1), Cells(C.Row, 39))
Ligne = Ligne + 1
End If
Next
End If

End Sub
'----------------------






"IMER09" a écrit dans le message de news:

J'ai 8 Cobox ds un UF, chaque box recupere les criteres de 8 colonnes d'une
feuil archive qui comporte 39 colonnes
Avec un bouton valider je cree une feuil dont le non et une compilation des
CB renseigner je trie ensuite la feuille archive en fonction des criteres de
chaque CB que je colle ds ma new feuil cree(code ci dessous)
Pour finir je fait un certain nbre de calcul ds cette feuil cree
J'ai donc une macro tres longue que je voudrai encore agrandir
Le pb, je croix, est que mes CB n'ont pas forcement toute une valeur,
certaine reste blanche. J'ai donc du mettre ds mon code un nbr de If
important
Rien que pour le trie par ex j'ai 11 If qui corresponde a 11 critere de
trie possible

voici une partie de mon Code:

Sheets("Archive").Select
Dim Ligne As Long, C As Range
With Sheets(ShDepart)


'CA TOTAL/1/1
If ComboBox1.Value <> "" And ComboBox2.Value = "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value > "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 And C.Offset(, -33) = Me.ComboBox1 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If


'CA TOTAL/1/2
If ComboBox1.Value = "" And ComboBox2.Value <> "" And ComboBox3.Value = "" _
And ComboBox4.Value = "" And ComboBox5.Value = "" _
And ComboBox6.Value = "" And ComboBox7.Value <> "FAUX" And ComboBox8.Value > "" Then

Ligne = .Range("A65536").End(xlUp).Row + 1
For Each C In Range("AJ4", Range("AJ65536").End(xlUp))
If C = Me.ComboBox7 _
And C.Offset(, 3) = Me.ComboBox2 Then
.Cells(Ligne, 1) = Cells(C.Row, 1)
.Cells(Ligne, 2) = Cells(C.Row, 2)
.Cells(Ligne, 3) = Cells(C.Row, 3)
.Cells(Ligne, 4) = Cells(C.Row, 4)
.Cells(Ligne, 5) = Cells(C.Row, 5)
.Cells(Ligne, 6) = Cells(C.Row, 6)
.Cells(Ligne, 7) = Cells(C.Row, 7)
.Cells(Ligne, 8) = Cells(C.Row, 8)
.Cells(Ligne, 9) = Cells(C.Row, 9)
.Cells(Ligne, 10) = Cells(C.Row, 10)
.Cells(Ligne, 11) = Cells(C.Row, 11)
.Cells(Ligne, 12) = Cells(C.Row, 12)
.Cells(Ligne, 13) = Cells(C.Row, 13)
.Cells(Ligne, 14) = Cells(C.Row, 14)
.Cells(Ligne, 15) = Cells(C.Row, 15)
.Cells(Ligne, 16) = Cells(C.Row, 16)
.Cells(Ligne, 17) = Cells(C.Row, 17)
.Cells(Ligne, 18) = Cells(C.Row, 18)
.Cells(Ligne, 19) = Cells(C.Row, 19)
.Cells(Ligne, 20) = Cells(C.Row, 20)
.Cells(Ligne, 21) = Cells(C.Row, 21)
.Cells(Ligne, 22) = Cells(C.Row, 22)
.Cells(Ligne, 23) = Cells(C.Row, 23)
.Cells(Ligne, 24) = Cells(C.Row, 24)
.Cells(Ligne, 25) = Cells(C.Row, 25)
.Cells(Ligne, 26) = Cells(C.Row, 26)
.Cells(Ligne, 27) = Cells(C.Row, 27)
.Cells(Ligne, 28) = Cells(C.Row, 28)
.Cells(Ligne, 29) = Cells(C.Row, 29)
.Cells(Ligne, 30) = Cells(C.Row, 30)
.Cells(Ligne, 31) = Cells(C.Row, 31)
.Cells(Ligne, 32) = Cells(C.Row, 32)
.Cells(Ligne, 33) = Cells(C.Row, 33)
.Cells(Ligne, 34) = Cells(C.Row, 34)
.Cells(Ligne, 35) = Cells(C.Row, 35)
.Cells(Ligne, 36) = Cells(C.Row, 36)
.Cells(Ligne, 37) = Cells(C.Row, 37)
.Cells(Ligne, 38) = Cells(C.Row, 38)
.Cells(Ligne, 39) = Cells(C.Row, 39)
Ligne = Ligne + 1
End If
Next C
End If

Etc...

Pour le nom de la feuil c'est la meme chose etc

J'espere avoir ete explicite merci et malgres tout pas trop long !!!

--
IMER09



Tu peux publier ton code ici ... mais pour faciliter la tâche à tous,

A ) Tu publies ton code ici par tranche de 25 lignes environ.
en expliquant ce que chaque tranche de code est supposée
faire (nul besoin d'expliquer chaque ligne de code)

B ) il y a sûrement quelqu'un qui t'aidera à améliorer chaque tranche
de code ...

C ) Tu peux à l'aide de l'aide du site de Cjoint.com publier ton fichier
en nous indiquant ici l'adresse où se trouve ton fichier ici, en ne
laissant à l'intérieur que l'essentiel. Tu as droit à 500 Kilo octets.
(sans oublier les informations sur ce que tu tentes de réaliser )






"IMER09" a écrit dans le message de news:

Bin me revoila je pietine un peu, un petit ex simple serait le bien venu
Un UF avec plusieur Box, la valeur de chaque box concatener en A1 par ex
--
IMER09



Je te remerci pour ce petit cour, c'est en effet des bases que je ne connait
pas ou peu
Je vais essaye de mettre en pratique
Merci Misange
--
IMER09



Bonjour

le principe c'est pas tant de couper au milieu une proc et d'appeller la
suite que d'identifier des "sous-procédures" dans ta grande macro.
Par exemple, si ta macro récupère les valeurs d'un textbox et effectue
des vérifications sur le contenu pour les valider, au lieu de mettre
dans la même macro la récup des valeurs et leur validation, tu récupères
dans la macro principale tes valeurs de textbox, tu les affectes à une
variable et tu utilises une une autre macro (ou fonction suivant le cas)
pour vérifier ces valeurs

sub mamacro()
mavariable=txtbox1.text
call verif
sheets("truc").range("machin")=mavariable
end sub

sub verif()
if mavariable .... then
'ici tu fais tous les calculs ou vérif dont tu as besoin
end if
end sub

Evidemment si ta vérif ne s'écrit que sur une seule ligne ça n'a pas
grand intérêt de faire çàa. MAis bien souvent, tu as besoin de faire le
même genre de vérif plusieurs fois dans ta macro et dans ce cas, tu








1 2