0

エクセル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 を使用して、ユーザーに 1 つの情報を入力するように求めることができます。数が多すぎると、InputBox が煩雑になります。

ユーザーが情報を入力する必要があるスプレッドシート内の領域を作成し、その領域から読み取ることができます。それが今の設定方法です。asheet と tsheet という名前のセルを読み込んでいます。これらの名前付き範囲が存在する限り、コードは機能します。

最後に、ユーザーが入力する UserForm を作成できます。これは、1 つのフォームに多数の 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 に答える