简体   繁体   English

VBA-需要创建一个函数,它将范围作为输入

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

I have a two dimensional table in Excel. 我在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). 假设表的范围从B2:C6变化(它可以变化)。 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. 例如,在产物1与产物3以6:5(单位)的比例组合时,产生1单位产物5。 So, I have to update the amount of stock for each of the products in table 2. 因此,我必须更新表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. 对我来说,主要障碍是将范围R1(表-1)转换为二维数组。 And then look from that array, the index of the output product, and locate that product in table-2 for updating the stock level. 然后从该数组中查看输出产品的索引,并在表2中找到该产品以更新库存水平。

Here is an example on how to work with 2D array. 以下是如何使用2D数组的示例。 The function will break up the blending combination and extract the values that you want so that you can use those. 该函数将分解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

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. 获得这些值后,您可以使用.FindR2范围内搜索product index ,然后使用.Offset输入公式。

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; 第二个选项可能是声明函数返回一个布尔值,因为参数是标准发送的byRef; you can declare the ranges and arrays in the main sub only, and convert them both at the same time in the function. 你可以只在main sub中声明范围和数组,并在函数中同时转换它们。 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. 这是在Range与数组大小相同的条件下。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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