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
그러면 이 함수를 워크시트에서 사용하여 여러 범위를 추가할 수 있습니다.
기능의 경우 기능에 전달할 수 있는 범위(또는 셀)가 '세션'이고 '고객'인지에 대한 질문이 있습니다.
첫 번째 범위를 세션으로 결정하고 이후 범위를 고객으로 결정하는 경우가 가장 쉽게 처리할 수 있습니다.
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
'programing' 카테고리의 다른 글
AWS API 게이트웨이 메서드 응답에 대한 유형 스크립트에서 AWS 람다 응답과 함께 반환되는 유형은 무엇입니까? (0) | 2023.06.10 |
---|---|
ASP.NEC#에 각각 대해 CheckBoxList에서 선택한 항목의 값을 가져오는 방법은 무엇입니까? (0) | 2023.06.10 |
클래스의 Python 장식가 (0) | 2023.06.10 |
소스 파일에도 'external C'를 추가해야 합니까? (0) | 2023.06.10 |
Oracle의 SEQUENCE.NEXTVAL에 해당하는 MySQL (0) | 2023.06.10 |