2016-11-04 21 views
0

このサブルーチンでは、すべての行が最低値をチェックします。私はこの値がどの列にあるかを知りたい。どのように手続きしますか?ここ は、私がこれまでに得たものである:VBA:行の最小値を持つ列を特定する方法は?

Sub LowCol() 
    Dim iAnz As Long 
    Dim myrange As Range 
    Dim rCell As Range 
    Dim iLevel As Long 
    Dim i As Long 
    Dim j As Long 
    Dim iPos As Long 
    Dim dMin As Double 
    iAnz = Worksheets("v1").Cells(6, 3).Value 'amount of columns 
    iLevel = Worksheets("b1").Cells(2, 2).Value 'amount of rows 

    For i = 0 To iLevel 
     Set myrange = Worksheets("b1").Range(Cells(5 + i, 2 + iAnz + 1), Cells(5 + i, 2 + iAnz + iAnz + 1)) 
     dMin = Application.WorksheetFunction.Min(myrange) 
     Set rCell = myrange.Find(What:=dMin, LookIn:=xlValues, _ 
           LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
           MatchCase:=False, SearchFormat:=False) 
     iPos = CLng(rCell.Column) 'this line is obviously not working. How to fix? 
     Worksheets("b1").Cells(5 + i, 2 + iAnz + iAnz + 1).Value = iPos 
    Next i 
End Sub 
+0

'CLng'は、ある値を' Long'データ型に変換する関数です。私はあなたがしたいことではないと確信しています。だから、この 'iPos = CLng(rCell.Column)'行は何をすべきでしょうか?あるいは、「アイポス」はどんなものでしょうか?列番号?行番号? – Limak

+0

列番号 - rCell.Columnがうまくいかない問題があります: -/ – Boernii

+0

Min関数が空白を無視することを確認した後、私の答えを削除しました。完全な範囲のブランク値を持たずに同じエラーを再現することもできませんでした。 –

答えて

1

これは、MIN関数のように高速ではありませんが、あなたが大規模なデータセットで作業している場合を除き、それは大きな違いをすることはありません。

Function getMinValueColumn(Target As Range) As Long 
    Dim r As Range, rMin As Range 

    If Target Is Nothing Then Exit Function 
    For Each r In Target 
     If r.Value <> vbNullString Then 
      If rMin Is Nothing Then Set rMin = r 
      If r.Value < rMin.Value Then Set rMin = r 
     End If 
    Next 
    If Not rMin Is Nothing Then getMinValueColumn = rMin.Column 
End Function 
+0

を実行したい場合r.Value> rMin.Value Then rMin = rを設定する必要がありますr.Value Boernii

1

あなたはMIN値の列の数を取得するためにVBAを必要としません。同じように、MATCHで式を使用:

=MATCH(MIN(A1:G1);A1:G1;0) 
+0

ただし、VBAでWorksheetFunction.MATCH(WorksheetFunction.MIN( "A1:G1")、 "A1:G1"、0) –

関連する問題