1
votes

Comment supprimer une certaine valeur à l'aide des commandes vba?

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 commentaires

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.Min ici, car vous n'êtes pas intéressé par le résultat de Min (stuff) : c'est la cellule qui contient cette valeur que vous recherchez, pas la valeur elle-même. Donc, vous voulez l'objet Range avec la plus petite valeur dans le stuff fourni, en supposant que ce stuff est un Range , ce qui serait beaucoup plus explicite par exemple si la signature de la fonction était Public Function DeleteMinValue (ByVal stuff As Range) , nous saurions qu'elle veut une Range et pas seulement un tableau de valeurs. Itérer ( For Each ) les cellules dans trucs , 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.


3 Réponses :


1
votes

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


0 commentaires

0
votes

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


0 commentaires

1
votes

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


5 commentaires

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 = ;-)


@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! =)