함수에서 셀 값 설정
셀의 내용물A1
이라=test(2)
어디에test
는 함수입니다.
Function test(ByRef x As Double) As Double
Range("A2") = x
test = x * x
End Function
이것이 왜 이것을 주는지 설명할 수 있습니까?#VALUE!
감방에서A1
그리고 감방에는 아무것도 없습니다.A2
나는 예상했습니다.A2
담다2
그리고.A1
담다4
라인없이Range("A2") = x
함수가 예상대로 작동합니다(셀 값 제곱).
정말 혼란스러운 것은 포장을 하면 됩니다.test
서브루틴으로calltest
그러면 작동합니다.
Sub calltest()
t = test(2)
Range("A1") = t
End Sub
Function test(ByRef x As Double) As Double
Range("A2") = x
test = x * x
End Function
하지만 이것은 그렇지 않습니다.
Function test(ByRef x As Double) As Double
Range("A2") = x
End Function
때문에Function
시트 셀을 변경하거나 설정할 수 없음을 나타내는 기본 사항.다음 행을 삭제해야 합니다.Range("A2") = x
편집 몇 가지 추가 링크(UDF 주제를 분석하려는 사람들에게 제공하는 데 항상 유용하다고 생각합니다):마이크로소프트에서 사용자 정의 함수 생성
예, 공식에 입력하는 셀뿐만 아니라 모든 셀에 값을 기록하는 사용자 정의 함수를 사용할 수 있습니다.
여기 간단한 예가 있습니다.UDF 함수는 두 인수 A와 B를 사용하고 해당 제품 A*B를 반환합니다.하지만 흥미로운 것은 우리가 공식을 입력한 세포의 바로 오른쪽에 인접한 세포에서 결과를 반환한다는 것입니다.
이 코드를 표준 VBA 모듈에 넣습니다.
Function UDF_RectangleArea(A As Integer, B As Integer)
Dim MagicSpell As String
MagicSpell = "Adjacent(" & Application.Caller.Offset(0, 1).Address(False, False) & "," & A & "," & B & ")"
Evaluate MagicSpell
UDF_RectangleArea = "Hello world"
End Function
Private Sub Adjacent(CellToChange As Range, A As Integer, B As Integer)
CellToChange = A * B
End Sub
이제 입력B2
공식:=UDF_RectangleArea(3,4)
함수는 결과를 두 개의 셀로 반환합니다. "Hello world"는B2
(놀랍지 않다) 및 직사각형 영역C2
(이것은 모자에서 나온 토끼입니다.)결과와 "토끼" 모양을 쉽게 사용자 지정할 수 있습니다.작업은 VBA EVALUALTE 명령으로 수행됩니다.변수 값MagicSpell
이 경우가 됩니다.Adjacent(C2,3,4)
UDF 결과가 반환되기 전에 UDF 내에서 발사됩니다.재미있게 보내!
워크시트 셀에서 함수를 호출할 때 사용자 정의 함수로 함수를 효과적으로 사용하고 있으며, 여기에는 다음과 같은 제한 사항이 있습니다.
http://support.microsoft.com/kb/170787
텍스트에 다음 행이 있습니다.
Visual Basic 서브루틴을 사용하여 환경을 변경해야 합니다.
그들이 꼭 해야만 하는 것보다 해야 한다는 단어를 어떻게 사용하는지 흥미롭습니다.저는 KB의 저자가 VBA 기능에서 환경 변화가 일어날 수 있다는 것을 알고 있었는지 궁금합니다.
이제 다른 VBA Sub/Function에서 함수를 호출하면 다르게 처리됩니다.도움말 문서에서 다음을 수행합니다(웹 페이지 참조를 찾을 수 없습니다. 기본적으로 VBE에서 Function이라는 단어를 강조 표시하고 F1을 누릅니다.).
하위 프로시저와 마찬가지로 함수 프로시저는 인수를 취하고 일련의 문을 수행하며 인수 값을 변경할 수 있는 별도의 프로시저입니다.그러나 하위 절차와 달리 함수에서 반환되는 값을 사용하려는 경우 Sqr, Cos 또는 Chr과 같은 고유 함수를 사용하는 것과 동일한 방식으로 식을 오른쪽에 있는 함수 절차를 사용할 수 있습니다.
따라서 함수가 호출 함수/하위로 값을 반환할 수 있다는 점을 제외하고는 VBA에서만 사용할 때 서브 및 함수가 동일한 작업을 수행할 수 있습니다.
사실 이것은 꽤 흥미롭습니다. 왜냐하면 엑셀은 엑셀의 환경에 일종의 "읽기 전용" 제한이 있는 함수를 호출할 수 있기 때문입니다.
결국 Excel은 VBA와는 다른 방식으로 워크시트 셀에서 함수를 호출할 수 있다고 생각합니다.Cell에서 호출하면 사용자 정의 함수로 간주되며, 여기에는 Excel의 환경 변경 제한이 포함됩니다.VBA 내에서 호출될 때(콜 체인의 원래 호출자가 VBA인 경우) 서브가 수행하는 모든 권한을 가지며 값을 반환할 수 있습니다.
저는 당신의 코드를 문자열과 함수, 그리고 그 사이의 다른 모든 것에 사용할 수 있도록 조정했습니다(아직 테스트 중입니다.
테스트 결과 많은 질문이 있지만 2가지가 먼저 떠오릅니다.
파라미터를 실행/처리하고 원하는 결과를 반환하기 위해 사용할 수 있는 다른 방법은 무엇입니까?
내가 b를 했듯이.제가 한 것처럼은 아닙니다(즉, 다르게 말입니다.
Rick Rothstein씨의 MVP와 SO의 다른 많은 사람들에게 감사드립니다.
Function MOVEME27(a As Variant, b As Variant, Optional CELLR As Variant, Optional cellq As Variant) '21/05/2018 works copied to ar4' 03/06/2019 23:30 was cellr as range , cellq as range - changed to variants
Dim WTVR1 As Variant '' ''20/05/2019'' '09/06/2019 Code by S Tzortzis/David Wooley
Dim WTVR2 As Variant
Dim P As String
Dim P1 As String
Dim bb As String
Dim bb1 As String
Dim A1 As Long
Dim A2 As Long
Dim c As String
'x' a = Evaluate(a)
P = Chr(34) & a & Chr(34)
P2 = Chr(34) & [P] & Chr(34)
bb = Chr(34) & b & Chr(34)
bb1 = Chr(34) & [bb] & Chr(34)
c = Chr(34) & CELLR & Chr(34)
f = Chr(34) & callq & Chr(34)
'P2 = Chr(34) & "'''" & [P] & "'''" & Chr(34)
'p1 = Chr(34) & p & Chr(34)
''WTVR1 = "MOVEUS1(" & Application.Caller.Offset(0, 2).Address(False, False) & "," & Chr(34) & P2 & Chr(34) & "," & b & ")"
WTVR1 = "MOVEUS11h(" & Application.Caller.Offset(0, 2).Address(False, False) & "," & [P2] & "," & [bb1] & ")"
Evaluate WTVR1
WTVR2 = "MOVEUS22h(" & Application.Caller.Offset(0, 1).Address(False, False) & "," & [P2] & "," & [bb1] & ")" ' used or be adjacent - maybe redo rhat pr put a GO TO sub. '' ''20/05/2019''
Evaluate WTVR2
A1 = cellq.Row
A2 = cellq.Column
CELLRR = Chr(34) & CELLR & Chr(34)
CELLRR1 = Chr(34) & [CELLRR] & Chr(34)
cellqq = Chr(34) & cellq & Chr(34)
cellqq1 = Chr(34) & [cellqq] & Chr(34)
''wtvr3 = "CopyFrom.Parent.Evaluate CopyOver234h(" & c & "," & f & ")" ''''20190531 1929
wtvr31 = "MOVEUS33h(" & Application.Caller.Offset(A1 - ActiveCell.Row + 1, A2 - ActiveCell.Column).Address(False, False) & "," & [CELLRR] & "," & [cellqq] & ")"
Evaluate wtvr31
MOVEME27 = "Hello world " & " / " & WTVR1 & " / " & WTVR2 & "\\\\\/////" & wtvr31 & "\\\\\/////---" & ActiveCell.Row - A1 & "//////---" & ActiveCell.Column - A2
' DO AS WHATVER = "MOVEUS3(" APPLICATION.CALLER.OFFSET(THE ROW & COLUMN IE CELL YOU REFERENCES IN a as variant (copy from)'
'with ="" in sub 30052019 19:28
'CopyFrom.Parent.Evaluate "CopyOver2(" & CELLR.Address(False, 1) & "," & CELLR.Address(False, False) & ")" ''''2019050 1929
End Function
Private Sub MOVEUS11h(CELL1 As Range, G1 As Variant, G2 As Variant)
'[ak333] = a
CELL1 = Chr(34) & G1 & Chr(34) & "B" & "//" & G2
End Sub
Private Sub MOVEUS22h(CELL2 As Range, G3 As Variant, G4 As Variant)
CELL2 = Chr(34) & G3 & Chr(34) & "<>" & G4
End Sub
'' with chr(34) arond the p's and a's in sub or fucntion changes behavior. thinking of doing if a is string, then a=x , x as string, if not kep as variant
''27/05/2019 :(
'''''30/05/2019 .....'''''''
'------------------------------------------------------------------------------- ADD THIS 30052019 -------------------------------
'private sub Movus3(cellfrom as range, cellto as range)
'End Sub
Private Sub moveus33h(cell3 As Range, CopyFrom As Variant, copyTo As Variant) ''''2019050 1929 ''' 03062019 change ema back to as Range here. :)
'' copyTo.Value = CopyFrom.Value ''''2019050 1929
''CopyFrom.Value = ""
cell3 = CopyFrom 'Chr(34) & CopyFrom & Chr(34)
End Sub ''''2019050 1929
언급URL : https://stackoverflow.com/questions/15659779/set-a-cell-value-from-a-function
'programing' 카테고리의 다른 글
pip 패키지에 대한 종속성 트리를 보여줄 수 있는 방법이 있습니까? (0) | 2023.06.29 |
---|---|
모바일 장치에서 로컬 호스트 웹 사이트 보기 (0) | 2023.06.29 |
스프링 부트 3마이크로미터 추적 예제 (0) | 2023.06.29 |
Firebase Crashlytics 사용자 지정 로그가 콘솔에 나타나지 않음 (0) | 2023.06.29 |
Git: 두 개의 다른 파일을 다른 분기로 분산시키는 방법은 무엇입니까? (0) | 2023.06.29 |