2017-05-16 5 views
0

Le problème:Excel VBA - Trouvez l'adresse maximale (ou une valeur spécifique) dans la gamme, si la plage containes valeurs DOUBLE

Il y a une plage avec deux valeurs. Je voudrais obtenir l'adresse de la valeur maximale. J'ai essayé avec la fonction de match, mais il ne peut pas comparer les doubles (donne des résultats faux), et ma gamme n'est pas commandée.

Il existe des solutions moche (par exemple, je peux multiplier mes nombres par 10000, si je veux une précision de 5 chiffres, puis obtenir la partie entière et la comparer, mais il est très lent avec plus de 20000 lignes). des solutions plus élégantes.

Merci de

de données Exemple: Ce sont les chiffres après Debug.Print

B 7.59999999999934E-02 
C 7.00000000000074E-02 
D 0.335000000000008 
E 8.19999999999936E-02 
F 8.49999999999937E-02 
G 7.39999999999981E-02 
H 5.49999999999926E-02 
I 0.070999999999998 
J 0.165000000000006 
K 7.59999999999934E-02 
+0

Pouvez-vous poster quelques exemples de données? – BruceWayne

+0

Je pense que la meilleure solution est d'oublier la fonction max d'Excel, et d'écrire ma propre fonction maximale, où je peux suivre l'adresse du nombre maximum réel. –

Répondre

0

Pourquoi ne pas simplement itérer votre gamme et changer une variable si la prochaine valeur double des cellules est supérieure? Une fois que vous avez terminé cette plage, utilisez la recherche pour retourner la ligne et la colonne. Voir ci-dessous

Dim i as Variant 
For Each i In Worksheets("yourWorkSheet").Range(Range("youStartCell"), Range("yourStartCell").End(xlDown)).Cells 
    If i.Offset(-1) < i Then 
     i = i.value 
    End if 
Next 

Doit ressembler à ceci. Besoin de gérer le cas de la première rangée en boucle, mais si je l'ai fait, vous n'auriez pas de travail à faire.

+0

Oui, merci. Ceci est très similaire à une fonction max personnalisée. J'ai fait une approche similaire :) –

+0

upvote pour le bon karma, pas upvote = badluck –

+0

J'ai essayé d'upvote, mais j'ai moins de 15 réputation. Je n'ai pas utilisé le site trop souvent jusqu'à présent. Donc, le vote est désactivé pour moi. –

0

Ceci est ma solution finale:

'Find max and its address in range 
Public Function maxAddress(rng As Range) As DoubleLong 

Dim cell As Range 

For Each cell In rng 
    If IsNumeric(cell.Value2) Then 
     If cell.Value2 > maxAddress.db Then 
      maxAddress.db = cell.Value2 
      maxAddress.lg = cell.Row 
     End If 
    End If 
Next cell 
End Function 

où est défini un type:

Public Type DoubleLong 
    db As Double 
    lg As Long 
End Type