Aide Macro excell

C

Christophe

Guest
J'ai une petit question en VBA:
J'ai sur excell en A1 une formule, style "=NB.SI(Feuil1!A1:A8;Feuil2!A1)" Serais il possible en VBA de modifier cette formule avec un message box qui me donne la posibilite de changer Feuil1 en Feuil3 par exemple, le reste de la formule resterais inchange, j'aimerai juste que le message boxe s'ouvre et que j'entre Feuil4 et que ma formule de A1 sois alors modifie en "=NB.SI(Feuil4!A1:A8;Feuil2!A1)". Quand pensez vous, merci


Merci d'avance et mes meilleur voeux pour l'année 2003

Christophe
 
C

Christophe

Guest
Bonsoir a tous,


Ben non Vériland, ca marche pas trop, sur les 31 lignes a modifie et a recopie il en modifie que les 5 premiere, et il saute de =NB.SI(December!B$3:B$42;Controle!$A4) à =NB.SI(December!D$3:D$42;Controle!$A4)
Mais il a oublie le =NB.SI(December!C$3:C$42;Controle!$A4) dans l'histoire, il saute de ligne, c'est pour cela que dans la formule de thierry, j'ai été obligé de faire 30 fois la meme choses avec [-1]

Merci quand meme

Christophe
 
@

@+Thierry

Guest
Bonsoir,

Tiens maintenant que Vériland a fait tout le travail je n'ai plus qu'à corriger !! lol

'macro Vériland pour Christophe 01/01/03
Sub InscrireFormule()
Dim A As Byte, B As Byte, Col As Byte, lig As Byte, page As String
Col = 2
lig = 3
page = InputBox("Indiquer le mois à controler", "Page Number", "januari")
If page = "" Then Exit Sub
Worksheets("Controle").Range("C2").Formula = "=" & page & "!B1"
For A = 1 To 31
For B = 1 To 19
Worksheets("Controle").Cells(lig, Col).Formula = "=Countif(" & _
page & "!R3C[-" & A & "]:R42C[-" & A & "],Controle!RC1)"
lig = lig + 1

Next B
lig = 3
Col = Col + 2
Next A
End Sub


Bonne Nuit
@+Thierry
 
V

Vériland

Guest
Christophe il te suffit changer la valeur du For A = 1 To 5 en For A = 1 to X...pareille pour le For B éventuellement...(suivant le nombre de ligne bien sur)...ici pour

je me suis basé sur ta première macro qui fait et qui donne exactement le même résultat que ma macro (une colonne sur deux) et apparement le résultat chez moi est le même dans l'inscription de la formule...Non ??

A+ Vériland
 
C

Christophe

Guest
bonsoir a vous

Thanks Thierry et Vériland, a deux vous faites l'équipe de choc.

La mienne marchait tres bien aussi(avec ton aide Thierry), mais peux etre un peu lonque, mais voila, je vais testé, je vous tient au courant

Thanks
 
C

Christophe

Guest
bonsoir a tous

Bon bon, ca marche ou et non, c'est pas mal du tous, mais je devrais commencer par =NB.SI(December!B$3:B$42;Controle!$A4) le =NB.SI(December!A$3:A$42;Controle!$A4) n'existe pas, que dois je changer, j'ai essaye quelque truc, mais je vois pas trop

Thanks
 
@

@+Thierry

Guest
Pour la petite Histoire des variables...

je te conseille de revoir ce fil Vériland :
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=9088&t=9014>

en effet dans ton code pour déclarer les variables :
Dim A, B, Col, lig As Long

en fait seule "Lig" est déclarée en tant que Long dans un statement de la sorte... A, B, Col sont considérées en tant que Variant...

En ce qui concerne ma préférence pour Byte plutôt que Long est que dans ce cas de figure, on économise l'espace mémoire puisque aucune des variables ne dépassera 255.
Par contre si le tableau de Christophe devait couvrir, par exemple, 3000 lignes on déclarerait "B" en tant qu'Integer tant qu'on ne dépasse pas 32 767.

Et enfin on lui attribuerait la déclaration Dim "B" as Long si le tableau couvre au delà de 32,767...

Voilà

Voumfré 100 lignes !!!

Bonne Nuit (D-364 H-00 M-34 S-09 lol)
@+Thierry
 
@

@+Thierry

Guest
Ah Bon Christophe ?

Moi en ayant le macro qui a tourné je trouve en cellule "B3" de la feuille Controle =NB.SI(Feuil1!A$3:A$42;Controle!$A3) et en cellule "BJ" =NB.SI(Feuil1!AE$3:AE$42;Controle!$A3)...

En fait c'est la variable "A" qui paramètre le déplacement de référence RC en soustrayant le numéro de colonne dans la formule...

"=Countif(" & page & "!R3C[-" & A & "]:R42C[-" & A & "],Controle!RC1)"

au premier passage A étant 1, cette ligne de code équivaut à écrire :
"=Countif(" & page & "!R3C[-1]:R42C[-1],Controle!RC1)"

Donc je ne saisis pas où tu as un problème Christophe ? en B3 tu as quoi ?

...à suivre
@+Thierry
 
V

Vériland

Guest
Ah oui c'est juste Thierry...la déclaration...c'est un truc que je peux oublier facilement...les Long, String, Byte et compagnie...enfin j'vais tâcher de m'en souvenir...lol...

Euh!...j'ferai les 100 lignes demain...là j'vais...hi hi hi...

pour Christophe j'vais te laisser étudier car chez moi les deux macros donnent le même résultat...

A+ Vériland

oups Thierry vient de donner une réponse...
 
C

Christophe

Guest
bonsoir Thierry

Bon bon, ben B3 je ne dois rien avoir, je dois commencer en B4
ce probleme, j'ai corriger j'ai remplace lig = 3 par 4 dans Next B.

Quand a B4 ou je dois commencer, j'ai =NB.SI(December!A$3:A$42;Controle!$A4) et je devrais avoir =NB.SI(December!B$3:B$42;Controle!$A4) a la place, je n'utilise pas le A, tu vois. Mais je suis en train de chercher aussi, je ne suis pas aussi rapide que vous, mais je test

Merci
 
@

@+Thierry

Guest
Arf J'ai capté,

Tu ne veux pas dire que "=NB.SI(December!A$3:A$42;Controle!$A4) n'existe pas"
Tu veux dire que dans la feuille (par exemple) "Decembre" la Colonne A est vide (ou contient autre chose !!)

Même si on parle plus VBA qu'autre chose dans ce forum, un peu de français avec Option Explicit serait le bienvenu !!! lol

Bon alors DEUX options
Sub InscrireFormuleA()

Dim A As Byte, B As Byte, Col As Byte, lig As Byte, page As String
Col = 2
lig = 4
page = InputBox("Indiquer le mois à controler", "Page Number", "januari")
If page = "" Then Exit Sub
Worksheets("Controle").Range("C2").Formula = "=" & page & "!B1"
For A = 1 To 31
For B = 1 To 19
Worksheets("Controle").Cells(lig, Col).Formula = "=Countif(" & _
page & "!R3C[-" & A - 1 & "]:R42C[-" & A - 1 & "],Controle!RC1)"
lig = lig + 1
Next B
lig = 4
Col = Col + 2

Next A
End Sub


OU BIEN

Sub InscrireFormuleB()

Dim A As Byte, B As Byte, C As Byte, Col As Byte, lig As Byte, page As String
Col = 2
lig = 4
page = InputBox("Indiquer le mois à controler", "Page Number", "januari")
If page = "" Then Exit Sub
Worksheets("Controle").Range("C2").Formula = "=" & page & "!B1"
C = 0
For A = 1 To 31
For B = 1 To 19
Worksheets("Controle").Cells(lig, Col).Formula = "=Countif(" & _
page & "!R3C[-" & C & "]:R42C[-" & C & "],Controle!RC1)"
lig = lig + 1
Next B
lig = 4
Col = Col + 2
C = C + 1

Next A
End Sub

La seconde n'est pas préférable, je l'ai juste faite pour montrer comment jouer avec des varAible compteur... Mais ce n'est pas conseillé de faire comme çà car c'est certainement plus long !!

Voilà cette fois ci ce devrait être OK de chez OK ? non ?

@+Thierry
 
C

Christophe

Guest
bonsoir a tous

Thanks Thierry, cette fois si c'est super, je dois encore analyser tous cela en detail, du choix que tu me propose, mais tu la trouvé, dsl, de ne pas avoir été clair a 100%

Juste encore une petite question, c'est normal que cette formule et beaucoup plus lente que la mienne, que j'ai faite avec ton aide, la toutes lonque?? Dis moi, ya t'il moyen d'accelere, ou alors c'est mon pc qui devient lent!

Merci
 
@

@+Thierry

Guest
Oh pour çà Christophe

C'est probable que la double boucle soit longue... en fait son temps d'action dépend bcp de la RAM disponible.
De plus c'est probable que de faire cinq cent mille test, qui ont du planter plus d'une fois nécessite de rebooter le PC aussi.

Ton code à rallonge à l'avantage de ne pas faire travailler en calcul, mais juste en écriture. Si tu as un PC ancien, avec par exemple un P133 Et 32Meg de RAM, c'est possible même qu'elle tourne plus vite.

Par contre ici avec un PIII 800 512 de Ram c'est la boucle qui passe plus vite.
Mais c'est insignifiant. Disons 1,5 seconde pour la boucle et 2 pour le roman !!!

Il ne faut pas toujours se braquer sur les boucles. Elles ont surtout l'avantage de ne pas avoir un code long à taper et surtout à indexer avec les risques d'erreur de frappe. Mais ce n'est pas pour celà qu'elle sont plus rapides.

Voilà un fil bien ficelè !!!
Bonne Nuit
@+Thierry
 
C

Christophe

Guest
bonsoir a tous le monde

Merci beaucoup Thierry pour ton aide, on y sera arrive, c'est le principale, pour mon pc, j'ai un Intel P4 2.4MHZ 512 RIMM, Carte mére Assus P4T533C, j'ai comme tu dis, le bonne vieille methode, redémare, mais je trouve que cela reste assez lent, mais bon, aucun probleme, je dois changer mon schema de controle que 1 fois par mois.

Ben voila, un lonque histoire qui fini bien


Je te souhaite une bonne nuit, et tous mes voeux de bonheur pour cette année 2003.

Merci a toi et a tous les autres qui m'ont aidé a résoudre se probleme, maintenant il ne me reste plus qu'as étudie vos solution, pour y voir plus clair

Bonne nuit

Thanks
 

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 102
Membres
103 117
dernier inscrit
augustin.morille