Excel数学工具自动化

时间:2015-03-12 09:03:00

标签: excel excel-vba vba

我为汽车应用设计了一个excel数学工具。该工具输入5个输入(1个数据组),并返回4个输出。问题是我有20000个数据集(每个数据集有5个输入),我需要为20000个数据集计算输出(每个数据集4个输出)。如果你们可以尝试帮助我,真的很感激。我真的很感激,如果有人可以一步一步解释我必须要做的事情。 或者换句话说,我有2个excel工作簿。一个是数学工具,另一个是数据表,其输入数据为20000套。我希望数学工具从数据表中调用输入数据,并将计算出的值返回到与输出相同的数据表。

1 个答案:

答案 0 :(得分:0)

根据您上一次评论的图片,我现在有一个像这样的TOOL.xlsm:

enter image description here

和这样的DATA.xlsx:

enter image description here

注意TOOL.xlsm的.xlsm,因为其中必须有宏。

然后我在TOOL.xlsm中有一个带有以下宏的模块:

Sub calculateInputRange()
 Dim oWBTOOL As Workbook, oWBDATA As Workbook
 Set oWBTOOL = ThisWorkbook
 Set oWBDATA = Workbooks("DATA.xlsx")
 'DATA.xlsx has to be open. TODO:Error handling if not

 oWBDATA.Activate
 Dim oInputRange As Range, oOutputStartRange As Range
 On Error Resume Next
 Set oInputRange = Application.InputBox("Select range with INPUT values", Type:=8)
 Set oOutputStartRange = Application.InputBox("Select start range for Output values", Type:=8)
 On Error GoTo 0
 If oInputRange Is Nothing Or oOutputStartRange Is Nothing Then Exit Sub

 Dim oRow As Range
 Dim i As Long
 For Each oRow In oInputRange.Rows
  oWBTOOL.Worksheets("INPUT|OUTPUT").Range("C3:C6").Value = WorksheetFunction.Transpose(oRow.Value)
  Calculate
  oOutputStartRange.Offset(i, 0).Value = oWBTOOL.Worksheets("INPUT|OUTPUT").Range("F3").Value
  oOutputStartRange.Offset(i, 1).Value = oWBTOOL.Worksheets("INPUT|OUTPUT").Range("F4").Value
  i = i + 1
 Next
End Sub

必须打开工作簿TOOL.xlsm和DATA.xlsx。

现在你可以运行宏了。它将首先询问具有INPUT值的范围。选择所有输入值,例如B4:E20。然后它会询问OUTPUT值的起始范围。例如,选择一个单元格H4。

宏从所选输入值逐行获取,并将这些值放在oWBTOOL.Worksheets("INPUT|OUTPUT").Range("C3:C6").Value中。然后计算并将oWBTOOL.Worksheets("INPUT|OUTPUT").Range("F3").Value...Range("F4").Value的结果值带入DATA.xlsx。

这就是您所描述的要求。但这并不是我所说的最好的解决方案。如果DATA.xlsx中的输入值发生更改,则结果值不会自动更改。您必须运行宏来选择更改的输入值和输出值的起始单元格。

考虑直接在VBA中进行“计算器”表中的计算。那么你可以在TOOL.xlsm中有一个用户定义函数(UDF),如下所示:

Public Function getResultsFromMyTool(inputs As Range) As Variant
 'inputs is a range
 Dim arr_inputs As Variant
 arr_inputs = inputs.Value
 'now arr_inputs is an array

 'get the single inputs from the array
 'we get only the case, that inputs was a range of cells in a row
 Dim i1 As Double, i2 As Double, i3 As Double, i4 As Double, i5 As Double
 i1 = arr_inputs(1, 1)
 i2 = arr_inputs(1, 2)
 i3 = arr_inputs(1, 3)
 i4 = arr_inputs(1, 4)

 'simply do here what your tool does with the inputs in sheet "calculator"
 Dim arr_outputs(0 To 3) As Double
 arr_outputs(0) = i1 + i3 / i4 - i2
 arr_outputs(1) = i2 * i3 / i2 + i4

 'return the output array
 getResultsFromMyTool = arr_outputs
End Function

在DATA.xlsx H4:I4中你简单地打电话:

{=TOOL.xlsm!getResultsFromMyTool(B4:E4)}

并根据需要向下填写。

每次运行工作表计算时,都会更新此UDF的结果,就像其他Excel公式一样。在我看来这会更好。