2

Excel で 2 次元のテーブルを作成しています。例えば。

outputproduct      blending combination
**5                P1:0.6/P3:0.5**
  2                P1:0.3/P2:0.7
  4                P5:0.4/P2:0.7
  7                P11:0.7/P7:0.4

テーブルの範囲が B2:C6 から変化するとします (変化する可能性があります)。関数を作成する必要があります。その最初の仕事は、この範囲 (ユーザー定義の入力) を読み取り、データを 2 次元配列に格納して、最初の列でデータ (整数) を使用できるようにすることです。 2 列目の文字列を適切に指定します。

最初の列は結果の製品インデックスであり、2 番目の列は指定された比率で混合された製品であり、それらが組み合わされて最初の列の製品が得られます。

次に、別のテーブルがあります。

product index      current stock    updated stock
      **1**             **10**
        2                 20 
      **3**             **50**
        4                 15
      **5**             **100**
        .                 .
        .                 .
        .                 .

データ処理後、このテーブルの在庫量を更新する必要があります。たとえば、製品 1 と製品 3 を 6:5 (単位) の比率で組み合わせると、製品 5 が 1 単位生成されます。そのため、表 2 の各製品の在庫量を更新する必要があります。

範囲を2次元配列に変換する方法はありますか?

Public Function Blending_function( R1 as Range, R2 as Range)
 ' R2 is the range of table 2, where the updating is to be done
 ' R1 is first stored in to a 2 dimensional array, such that the data in the
 ' column 1 could be read, and the data in the column 2 could be read (of table 1).
 ' the integer in the column 1 of table 1 refers to the product index in table 2.
 ' P(i) stands for the ith product. In first row of table-1, P1 and P3 combine in the 
 ' ratio of 6:5 to give P5. The current stock of each product is provide in table-2,
 ' whose range is R2(entire table 2).

 ' R1 is the range of table 1, from where the processing is to be done


End Function 

私にとっての主なハードルは、範囲 R1 (表 1) を 2 次元配列に変換することです。次に、その配列、出力製品のインデックスを調べて、在庫レベルを更新するためにテーブル 2 でその製品を見つけます。

4

3 に答える 3

3

これは、2D 配列を操作する方法の例です。この関数はblending combination、必要な値を分割して抽出し、それらを使用できるようにします。

Sub Sample()
    Dim Rng1 As Range, Rng2 As Range

    On Error Resume Next
    Set Rng1 = Application.InputBox("Please select the Table1 Range", Type:=8)
    On Error GoTo 0

    If Rng1.Columns.Count <> 2 Then
        MsgBox "Please select a range which is 2 columns wide"
        Exit Sub
    End If

    On Error Resume Next
    Set Rng2 = Application.InputBox("Please select the Table2 Range", Type:=8)
    On Error GoTo 0

    If Rng2.Columns.Count <> 3 Then
        MsgBox "Please select a range which is 3 columns wide"
        Exit Sub
    End If

    Blending_function Rng1, Rng2

End Sub

Public Function Blending_function(R1 As Range, R2 As Range)
    Dim MyAr1 As Variant, MyAr2 As Variant
    Dim i As Long
    Dim blndCom As String, OutputPrd As String
    Dim ArP1() As String, ArP2() As String, tmpAr() As String

    MyAr1 = R1

    For i = 2 To UBound(MyAr1, 1)
        OutputPrd = MyAr1(i, 1)
        blndCom = MyAr1(i, 2)
        tmpAr = Split(blndCom, "/")

        ArP1 = Split(tmpAr(0), ":")
        ArP2 = Split(tmpAr(1), ":")

        Debug.Print OutputPrd
        Debug.Print Trim(ArP1(0))
        Debug.Print ArP1(1)
        Debug.Print ArP2(0)
        Debug.Print ArP2(1)
        Debug.Print "-------"
    Next
End Function

スナップショット

ここに画像の説明を入力

これらの値を取得したら、使用して範囲内.Findを検索し、を使用して数式を入力できます。product indexR2.Offset

于 2012-07-10T10:21:01.300 に答える
1

話全体を理解したかどうかはわかりませんが
、多次元配列を返す関数は次のようになります。

Public Sub Main_Sub()

Dim vArray_R1()                     As Variant
Dim oRange                          As Range


Set oRange = ThisWorkbook.Sheets(1).Range("A1:B5")
vArray_R1 = Blending_function(oRange)
'You do the same for The second array.     

set oRange = nothing

End Sub

Public Function Blending_function(R1 As Range)

 Dim iRange_Cols As Integer
 Dim iRange_Rows As Integer


iRange_Cols = R1.Columns.Count
iRange_Rows = R1.Rows.Count

'Set size of the array (an existing array would be cleared)
ReDim vArray(1 To iRange_Rows, 1 To iRange_Cols)

vArray = R1
Blending_function = vArray

End Function

2 番目のオプションは、boolean を返す関数を宣言することです。引数は標準で Ref; によって送信されるためです。メインサブのみで範囲と配列を宣言し、関数で同時に両方を変換できます。後で関数を再利用して他の範囲を配列に変換することができないため、このオプションは選択しません。

補足情報: この手法は両方の方法で機能します。後で範囲を定義して、次のことを行うことができます。

set oRange = vArray

これは、Range が配列と同じサイズであることが条件です。

于 2012-07-10T07:08:44.863 に答える
0
row = 2
column = "B"
Do While Len(Range(column & row).Formula) > 0
    ' repeat until first empty cell in column 'column'(user input)
    ' read (column, row) and (column+1, row) value
     Cells(row, column).Value
     Cells(row, column+1).value
    ' store in Array
Loop
于 2012-07-10T07:06:11.160 に答える