0

我是 Excel VBA 的新手。我正在尝试使用我在网上找到的 VBA 函数,该函数使用户能够一次在多个单元格上使用目标搜索。如何在电子表格中调用函数以及如何指向应该与函数中的变量相关联的单元格(例如 Taddr、Aaddr、gval)。我是否必须在代码本身中编写单元格值和范围并以这种方式运行?

也许我应该重新定义函数,以便将这些变量作为输入,这样我就可以编写一个像 =GSeekA(Taddr,Aaddr,gval) 这样的公式

Option Explicit

Sub GSeekA()
Dim ARange As Range, TRange As Range, Aaddr As String, Taddr As String, NumEq As Long, i As Long, j As Long
Dim TSheet As String, ASheet As String, NumRows As Long, NumCols As Long
Dim GVal As Double, Acell As Range, TCell As Range, Orient As String

    ' Create the following names in the back-solver worksheet:
    ' Taddr - Cell with the address of the target range
    ' Aaddr - Cell with the address of the range to be adjusted
    ' gval - the "goal" value
    ' To reference ranges on different sheets also add:
    ' TSheet - Cell with the sheet name of the target range
    ' ASheet - Cell with the sheet name of the range to be adjusted

    Aaddr = Range("aaddr").Value
    Taddr = Range("taddr").Value

    On Error GoTo NoSheetNames
    ASheet = Range("asheet").Value
    TSheet = Range("tsheet").Value

NoSheetNames:
    On Error GoTo ExitSub
    If ASheet = Empty Or TSheet = Empty Then
        Set ARange = Range(Aaddr)
        Set TRange = Range(Taddr)
    Else
        Set ARange = Worksheets(ASheet).Range(Aaddr)
        Set TRange = Worksheets(TSheet).Range(Taddr)
    End If

    NumRows = ARange.Rows.Count
    NumCols = ARange.Columns.Count

    GVal = Range("gval").Value

    For j = 1 To NumCols
        For i = 1 To NumRows
            TRange.Cells(i, j).GoalSeek Goal:=GVal, ChangingCell:=ARange.Cells(i, j)
        Next i
    Next j
ExitSub:
End Sub
4

1 回答 1

1

GSeekA 是一个子过程,而不是一个函数。不能像函数一样从工作表单元格调用子过程。而且您不想将 GSeekA 转换为函数。函数应该用于将值返回到调用它们的单元格。他们不应该(而且通常不能)更改工作表上的其他内容。

您需要将 GSeekA 作为子程序运行。现在问题变成了如何将用户提供的信息放入子中。您可以使用 InputBox 来提示用户输入一条信息。如果你有太多,InputBox 变得很麻烦。

您可以在电子表格中创建用户必须输入信息的区域,然后从该区域读取。现在就是这样设置的。它正在读取名为 asheet 和 tsheet 的单元格。只要存在这些命名范围,代码就可以工作。

最后,您可以创建一个用户将填写的用户表单。这就像在一个表单上放置一堆 InputBox。

更新这里有一个简单的过程,您可以开始并增强它。

Public Sub GSeekA()

    Dim rAdjust As Range
    Dim rTarget As Range
    Dim dGoal As Double
    Dim i As Long

    'Set these three lines to what you want
    Set rAdjust = Sheet1.Range("I2:I322")
    Set rTarget = Sheet1.Range("J2:J322")
    dGoal = 12.1

    For i = 1 To rAdjust.Count
        rTarget.Cells(i).GoalSeek dGoal, rAdjust.Cells(i)
    Next i

End Sub
于 2013-11-04T19:56:09.317 回答