programing

vba는 셀 그룹을 기능 범위로 전달합니다.

muds 2023. 6. 10. 09:50
반응형

vba는 셀 그룹을 기능 범위로 전달합니다.

저는 세포 그룹을 모아서 아래의 기능에 대해 몇 가지 계산을 하고 있습니다.

범위(와 함께)를 통과하면 작동합니다.:sign)을 첫 번째 매개 변수로 사용하지만 일부 셀을 범위로 선택하면 실패합니다(A1, A3, B6, B9첫 번째 매개 변수로 쉼표 앞의 첫 번째 셀만 가져옵니다.하지만 난 세포 전체를 원해요.

어떻게 해야 합니까? (범위 전달에 문자열 사용 제외)

Function calculateIt(Sessions As Range, Customers As Range) As Single
    ' calculate them...
End Function

한 가지 더:범위 그룹을 매개 변수로 전달하는 것이 가능합니까? 어떻게 합니까?

작성된 대로 함수는 두 개의 범위만 인수로 허용합니다.

변수 개수의 범위가 함수에 사용되도록 하려면 인수 목록에 ParamArray 변형 배열을 선언해야 합니다.그런 다음 배열의 각 범위를 차례로 처리할 수 있습니다.

예를들면,

Function myAdd(Arg1 As Range, ParamArray Args2() As Variant) As Double
    Dim elem As Variant
    Dim i As Long
    For Each elem In Arg1
        myAdd = myAdd + elem.Value
    Next elem
    For i = LBound(Args2) To UBound(Args2)
        For Each elem In Args2(i)
            myAdd = myAdd + elem.Value
        Next elem
    Next i
End Function

그러면 이 함수를 워크시트에서 사용하여 여러 범위를 추가할 수 있습니다.

myAdd 사용법

기능의 경우 기능에 전달할 수 있는 범위(또는 셀)가 '세션'이고 '고객'인지에 대한 질문이 있습니다.

첫 번째 범위를 세션으로 결정하고 이후 범위를 고객으로 결정하는 경우가 가장 쉽게 처리할 수 있습니다.

Function calculateIt(Sessions As Range, ParamArray Customers() As Variant) As Double
    'This function accepts a single Sessions range and one or more Customers
    'ranges
    Dim i As Long
    Dim sessElem As Variant
    Dim custElem As Variant
    For Each sessElem In Sessions
        'do something with sessElem.Value, the value of each
        'cell in the single range Sessions
        Debug.Print "sessElem: " & sessElem.Value
    Next sessElem
    'loop through each of the one or more ranges in Customers()
    For i = LBound(Customers) To UBound(Customers)
        'loop through the cells in the range Customers(i)
        For Each custElem In Customers(i)
            'do something with custElem.Value, the value of
            'each cell in the range Customers(i)
            Debug.Print "custElem: " & custElem.Value
         Next custElem
    Next i
End Function

세션 범위와 고객 범위를 모두 포함하려면 세션 범위와 고객 범위를 구분할 수 있도록 기능을 알려주는 인수를 포함해야 합니다.

이 인수는 다음 인수 중 세션 범위가 몇 개인지 식별하는 함수의 첫 번째 숫자 인수로 설정할 수 있으며 나머지 인수는 암시적으로 고객 범위입니다.함수의 서명은 다음과 같습니다.

Function calculateIt(numOfSessionRanges, ParamAray Args() As Variant)

또는 세션 범위와 고객 범위를 구분하는 "guard" 인수일 수 있습니다.그런 다음 코드는 각 인수를 테스트하여 가드인지 확인해야 합니다.기능은 다음과 같습니다.

Function calculateIt(ParamArray Args() As Variant)

아마도 다음과 같은 전화가 있을 것입니다.

calculateIt(sessRange1,sessRange2,...,"|",custRange1,custRange2,...)

그러면 프로그램 논리는 다음과 같이 될 수 있습니다.

Function calculateIt(ParamArray Args() As Variant) As Double
   ...
   'loop through Args
   IsSessionArg = True
   For i = lbound(Args) to UBound(Args)
       'only need to check for the type of the argument
       If TypeName(Args(i)) = "String" Then
          IsSessionArg = False
       ElseIf IsSessionArg Then
          'process Args(i) as Session range
       Else
          'process Args(i) as Customer range
       End if
   Next i
   calculateIt = <somevalue>
End Function

한 기능에 여러 범위를 전달하는 또 다른 방법이 있는데, 사용자에게 훨씬 더 깨끗하다고 생각합니다.스프레드시트에서 함수를 호출하면 다음과 같이 각 범위 집합을 괄호로 묶습니다.calculateIt( (A1,A3), (B6,B9) )

위의 통화에서는 두 개의 세션이 A1과 A3에 있고 두 개의 고객이 B6와 B9에 있다고 가정합니다.

이 기능이 작동하려면 각 기능을 반복해야 합니다.Areas입력 범위에 있습니다.예:

Function calculateIt(Sessions As Range, Customers As Range) As Single

    ' check we passed the same number of areas
    If (Sessions.Areas.Count <> Customers.Areas.Count) Then
        calculateIt = CVErr(xlErrNA)
        Exit Function
    End If

    Dim mySession, myCustomers As Range

    ' run through each area and calculate
    For a = 1 To Sessions.Areas.Count

        Set mySession = Sessions.Areas(a)
        Set myCustomers = Customers.Areas(a)

        ' calculate them...
    Next a

End Function

이 두 범위로 , 로 이 수 를 들어, 좋점은범만, 입두연있가다면고신당, 일것이함있당다호수것니입는다할출를수이반적신인로은지과마가찬은인지적위속로을력약의신개이당▁just▁the▁this▁function,▁as,▁e다것▁your▁if▁you니▁call입▁is▁nice는있다▁you▁thing▁can▁both▁ag▁one▁you▁inputs▁normal▁as수▁have좋은▁a▁would할▁contig▁rangeuous 예를 들어,calculateIt(A1:A3, B6:B9).

도움이 되길 바랍니다 :)

저는 vba 초보자이기 때문에 모든 뛰어난 내장 기능이 어떻게 작동하는지 vba에 대한 깊은 지식을 그곳에서 얻고 싶습니다.

그래서 위의 질문에 저는 저의 기본적인 노력을 기울였습니다.

Function multi_add(a As Range, ParamArray b() As Variant) As Double

    Dim ele As Variant

    Dim i As Long

    For Each ele In a
        multi_add = a + ele.Value **- a**
    Next ele

    For i = LBound(b) To UBound(b)
        For Each ele In b(i)
            multi_add = multi_add + ele.Value
        Next ele
    Next i

End Function

a: 카운트 자체가 두 배가 되기 때문에 위의 코드에 대해 이 값을 빼면 첫 번째 값이 두 번 추가됩니다.

저는 @Ian S에서 영감을 받아 더 좋은 기능을 썼습니다.

' Similar to SUMPRODUCT, but it works with non consecutive cells also, multiplying the price, in the first column, with
' the correspondent rate exchange of the second column.
' Usage:
' SUMCURRENCIES(D6:D10,E6:E10) will multiply D6 by E6, D7 by E7, and so on, finally sum all the multiplications.
' SUMCURRENCIES((D113,D117),(E113,E117)) instead will multiply D113 by E113 first, and then will add the result of D117 * E117.
Function SUMCURRENCIES(Prices As Range, ExchangeRates As Range) As Double

    ' Check if we passed the same number of areas.
    If (Prices.Areas.Count <> ExchangeRates.Areas.Count) Then
        SUMCURRENCIES = CVErr(xlErrNA)
        Exit Function
    End If

    Dim Price, ExchangeRate As Range
    Dim AreasCount, PricesCount As Integer
    
    Total = 0
    
    ' Runs through each area and multiple the value for the exchange rate.
    AreasCount = Prices.Areas.Count
    For i = 1 To AreasCount
        Set Price = Prices.Areas(i)
        Set ExchangeRate = ExchangeRates.Areas(i)
    
        If VarType(Price.Value2) = VBA.VbVarType.vbDouble Then
            Total = Price * ExchangeRate + Total
        Else
            PricesCount = Prices.Count
            For j = 1 To PricesCount
                Total = Prices(j).Value * ExchangeRates(j).Value + Total
            Next j
        End If
    Next i
    
    SUMCURRENCIES = Total
End Function

언급URL : https://stackoverflow.com/questions/18168151/vba-pass-a-group-of-cells-as-range-to-function

반응형