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

Evaluate

12 réponses
Avatar
Jacquouille
Bonsoir,

Evaluate permet de se servir d'une formule en VBA. Oui, mais une formule
validée par "Enter", p. ex:
[A1]= Evaluate("max(zn)")

Mais, qu'en est-il avec une formule matricielle?
p.ex =
Evaluate("ADRESSE(EQUIV(MAX(DROITE(zn;2)*1);DROITE(zn;2)*1;0)+LIGNE(zn)-1;COLONNE(zn))")

Déjà merci et bonne fin de journée, de semaine et bon WE

Jacques
" Le vin est au repas ce que le parfum est à la femme."
.

10 réponses

1 2
Avatar
MichD
Bonjour,
Pour pouvoir utiliser la méthode "Evaluate" ou les crochets droits", les
fonctions utilisées de la feuille doivent aussi exister en VBA.
Dans ton exemple, la fonction "Address" n'existe pas en VBA, il n'y a
pas une fonction équivalente à la fonction de la feuille de calcul. Il
faut donc procéder autrement.
Toutes les fonctions de la feuille de calcul disponible en vba font
partie de la liste suivante. Après la saisie du point après
Worksheetfonction, tu obtiens une liste déroulante des fonctions possibles.
x = Application.WorksheetFunction.
'------------------------------
Sub test()
Dim A As Long ' retourne la ligne de la plus grande valeur
'2 syntaxes possibles
A = Evaluate("MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)")
'OU
A = [MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)]
Dim B As String 'Contient l'adresse de la valeur
B = Cells(A, Range("zn").Column).Address
MsgBox B
End Sub
'------------------------------
MichD
Avatar
Jacquouille
Merci Denis
Je vois que tu es aussi un adepte du Cap'taine Crochet.
Bon WE
Jacques
" Le vin est au repas ce que le parfum est à la femme."
.
"MichD" a écrit dans le message de groupe de discussion :
qbn6vh$rog$
Bonjour,
Pour pouvoir utiliser la méthode "Evaluate" ou les crochets droits", les
fonctions utilisées de la feuille doivent aussi exister en VBA.
Dans ton exemple, la fonction "Address" n'existe pas en VBA, il n'y a
pas une fonction équivalente à la fonction de la feuille de calcul. Il
faut donc procéder autrement.
Toutes les fonctions de la feuille de calcul disponible en vba font
partie de la liste suivante. Après la saisie du point après
Worksheetfonction, tu obtiens une liste déroulante des fonctions possibles.
x = Application.WorksheetFunction.
'------------------------------
Sub test()
Dim A As Long ' retourne la ligne de la plus grande valeur
'2 syntaxes possibles
A = Evaluate("MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)")
'OU
A = [MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)]
Dim B As String 'Contient l'adresse de la valeur
B = Cells(A, Range("zn").Column).Address
MsgBox B
End Sub
'------------------------------
MichD
Avatar
Jacquouille
Re
Je ne sais pas si c'est l'usage du grand breton, mais il m'indique "Erreur
1004". Juste avant le WE.
Juste pour m'emm***
--------------------
Sub test2()
Dim zn As Range
Dim A As Long
Dim derLG As Integer
Set zn = Range("G1:G" & derLG)
A = Evaluate("MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)")
'OU
'A = [MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)]
Dim B As String 'Contient l'adresse de la valeur
B = Cells(A, Range("zn").Column).Address
MsgBox B
End Sub
------------------------------
Jacques
" Le vin est au repas ce que le parfum est à la femme."
.
"MichD" a écrit dans le message de groupe de discussion :
qbn6vh$rog$
Bonjour,
Pour pouvoir utiliser la méthode "Evaluate" ou les crochets droits", les
fonctions utilisées de la feuille doivent aussi exister en VBA.
Dans ton exemple, la fonction "Address" n'existe pas en VBA, il n'y a
pas une fonction équivalente à la fonction de la feuille de calcul. Il
faut donc procéder autrement.
Toutes les fonctions de la feuille de calcul disponible en vba font
partie de la liste suivante. Après la saisie du point après
Worksheetfonction, tu obtiens une liste déroulante des fonctions possibles.
x = Application.WorksheetFunction.
'------------------------------
Sub test()
Dim A As Long ' retourne la ligne de la plus grande valeur
'2 syntaxes possibles
A = Evaluate("MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)")
'OU
A = [MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)]
Dim B As String 'Contient l'adresse de la valeur
B = Cells(A, Range("zn").Column).Address
MsgBox B
End Sub
'------------------------------
MichD
Avatar
MichD
mais il m'indique "Erreur 1004".  Juste avant le WE.
Dim derLG As Integer
Set zn = Range("G1:G" & derLG)

**** Dans ta procédure, je ne vois pas où tu as attribué une valeur à
derLG, par conséquent elle est 0 puisque tu la variable a le type
Integer. Range("G1:G0") ne se peut pas, il n'y a pas de ligne 0 dans une
feuille de calcul d'où ton erreur.
ZN est le NOM d'une plage nommée dans la feuille de calcul. Une manière
rapide de faire cela :
With worksheets("NomDeLaFeuille")
.Range("G1:G" & DerLG).name = "ZN"
End With
Dans ta ligne de code :
Set zn = Range("G1:G" & derLG)
ZN est un objet "Range" et non une plage nommée
L'expression "SET" s'emploie seulement pour définir des objets comme
"Range", "Worksheet", "Workbook", etc. Ces variables sont définies comme
Dim ZN As range
Dim Sh as Worksheet
dim Wk as Workbook
**** Cette ligne de code utilise une plage nommée.
A = Evaluate("MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)")

MichD
Avatar
Jacquouille
Re
Errare Humanum est !
derLG = Cells(Cells.Rows.Count, 7).End(xlUp).Row était restée coincée
dans les poils de la souris.
Cela fonctionne tellement mieux comme cela.
Encore merci et 1001 excuses pour cet oubli impardonnable.
pour me punir, je ne prendrai qu'un seul verre d'apéro.
Jacques
" Le vin est au repas ce que le parfum est à la femme."
.
"MichD" a écrit dans le message de groupe de discussion :
qbom91$14sc$
mais il m'indique "Erreur 1004". Juste avant le WE.
Dim derLG As Integer
Set zn = Range("G1:G" & derLG)

**** Dans ta procédure, je ne vois pas où tu as attribué une valeur à
derLG, par conséquent elle est 0 puisque tu la variable a le type
Integer. Range("G1:G0") ne se peut pas, il n'y a pas de ligne 0 dans une
feuille de calcul d'où ton erreur.
ZN est le NOM d'une plage nommée dans la feuille de calcul. Une manière
rapide de faire cela :
With worksheets("NomDeLaFeuille")
.Range("G1:G" & DerLG).name = "ZN"
End With
Dans ta ligne de code :
Set zn = Range("G1:G" & derLG)
ZN est un objet "Range" et non une plage nommée
L'expression "SET" s'emploie seulement pour définir des objets comme
"Range", "Worksheet", "Workbook", etc. Ces variables sont définies comme
Dim ZN As range
Dim Sh as Worksheet
dim Wk as Workbook
**** Cette ligne de code utilise une plage nommée.
A = Evaluate("MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)")

MichD
Avatar
MichD
pour me punir, je ne prendrai qu'un seul verre d'apéro.

**** Au petit-déjeuner? ;-)
MichD
Avatar
Jacquouille
"MichD" a écrit dans le message de groupe de discussion :
qbon5e$1866$
pour me punir, je ne prendrai qu'un seul verre d'apéro.

**** Au petit-déjeuner? ;-)
--------------------------------------
A vaincre sans péril, il n'y a pas de gloire.
En plus, il était 12:35 hr au moment où j'ai écrit ce msg.
Pour dessert, voici le résultat.
Est-ce bon, ou pas, et comment, de remettre les var à zéro à chaque
démarrage?
-------------------
Sub Maxim()
'On Error Resume Next
Dim zn As Range
Dim A As Long ' retourne la ligne de la plus grande valeur
Dim B As String 'Contient l'adresse de la valeur
Dim n As Long ' retourne le Max de zn
Dim derLD As Integer
Dim derLG As Integer
derLD = Cells(Cells.Rows.Count, 4).End(xlUp).Row
derLG = Cells(Cells.Rows.Count, 7).End(xlUp).Row
With Worksheets("Feuil1")
.Range("G1:G" & derLG).Name = "zn"
End With
Range("zn").Interior.ColorIndex = xlnonne 'on nettoye tout
n = Evaluate("max(zn)")
For Each c In Range("zn")
If [c] = n Then
c.Interior.ColorIndex = 45
Range("D" & derLD + 1).Value = c.Address
End If
Next
derLD = derLD + 1
A = [MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)]
'A = Evaluate("MATCH(MAX(RIGHT(zn,2)*1),RIGHT(zn,2)*1,0)")
B = Cells(A, Range("zn").Column).Address
' et enfin, l'affichage:
Range("D" & derLD + 1).Value = B
Cells(A, Range("zn").Column).Interior.ColorIndex = 4
End Sub
---------------------------
Dans : derLD = Cells(Cells.Rows.Count, 4).End(xlUp).Row
peut-on remplacer le 4 par colonne(D) ou un truc du genre?????
Compter jusque 4, ça va, mais à la centième colonne .....
-----------------------------
Bon WE et merci
MichD
Avatar
Geo
Bonjour
En plus, il était 12:35 hr au moment où j'ai écrit ce msg.

Tu as oublié le décalage horaire, actuellement 6h ou 7h entre la
Belgique et le Québec ?
Avatar
MichD
Est-ce bon, ou pas, et comment, de remettre les var à zéro à chaque
démarrage?

Quand tu prends le temps de déclarer des variables "LOCALES"
c'est-à-dire déclarer au niveau de la procédure, la variable prend la
valeur par défaut.
Dim S as Integer OU Long OU Double OU Currency
Par défaut la valeur S vaut 0 et ce, à chaque exécution de la procédure
Dim T as string
t = "" par défaut
dim V as variant
La variable V prend le type selon la donnée que tu lui as affectée.
Cependant, lorsque tu déclares les variables dans le haut d'un module,
la valeur attribuée à la variable demeure jusqu'au moment où tu la
changes volontairement ou pas.
Exemple : dans un module standard ou dans un module Feuille
Dans le haut du module :
Dim P as Long
'-----------------
Sub test()
P = P + 1
End Sub
'-----------------
La valeur P s'incrémente à chaque fois que tu exécutes la procédure Test.
Une variable "Public" se déclare dans un module standard et elle est
reconnue partout dans le code
avec Dim , la variable déclarée n'est valide que dans le module où elle
a été déclarée.
MichD
Avatar
MichD
Le 18/05/19 à 09:41, Geo a écrit :
Bonjour
En plus, il était 12:35 hr au moment où j'ai écrit ce msg.

Tu as oublié le décalage horaire, actuellement 6h ou 7h entre la
Belgique et le Québec ?

Bonjour Geo,
Décalage horaire entre le Québec et la Belgique : 6 h
Décalage horaire entre l'ouest (Colombie-Britannique) et l'est du Canada
(Terre-Neuve) : 5 h.
MichD
1 2