2017-01-19 16 views
1

配列を理解しようとしていますが、コンセプトの周りを頭で覆うだけのことはできません。私は、次のデータセットを有する:VBA配列:MsgBoxの範囲、オフセット値、出力値の最小値を調べる

enter image description here

を私はそれが配列に値を供給した後、最小値を出力する場合、列Bの値がゼロより大きいことを確認するために、次のコードを書いメッセージボックスにマクロがある場合ので、私は、可変にアレイの上端を必要

  1. Sub MinFunc() 
    
    Dim ValLng(1 To 5) As Long, x As Long 
    
    x = 3 
    
    For i = 1 To 5 
        If Cells(x, 2).Value > 0 Then 
         ValLng(i) = Cells(x, 1).Value 
         Cells(x, 2).Value = Cells(x, 2).Value - 1 
         x = x + 1 
        End If 
    Next i 
    
    MsgBox (Application.WorksheetFunction.Min(ValLng)) 
    
    End Sub 
    

    今はコードを持つ2つの問題がありますいくつかの点で十分頻繁に実行すると、配列の上端は4、次に3などとなります。

  2. 最小値そのものを出力するのではなく、最小値に関連付けられたC列の値を出力したいと思います。私はメッセージボックスの値をオフセットしようとしましたが、成功しませんでした。

ポイント1とポイント2の達成方法を教えてください。

ありがとうございました!

+1

配列は、初めにサイズを定義したデータ構造です。より大きな配列が必要な場合は、新しいメモリを配置する必要があるため、新しい配列を作成する必要があります。 VBAでは、これを達成するために 'Redim'ステートメントを使用することができます。 2番目の質問では、 'Range.Offset'プロパティを見てください。 – dee

+0

よろしくお願いします。 –

答えて

1

必要なものは、動的サイズの配列を持つことです。

最初に、固定サイズを定義せずに配列を定義するには、Dim ValLng() As Variantを使用します。

第2、Redim初めに大きなサイズには、ReDim ValLng(0 To 1000)を使用してください。

第3に、Forループ内のすべての一致を配列に取り込んだ後、サイズを変更して配列を最適化するには、ReDim Preserve ValLng(0 To x - 1)を使用します。 Redim Preserveは、アレイの内部に値を保持していることを意味します。

次のコードは、あなたが始められるでしょう:

Option Explicit 

Sub MinFunc() 

Dim ValLng() As Variant, x As Long, i As Long 
Dim MinRes, RngFind As Range 

ReDim ValLng(0 To 1000) '<-- init dynamic array size to a very large value , will optimize later 
x = 3 

'-- just for example, loop until the last cell with data in Column B 
For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row 
    If Cells(x, 2).Value > 0 Then 
     ValLng(i) = Cells(x, 1).Value 
     Cells(x, 2).Value = Cells(x, 2).Value - 1 
     x = x + 1 
    End If 
Next i 

ReDim Preserve ValLng(0 To x - 1) '<-- resize array to actual size found 
MinRes = Application.WorksheetFunction.Min(ValLng) 

Set RngFind = Cells.Find(What:=MinRes, After:=Range("A1"), _ 
      LookIn:=xlValues, LookAt:=xlWhole) '<-- use find method 
Cells(RngFind.Row, 3) = MinRes '<-- put the Minimum value at column C at the same row 

End Sub 
+0

これはまさに私が探していたものでした。私を軌道に乗せてくれてありがとうShai! –

+0

@VBAPeteあなたは大歓迎です:) –

+0

Set RngFind = Cells.Find(What:= MinRes、After:= Range( "A1")、LookIn:= xlValues、LookAt:= xlWhole):どうすれば除外できますか列Bの0の値を持つseachからの値? –

関連する問題