Une difficulté avec Evaluate [Résolu]

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Pour tenter de résoudre un problème, je pense devoir passer dabord par la résolution de celui-ci.

Supposons que dans la cellule A1 il y a la valeur 20.

Si, dans une macro j'écris :
[A2] = [$A$1]

Sur la feuille, dans la cellule A2 apparaîtra le contenu de la cellule A1, autrement dit 20.

Dans ma macro j'écris maintenant :
Dim ad As String
ad = [A1].Address
[A2] = ad

Sur la feuille, dans la cellule A2 apparaîtra bien $A$1.

Si j'écris dans la macro :
Dim ad As String
ad = [A1].Address
[A2] = [ad]

Sur la feuille, dans la cellule A2 apparaîtra $A$1.

Comment faire en sorte, suivant ce raisonnement, qu'apparaisse le contenu de la cellule A1 (20) ?
Peut-être en glissant un "INDIRECT" quelque part...
Je bataille depuis un moment, mais n'ai rien trouvé.
 

Staple1600

XLDnaute Barbatruc
Re, Bonsoir job75

justifiable si on utilise f plusieurs fois.
C'était le cas ici
Bonsoir le fil, le forum

@Magic_Doctor
Merci pour la PJ qui a éclairé ma lanterne

Au cas où, et par curiosité, est-ce ta fonction ainsi modifiée fonctionne chez toi?
VB:
Public Function MuchasCol(ByRef n As Range, p As Range, c As Long, x As Byte) As Double
'Renvoie la valeur minimale ou maximale ou la moyenne d'un ensemble de colonnes qui peut être tronqué
'Function de Magic_Doctor, recoloriée par Staple1600 ;-)
Dim haut&, f: Set f = Application.WorksheetFunction
haut = f.Match(n, p, 0): Set p = p.Offset(, 1).Resize(haut, c)
MuchasCol = Switch(x = 1, f.Min(p), x = 2, f.Max(p), x = 3, f.Average(p))
End Function
 

job75

XLDnaute Barbatruc
Re,

Quand on modifie C2 dans le fichier précédent la formule en D43 ne se recalcule pas correctement.

C'est dû au fait que ce recalcul se fait avant que toutes les formules en D6: D38 soient recalculées.

On remédie à cette situation par la Worksheet_Change :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, [C2]) Is Nothing Then
        ActiveSheet.ChartObjects(1).Chart.Axes(xlValue).MinimumScale = [J24].Value
        [D43] = [D43].Formula 'recalcul de la formule
    End If
 
End Sub
Fichier (2).

Re-bonne nuit.
 

Pièces jointes

  • Exemple(2).xlsm
    32.7 KB · Affichages: 35

Magic_Doctor

XLDnaute Barbatruc
Re job,

Merci et bravo job. Un exercice intéressant pour progresser dans cette fonction Evaluate qui, je dois le reconnaître, est à utiliser avec circonspection. Les "[]" foutent un peu la pagaille dans l'esprit...
Quant à Set f = Application.WorksheetFunction, tu as certainement raison, mais, ma foi, je trouve que c'est bô et que ça pose.
 

Magic_Doctor

XLDnaute Barbatruc
Moment d'insomnie, je n'avais pas rafraîchi l'écran, avant d'aller me recoucher :
Dans la version finale, j'ai en fait 4 graphiques dont 2 avec ce type de calcul. Tous ces graphiques sont sous le contrôle de la même cellule.
Peut-on alors écrire : [AE50, AO50, AY50, AZ52, BJ50, BK50] = [AE50, AO50, AY50, AZ52, BJ50, BK50].Formula ?
 

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor, le forum,

Non, ce genre de calcul est matriciel, les cellules doivent donc être jointives.

C'est comme pour le copier/coller.

Tu pourras écrire [AE50:BK52] = [AE50:BK52].Formula si cela ne provoque pas un bouclage sans fin de la Worksheet_Change et s'il n'y a pas des cellules fusionnées qui posent problème.

Sinon faire une boucle pour traiter séparément les cellules.

Bonne journée.
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour job, le forum,

Si l'écart entre toutes les cellules était identique, faire une boucle serait facile.
J'ai néanmoins trouvé un moyen bizarre pour y arriver.
Mais que l'on tente de résoudre ce problème par le biais d'une boucle (aussi tordue soit-elle) ou en traitant chaque cellule individuellement, un nouveau problème survient : le calcul d'instantané avec les formules Excel devient "interminable" (façon de parler) avec la fonction.
Dommage. L'idée d'une fonction me plaisait, d'autant plus que son paramétrage était des plus simples, mais, vu le résultat, je la laisserai donc de côté, à moins qu'un jour on trouve une solution pour pallier ce problème.
 

ChTi160

XLDnaute Barbatruc
Bonjour Magi_Doctor
Bonjour le Fil ,Job75
Bonjour le Forum
voila ce que j'ai mis sans trop comprendre la demande LOL
y avait un problème , car tu boucles de 1 a 6 et tu n'as que Trois Switch (d'ou l'erreur je pense !)
Sub SchizoBoucle()
Dim i As Byte, col As Long, celda As Range, cellule As Range
Set celda = [AE50] 'une des cellules en question (servira uniquement à connaîre la ligne)
VB:
For i = 3 To 5
  col = Int(0.0833333333 * i ^ 3 - 1.6785714286 * i ^ 2 + 14.6666666667 * i + 18) 'fonction qui permet de calculer approximativement le N° de colonne des cellules
  'Conditions par Switch :
  col = Switch(i = 3, col + 2, i = 4, col - 3, i = 5, col + 3)  'réajustements col = Switch(i = 3, col + 2, i = 4, col - 3, i = 5, col + 3)  'réajustements
ou
'  col = col + Switch(i = 3, 2, i = 4, -3, i = 5, 3)  'réajustements
MsgBox Split(Columns(col).Address(0, 0), ":")(1)
  Set cellule = Range(Split(Columns(col).Address(0, 0), ":")(1) & celda.Row)  'ne marche pas si l'on passe par "Switch"
  cellule = "ZZZ" 'cellule.Formula '"traitement" de chaque cellule
Next
End Sub
Bonne journée
Amicalement
Jean marie
 

Magic_Doctor

XLDnaute Barbatruc
Re,

Non, insomnie. Parfois ça arrive,
Après avoir regardé le dernier épisode de "Alias JJ" (¡Caramba! il y en avait 60 !!!), inspiration pour macro bizarre. Excellente série colombienne cet "Alias JJ". C'est l'histoire (certes un peu exagérée je pense) du sicaire de Pablo Escobar, qui vit du reste toujours (pratiquement tous les autres sont morts brutalement), est sorti de prison et fait maintenant de la politique ! Bon, en Uruguay, on a eu un Président qui était ancien Tupamaro... ¡Solo se ve esto acá, en América latina! On y apprend le colombien. On apprend aussi qu'ils utilisent le vos autant qu'ici, le "Río de la Plata" (Argentine + Uruguay). Mais sutout on comprend mieux l'incommensurable bordel et drame qu'a vécu ce pays pendant plus de 3 décennies à cause de toute une bande de falabracs répartis entre "Guerrilleros", "Paramilitares" et "Narcotraficantes". Un cauchemar qui a généré des centaines de milliers de morts. On en a beaucoup moins parlé que du Chili... Et quels bons acteurs ces colombiens !
Après cet aparté, revenons-en à nos moutons. En effet, c'était très simple et laconique, comme j'aime. Il est vrai que j'ai tendance à compliquer...
En revanche, après mon dernier post sur ce fil, je me suis rendu compte qu'il y avait une énorme erreur dans ma macro, que j'ai corrigée.
Quand je compare ta solution avec ma macro corrigée, je me rends compte, qu'au niveau temps, c'est à peu près pareil.
Mais comment chronomètre-t-on le déroulement d'une macro ? De temps en temps les caïds font une compet et chronomètrent l'exécution de leurs routines.
Cette macro, je l'ai catapultée sur un autre fil, non pas pour faire doublon (c'est détestable), mais à cause de ce "Switch" qui ne marche curieusement pas. C'était l'occasion d'un nouveau fil sur cette fonction "Switch" que je viens de découvrir (ce n'est pas la fonction que l'on voit en permanence...).
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re,

Ça recalcule, à partir de Worksheet_Change les cellules en question.
Sur la feuille ces cellules contiennent une fonction que j'avais faite. Le problème est que quand on modifie les valeurs, la fonction calcule avant que les nouvelles aient fini de s'afficher, obligeant ainsi à faire à nouveau le calcul pour obtenir un résultat cohérent. C'est bizarre pour moi, mais clair pour job75 qui avait réglé ainsi le problème.

À la Rvoyure !
 

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor, le forum,

Toi qui aimes les trucs bien tordus ce fichier (3) devrait te plaire.

Dans la Worksheet_Change j'ai neutralisé [D43] = [D43].Formula

Et j'ai ajouté dans la fonction :
Code:
tablo = plage3 'la LECTURE de plage3 la met à jour (en attente du calcul de ses formules)
Je découvre cette propriété de la LECTURE, en fait c'est très intéressant.

Car la fonction n'est calculée qu'une fois, au lieu de 2 fois avec le fichier (2).

Edit : pour voir la différence avec ou sans la lecture modifier C2 après avoir revalidé D43.

A+
 

Pièces jointes

  • Exemple(3).xlsm
    32.8 KB · Affichages: 26
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonjour job,

Fichtre ! J'étais sur le point d'abandonner cette fonction pour remettre les formules "intriquées" et interminables d'Excel (qui marchent évidemment très bien). Ça remonte le moral !
Si j'ai bien compris, écrire tablo = plage3 revient à réaliser une espèce de mise en attente.
Comme quoi les trucs tordus peuvent amener à des surprises...
Encore une fois : Bravo !
 

Discussions similaires

Statistiques des forums

Discussions
312 069
Messages
2 085 037
Membres
102 763
dernier inscrit
NICO26