J'essaie d'écrire une fonction qui supprime automatiquement la valeur minimale pour une sélection donnée de cellules. Je sais comment trouver la valeur minimale, mais je ne sais tout simplement pas comment supprimer cette valeur.
Voici ce que j'ai.
Fonction MinDel (Stuff)
MinDel = Application.Worksheetfunction.min (trucs)
Fin de la fonction
Comment supprimer la valeur MinDel?
3 Réponses :
Vous pouvez modifier la fonction depuis ici comme ça
Option Explicit
Function AddressOfMax(rng As Range) As Range
Set AddressOfMax = rng.Cells(WorksheetFunction.Match(WorksheetFunction.Max(rng), rng, 0))
End Function
Function AddressOfMin(rng As Range) As Range
Set AddressOfMin = rng.Cells(WorksheetFunction.Match(WorksheetFunction.Min(rng), rng, 0))
End Function
Sub TestIt()
Dim rg As Range
Dim rgMin As Range
Set rg = ActiveSheet.Range("A1:A6")
Set rgMin = AddressOfMin(rg)
rgMin.Clear
End Sub
La procédure ci-dessous supprimera la valeur la plus basse d'une sélection, à condition que la sélection comprenne plus d'une cellule. Il ignore tout sauf la première colonne de la sélection.
Sub DelMin()
' 05 Jan 2019
Dim Arr As Variant, i As Integer
Dim Mm As Variant, m As Integer
With Selection
If .Cells.Count > 1 Then
Arr = .Value
For i = 1 To UBound(Arr)
If Not IsEmpty(Arr(i, 1)) Then
If IsEmpty(Mm) Or (Arr(i, 1) < Mm) Then
Mm = Arr(i, 1)
m = i
End If
End If
Next i
.Cells(m, 1).ClearContents
End If
End With End Sub
Comme mentionné dans les commentaires, une UDF (User Defined Function) ne peut pas changer une valeur ou une plage dans Excel par défaut et un Sub doit être utilisé. C'est ma façon de supprimer la valeur minimale dans la Selection :
Public Sub DeleteMinimum()
Dim myRange As Range
Dim minValue As Double
Dim myMin As Range
If Not TypeOf Selection Is Excel.Range Then Exit Sub
Dim valueAssigned As Boolean: valueAssigned = False
minValue = 0
For Each myRange In Selection
If IsNumeric(myRange) Then
If Not valueAssigned Then
valueAssigned = True
minValue = myRange
Set myMin = myRange
Else
If myRange < minValue Then
minValue = myRange
Set myMin = myRange
End If
End If
End If
Next myRange
If Not myMin Is Nothing Then
myMin = "DELETED!"
End If
End Sub
Pas mal, bien que If Not TypeOf Selection Is Excel.Range devrait probablement être manipulé, et myMin = serait plus explicite si c'était myMin.Value = code> ;-)
@MathieuGuindon - Sélection TypeOf est en effet une bonne idée, j'ai oublié que quelqu'un peut sélectionner une forme dans Excel. Pour MyMin.Value = , je n'aime pas utiliser .Value sur une plage, car cela me semble être un bruit supplémentaire. Y a-t-il un cas où .Value est vraiment nécessaire ou l'idée que l'attribution d'une String à une variable Range n'est pas une bonne pratique?
Il s'agit d'une affectation de membre implicite par défaut, ce qui oblige le lecteur et VBA à travailler beaucoup plus dur qu'ils ne le devraient simplement pour accéder à cette propriété. Range est un objet, et c'est LHS d'un opérateur d'affectation; un tel code implicite est la raison pour laquelle les gens se demandent quand et pourquoi un mot clé Set est requis, et ce que signifie attribuer une référence d'objet. Le code explicite dit quelque chose et fait exactement cela . Beaucoup de choses se passent pendant une affectation implicite de membre par défaut, esp. donné Range. [_ Default] étant le membre par défaut. Si le lecteur peut expliquer ce qui se passe, alors très bien. Sinon, c'est l'OMI toxique.
@MathieuGuindon - Je vois votre point de vue, être explicite et rendre VBA un peu plus rapide est plutôt bien, mais .Value est une lenteur avec laquelle je peux vivre. Je me demande simplement, pourquoi savez-vous que Range. [_ Default] est le membre par défaut de Range? Dans quel scénario avez-vous eu besoin de vérifier cela? (C'est le membre par défaut): stackoverflow.com/questions/32996772/...
le scénario? Comprendre exactement comment résoudre les appels des membres de Range en code VBA, afin que Rubberduck le comprenne correctement! =)
un UDF ne peut modifier aucune autre cellule. il prend une entrée, calcule un résultat, renvoie ce résultat. semble que vous voudrez peut-être en faire une macro
Sub/ à la place?Vous ne souhaitez pas utiliser
WorksheetFunction.Minici, car vous n'êtes pas intéressé par le résultat deMin (stuff): c'est la cellule i > qui contient cette valeur que vous recherchez, pas la valeur elle-même. Donc, vous voulez l'objetRangeavec la plus petite valeur dans lestufffourni, en supposant que cestuffest unRange, ce qui serait beaucoup plus explicite par exemple si la signature de la fonction étaitPublic Function DeleteMinValue (ByVal stuff As Range), nous saurions qu'elle veut uneRangeet pas seulement un tableau de valeurs. Itérer (For Each) les cellules danstrucs, donner une référence à celle avec la plus petite valeur.Ok, donc si je voulais créer une fonction dans Excel, lorsque vous sélectionnez un tableau, il imprime la valeur minimale dans la cellule, vous avez entré la fonction et supprimé cette valeur du tableau afin que la même fonction puisse être utilisée plus d'une fois, comment Je le fais? Je suis vraiment nouveau dans ce domaine et je veux juste supprimer la valeur.