2013-11-04 2 views
0

Excel VBA를 처음 사용합니다. 나는 사용자가 한 번에 여러 셀에 goalseek를 사용할 수 있도록 온라인에서 찾은 VBA 함수를 사용하려고합니다. 스프레드 시트에서 함수를 호출하려면 어떻게해야합니까? 함수의 변수 (예 : Taddr, Aaddr, gval)와 연결될 것으로 예상되는 셀을 가리키는 방법은 무엇입니까? 코드 자체에 셀 값과 범위를 써야하고 그런 식으로 실행해야합니까? 이 입력으로 이러한 변수를 발생하도록스프레드 시트에서 VBA 함수 및 변수 사용

어쩌면 I의 기능을 재정의한다, 그래서

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 
+0

잠시 시간을내어 http://www.wikihow.com/Create-a-User-Defined-Function-in-Microsoft-Excel을 검토하십시오. 변수까지 함수를 호출 할 때 변수를 전달합니다. – Sorceri

+0

변수를 전달하는 방법을 알고 있지만 위의 함수는 변수를 함수에 전달하지 않습니다. 이 함수를 사용하려면 수동으로 셀 값을 코드 – l3win

+1

에 입력해야하므로 해당 변수를 사용하여 함수에 매개 변수를 지정해야합니다. Sub GSeekA (Aaddr As String) – Sorceri

답변

1

GSeekA는 서브 프로시져 아닌 함수 = GSeekA (Taddr, Aaddr, gval)과 같은 식을 작성할 수있다 . Subprocedures는 함수와 같이 워크 시트 셀에서 호출 할 수 없습니다. 그리고 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 
+0

Thick for this Dick. 내 스프레드 시트에서 asheet, tsheet 등의 셀을 정의하려면 어떻게합니까? – l3win

+0

하위 프로 시저를 삽입 할 수 있어야합니다. Aaddr = 범위 ("I2 : I322") 값 Taddr = 범위 ("J2 : J322"). 코드의 값을 입력하고 실행하십시오. – l3win

+0

아니, 나는 그렇게 생각하지 않는다. Aaddr과 Taddr은 셀 참조처럼 보이는 문자열입니다. 필요한 것은 간단한 절차로 시작할 수 있습니다. 나는 내 대답을 업데이트하고있다. –

관련 문제