3
  • 最小値を見つけて、別の関連する値を 1 増やす候補として評価する必要がある変数のリストがあります。
  • ただし、すでに 100 (パーセント) になっている変数は、100 を超えて増やすことはできないため、考慮しないでください。

(判定変数はa、増分値はb)

a1 = 0.5,
a2 = 0.6,
a3 = 0.2,
myArray(0) = a1
myArray(1) = a2
myArray(2) = a3
b1 = 0,
b2 = 10,
b3 = 100

私の現在のコード

If b1 = 100 Then
myArray(0) = null (empty, something to remove it from consideration in min function)
End IF
If b2 = 100 Then
myArray(1) = null
End IF
If b3 = 100 Then
myArray(2) = null
End IF
minvalue = Application.WorksheetFunction.Min(myArray(0), myArray(1), myArray(2))
'also tried: minvalue = Application.WorksheetFunction.Min(myArray)
If minvalue = a1 Then
b1 = b1 +1
Else If minvalue = a2 Then
b2 = b2 +1
Else If minvalue = a3 Then
b3 = b3 +1
End IF

a3 が最小値であるにもかかわらず、b3 をこれ以上増やすことはできないため、次に低い値は a1 であり、b1 が 1 増加することをコードに記録したいと思います。

この機能は、通常の Excel スプレッドシートで機能します。値のリストを作成し、その下のセルに次のように入力できます。この=Min(A1,B1,C1)例では A1 = a1、上の例では B2 = a2 などです。C1 に Null と入力すると、min 関数は a1 なしで問題。

ただし、 vba で同じことをしようとすると、 myArray の要素が Null の場合は常に minvalue が 0 に等しくなります

ループを使用して最小値を手動で決定することも検討しましたが、非常に見苦しく、コードをできるだけきれいに保ちたいと考えています。

よろしくお願いします。

4

2 に答える 2

2

これはループを使用しますが、これはかなりクリーンなコードだと思います。

Sub test()

    Dim a(1 To 3) As Double
    Dim b(1 To 3) As Double
    Dim check(1 To 3) As Boolean
    Dim lowestIndex As Integer
    Dim lowestValue As Double

    Dim i As Integer
    Dim j As Integer

    a(1) = 0.5
    a(2) = 0.6
    a(3) = 0.2

    b(1) = 0
    b(2) = 10
    b(3) = 100


    'initialize to  everything initially
    For i = 1 To UBound(a)
        If (b(i) >= 100) Then
            check(i) = False
        Else
            check(i) = True
        End If
    Next i


    Dim numbTimesToDoStuff As Integer
    numbTimesToDoStuff = 100

    'go through this process however many times you need
    For i = 1 To numbTimesToDoStuff
        'reset each iteration
        lowestValue = 99999

        'find minimum value and index each time
        For j = 1 To UBound(a)
            If (check(j) = True) Then
                If (a(i) < lowestValue) Then
                    lowestValue = a(i)
                    lowestIndex = i
                End If
            End If

        Next j

        'check if no values were found to be lowest and valid
        If (lowestValue = 99999) Then
            MsgBox ("Error: not checking any values!")
        End If

        'update appropriate "b"
        b(lowestIndex) = b(lowestIndex) + 1
        'check if you've reached 100 and stop future checks
        If (b(lowestIndex >= 100)) Then
            check(lowestIndex) = False
        End If


    Next i



End Sub
于 2012-10-15T19:22:20.503 に答える
2

Filter配列から値を削除するために使用できます。

この場合Filter、 を使用して配列から値を削除し100、次にEVALUATEを使用して残りの配列の最小値を取得します

Sub Test2()
Dim MyArray()
MyArray = Array(900, 112, 100, 122, 196)
MsgBox Evaluate("Min(" & Join(Filter(MyArray, 100, False), ",") & ")")
End Sub
于 2012-10-16T05:34:19.283 に答える