简体   繁体   中英

VBA- Need to create a function, which takes the range as input

I have a two dimensional table in Excel. eg.

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

Suppose the range of the table varies from B2:C6 (it can vary). I have to create a function, whose first job is to read this range( which would be a user defined input) and then stores the data into a 2 dimensional array such that I could use the data(integer) in the first column and the string in the second column, appropriately.

The first column is the resultant product index, while the second column is the blending products in the given ratio, which combine together to give the product in the first column.

Then there is another table:

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

I have to update the stock amount in this table after the data processing. For example, on combination of product 1 with product 3 in the ratio of 6:5 (units), 1 unit of product 5 is produced. So, I have to update the amount of stock for each of the products in table 2.

Any suggestions, how to convert the range into a 2 dimensional array?

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 

The main hurdle for me is to convert the range R1 (Table-1) into a 2 dimensional array. And then look from that array, the index of the output product, and locate that product in table-2 for updating the stock level.

Here is an example on how to work with 2D array. The function will break up the blending combination and extract the values that you want so that you can use those.

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

SNAPSHOT

在此输入图像描述

Once you have these values you can use .Find to search for the product index in the range R2 and then use .Offset to enter your formula.

I'm not sure if I understood the entire story, but this is what a function to return
a multidimensional array could look like:

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

A second option could be to declare the function to return a boolean and since arguments are standard sent byRef; you can declare the ranges and arrays in the main sub only, and convert them both at the same time in the function. I wouldn't choose for this option, because you wouldn't be able to re-use the function afterwards to convert other ranges into arrays.

Supplementary info: This technique works both ways. You can afterwards define a range and do:

set oRange = vArray

This on the condition that the Range has the same size as the array.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM