1

次の値を持つ配列 (AlphaVector) があります。

-0.2
-0.7
0
0.4
0.3
0.1

上記の配列から正の値を選択し、Alpha という名前の別の配列に配置して、Alpha から最小の正の値を選択できるようにします。私の目標は、上記の配列から値 0.1 を取得することです。ここに私がこれまで持っているコードがあります。Msgbox が正しい値を示しているため、Alpha は正常に読み込まれますが、取得している戻り値は 0.1 ではなく 0 です。

Function FindMin(AlphaVector)
Dim iCount As Long
Dim N As Integer, i As Integer
N = AlphaVector.Cells.Count
Dim Alpha() As Double
ReDim Alpha(N) As Double
For i = 1 To N
    If AlphaVector(i) > 0 Then
        Alpha(i) = AlphaVector(i)
    Else
        Alpha(i) = 100000000000#
    End If
    MsgBox ("Alpha(i)= " & Alpha(i))
    MsgBox ("AlphaVector(i)= " & AlphaVector(i))
Next i
FindMin = WorksheetFunction.Min(Alpha)
End Function

修正方法を教えてください。また、おそらくアルファを導入せずに、より効率的な書き方があれば教えてください。ありがとう。

4

4 に答える 4

3

array に間違ったインデックスを使用していますAlpha。これは 0 ベースであり、i1 から開始して を使用して入力するAlpha(0)ため、デフォルトの 0 のままにします。

WorksheetFunction.Min(Alpha)常に 0 になることがわかっている最小値を返します。:-)

これを処理するには、関数を再設計する必要があります。例はすぐ後に続きます。

編集 - コード サンプル - UDF として機能するように更新

あなたのコメントを見る前にこのサンプルを完成させたので、私のコードAlphaVectorでは配列です。とにかく、変数を明示的に宣言し、変数を宣言Variantしない場合に使用されるタイプをできるだけ避けることをお勧めします。これが私が使用している理由ですOption Explicit。あなたもすべき。:-)

やりたいことを実行する方法はおそらくたくさんありますが、これはその 1 つです。

Option Explicit

Function FindMin(AlphaVector)
    Dim iNew As Integer, i As Integer
    Dim iCount As Integer
    Dim Alpha() As Variant

    iCount = AlphaVector.Cells.Count

    '***** Use size of AlphaVector
    ReDim Alpha(0 To iCount - 1)
    iNew = 0

    For i = 1 To iCount
        '***** Only save values greater than 0
        If AlphaVector(i) > 0 Then
            Alpha(iNew) = AlphaVector(i)
            '***** Keep track of how many values you save
            iNew = iNew + 1
        End If
    Next i

    '***** Remove any empty items in the Alpha array
    ReDim Preserve Alpha(0 To iNew - 1)

    '***** Reture result of the Min function
    FindMin = WorksheetFunction.Min(Alpha)
End Function
于 2012-11-14T17:16:01.927 に答える
2

参考までに、配列関数を使用して、Excel の 1 つのセルでこれを行うことができます。例の番号が A1:A6 の場合

 =MIN(IF(A1:A6<=0,"",A1:A6))

Ctrl-Shift-Enterただし、配列数式にするために必ず で入力してください。VBA は必要ありません。

于 2012-11-14T18:49:38.000 に答える
1

ここでの問題は、Alpha変数配列の次元をどのように設定するかです。あなたのコードでは、モジュールがOption Base 1宣言されていないと思います。その結果、Alpha次元Alpha(0 to 6)があり、Double配列であるため、最初のゼロ要素はデフォルトで 0 になります。簡単な変更は、コードを次のように変更することです。

ReDim Alpha(1 to N) As Double
于 2012-11-14T17:17:43.577 に答える
0

以下に変更できます。少しきれいです。


Function FindMinUpdated(AlphaVector As Range)

Dim cell As Range Dim lowValCell As Double

lowValCell = Abs(AlphaVector(1))

For Each cell In AlphaVector

    lowValCell = IIf(cell < lowValCell And cell > 0, cell, lowValCell)

Next cell

FindMinUpdated = lowValCell

End Function

于 2012-11-14T17:58:10.510 に答える