UserForm+Plannificateur de tache

  • Initiateur de la discussion simyrom
  • Date de début
S

simyrom

Guest
Bonjour le forum,
En fait j'ai 2 questions:
.Savez-vous comment on peux lancer une macro tous les jours a une date fixe sans ouvrir Excel en utilisant par exemple le plannificateur de tache (22-06-03 15:41; Reponse de Jacques a Re: Exécution toutes les 24 heures de Christophe)? Je ne comprends pas la solution.
.Je remets ma question sur mon probleme d'userform non pas parce que je n'ai pas de reponse mais parce que il n'etait pas necessaire que je donne tant d'info (en +, je suis desole mais j'avais oublie de zipper mon fichier) et que cela peut-etre plus embrouillant qu'utile.

Je me sers d'un userform/RefEdit (merci Stephane) pour qu'1 utilisateur saississe 2 plages de mesures a analyser.
Apres je veux injecter ces 2 plages de mesures dans un calcul etendu a un tableau. Et la, ca bloque (#VALUE!).
Merci d'avance
Romain

Option Explicit
Dim perd As Range
Dim hgt As Range
Dim l As Integer
Dim M As Integer
Dim n As Integer
Dim o As Integer

Private Sub CommandButton1_Click()

Unload Me
Set perd = Range(Me.RefEdit2.Value)
Set hgt = Range(Me.RefEdit1.Value)

M = 23
o = 37

For n = Cells(6, 7).Column To Cells(6, M - 1).Column
For l = Cells(6, 7).Row To Cells(o - 1, 7).Row
Cells(l, n).Value = [SUMPRODUCT((hgt >= Cells(l, 4)) * (hgt < Cells(l, 6)) * (perd = Cells(37, n))]
Next
Next
Application.EnableCancelKey = xlErrorHandler

End Sub

J'ai fait des essais sans passer par des Userforms, et ca bloque aussi:
Cells(l, n).Value = [SUMPRODUCT((Z17:Z24>= Cells(l, 4)) * (Z17:Z24 < Cells(l, 6)) * (AA17:AA24 = Cells(37, n))]
Donc, cela doit venir de ma syntaxe.

Par contre, cette formule marche:
Cells(l, n).Value = [SUM((A1:A15=1)*(B1:B15>25))]

C'est pour cela que je ne comprends plus...
 
Z

ZON

Guest
Bonsoir ,bonne fin de nuit ou bonjour


Simyrom, je ne comprends pas forcément ta formule somme prod mais comme tu dois passer des variables en VBA les crochets ne suffisent pas, utilises la méthode Evaluate.

A+++
 
S

simyrom

Guest
Salut Zon,
tout d'abord, merci d'avoir planche sur mon pb a 4h30 du mat!

Je veux que ma formule resolve:
si hgt > X1 et hgt < X2 et perd = Y alors il faut sommer le nombre de cas sachant que hgt et perd sont des plages de cellules qu'un utilisteur a selectionne.

Cela revient a faire un scatter diagram. C'est a dire un graphique qui montre la frequence d'une paire X,Y de valeurs. Pour mieux comprendre, je joins le resultat epure final. Pour ce cas la, j'ai utilise une formule matricielle que j'ai glisse dans tout le tableau. Mais maintenant, j'aimerais faire la meme chose avec une macro car d'autres personnes completement novices auront a realiser ces scatter diagrams.
La formule renvoie a des plages definies (Period98 et Height98). Cela peut prendre 30s a Excel le temps de recalculer toutes les formules. Desole, le fichier est gros.

Comme je ne suis qu'un debutant en VBA et que je bidouille, il est fort possible que l'ossature de ma formule ne soit pas la bonne.
En tout cas, je vais essayer avec Evaluate. pour l'instant ca ne marche pas mais peut-etre apres plusieurs essais...

Merci encore et A+
Romain
 

Pièces jointes

  • Forum2.zip
    49.5 KB · Affichages: 27
  • Forum2.zip
    49.5 KB · Affichages: 29
  • Forum2.zip
    49.5 KB · Affichages: 28
Z

ZON

Guest
Re: USF et Formules Matricielle VBA

Bonsoir simyron et le forum,


Voici pour remplir pour ta feuille scatter98 dans ton fichier joint

En mettant juste les résultats on utilise Evaluate

Sub GrantEval()
Dim I As Byte, N As Byte, Resul As Double
With Sheets("Scatter98")
For I = 6 To 37
For N = 7 To 22
Resul = Evaluate("SUM((Height98>=" & .Cells(I, 4).Address & " )*(Height98<" & .Cells(I, 6).Address & " )*(Period98=" & .Cells(38, N).Address & "))")
If Resul > 0 Then .Cells(I, N) = Resul
Next N
Next I
End With
End Sub

On remarquera que les noms Period98 et Height98 n'ont pas besoin de " commes les adresses qui sont considéées comme des chaines de caractères
où en VBA on rajoute des ".

Pour écrire les formules en dur

Les ; sont à remplacé par des virgules en VBA, formulaarray sert uniquement pour les formules matricielles

Sub GrantENDUR()
Dim I As Byte, N As Byte
With Sheets("Scatter98")
For I = 6 To 37
For N = 7 To 22
Cells(I, N).FormulaArray = "=" & "IF(SUM((Height98>=" & .Cells(I, 4).Address & " )*(Height98<" & .Cells(I, 6).Address & " )*(Period98=" & .Cells(38, N).Address & "))>0,SUM((Height98>=" & .Cells(I, 4).Address & " )*(Height98<" & .Cells(I, 6).Address & " )*(Period98=" & .Cells(38, N).Address & ")),"""")"
Next N
Next I
End With
End Sub

Il y a 4 " dans la conditon fausse du si car en VBA pour mettre une chaine de caractere est à mettre entre "" et "" est une chaine ....
*******************USF*******************

Cela revient à adpater GrantEval comme suit mais sans nom défini Excel
Il faut changer les variables perd et hgt en string

Dim Perd as string,HG as string

Perd=Me.Refedit1.value
HG=Me.Refedit2.value

Ta boucle For est à inverser en fait la même que pour GrantEval:
For I = 6 To 37
For N = 7 To 22
With sheets("Ta feuille source")
Result=Evaluate("SUM((" & Perd & ">=" & .Cells(I, 4).Address & " )*(" & Perd & "<" & .Cells(I, 6).Address & " )*(" & HG & "=" & .Cells(J, K).Address & "))")

If Result>0 then cells(I,N)=Result
end with

Voilà en tout cas grace à toi et au fichier des filles que je recommande même aux VBAistes, je comprends mieux les Formules matricielles .....


En conclusion utiliser une formule matricielle en VBA est un peu comme sur une feuille de calcul, si ce n'est qu'en VBA on a pas les () qui clignotent par contre

les Variables string sont à mettre entre " & NomVariable & "
Les cells(1,2), ou cells(L,C) sont à mettre & cells(L,C).address.
Les ; de separation il faut des ,

Toutefois un conseil que je me permettrai de donner aprés cette expérience formidable pour moi dans mon apprentissage VBA .

Ecrire sa formule sur une feuille de calcul et ensuite la traduire en VBA.

J'espère ne pas avoir été trop brouillon car ce n'est pas évident d'être explicite avec les F M .....

A+++
 
Z

ZON

Guest
Re: USF et Formules Matricielle VBA

Re,

une petite coquille le J et le K sont à remplacer par I et N bien sûr....



With sheets("Ta feuille source")
Result=Evaluate("SUM((" & Perd & ">=" & .Cells(I, 4).Address & " )*(" & Perd & "<" & .Cells(I, 6).Address & " )*(" & HG & "=" & .Cells(I, N).Address & "))")



A+++
 
S

simyrom

Guest
Merci

Salut Zon et le forum
Un grand merci pour ta solution qui marche impec et pour le temps que tu as passe a la rediger.
Tes explications m'ont permis de comprendre comment definir les variables. Elles sont tres claires.
Au vu de la soluce, je n'aurais pas ete capable de trouver cela tout seul.
A+ et merci encore.
Romain
 

Statistiques des forums

Discussions
314 658
Messages
2 111 621
Membres
111 235
dernier inscrit
Morgane SANCHEZ