그래서 기본적으로 조건을 검사 할 수식을 작성하고 조건이 충족되면 다른 셀에 특정 텍스트 줄을 붙여 넣기를 원합니다. 값을 붙여 넣으려는 셀에 수식이 존재하기를 원하지 않습니다. 예를 들어 B5에 값을 붙여 넣으려는 경우 셀 B5에 수식을 넣지 않으려 고합니다.
그래서 기본적으로 조건을 검사 할 수식을 작성하고 조건이 충족되면 다른 셀에 특정 텍스트 줄을 붙여 넣기를 원합니다. 값을 붙여 넣으려는 셀에 수식이 존재하기를 원하지 않습니다. 예를 들어 B5에 값을 붙여 넣으려는 경우 셀 B5에 수식을 넣지 않으려 고합니다.
답변:
다음 방법은 설명 된 해결 방법을 사용합니다. 이리 과 이리 VBA에 정의 된 워크 시트 함수를 사용하여 다른 셀의 값을 설정할 수 있습니다.
사용자 정의 함수는 대상 변수의 주소와 해당 셀을 설정할 값을 전역 변수에 저장합니다. 그런 다음 워크 시트가 다시 계산 될 때 트리거되는 매크로는 전역 변수를 읽고 대상 셀을 지정된 값으로 설정합니다.
사용자 정의 함수의 사용은 간단합니다.
=SetCellValue(target_cell, value)
어디에 target_cell
워크 시트의 셀에 대한 문자열 참조 (예 : 'A1') 또는 그러한 참조로 평가되는 표현식입니다. 여기에는 다음과 같은 표현식이 포함됩니다. =B14
여기서 B14의 값은 "A1"입니다. 함수는 유효한 표현식에서 사용될 수 있습니다.
SetCellValue
값이 대상 셀에 성공적으로 기록되면 1을 반환하고 그렇지 않으면 0을 반환합니다. 대상 셀의 이전 내용을 덮어 씁니다.
세 가지 코드가 필요합니다.
SetCellValue
그 자체 IsCellAddress
보장하기 위해 target_cell
유효한 셀 주소입니다. 이 코드는 통합 문서에 삽입 된 표준 모듈에 붙여 넣어 야합니다. 이 모듈은 Visual Basic 편집기의 메뉴를 통해 삽입 할 수 있습니다. Visual Basic
~로부터 Developer
탭의 탭.
Option Explicit
Public triggerIt As Boolean
Public theTarget As String
Public theValue As Variant
Function SetCellValue(aCellAddress As String, aValue As Variant) As Long
If (IsCellAddress(aCellAddress)) And _
(Replace(Application.Caller.Address, "$", "") <> _
Replace(UCase(aCellAddress), "$", "")) Then
triggerIt = True
theTarget = aCellAddress
theValue = aValue
SetCellValue = 1
Else
triggerIt = False
SetCellValue = 0
End If
End Function
이 코드는 사용할 워크 시트의 코드에 포함되어야합니다. SetCellValue
. 가장 쉬운 방법은 워크 시트의 탭을 마우스 오른쪽 버튼으로 클릭하는 것입니다. Home
보기, 선택 View Code
그런 다음 편집기 창에 코드를 붙여 넣습니다.
Private Sub Worksheet_Calculate()
If Not triggerIt Then
Exit Sub
End If
triggerIt = False
On Error GoTo CleanUp
Application.EnableEvents = False
Range(theTarget).Value = theValue
CleanUp:
Application.EnableEvents = True
Application.Calculate
End Sub
이 코드는 동일한 모듈에 붙여 넣을 수 있습니다. SetCellValue
암호.
Function IsCellAddress(aValue As Variant) As Boolean
IsCellAddress = False
Dim rng As Range ' Input is valid cell reference if it can be
On Error GoTo GetOut ' assigned to range variable
Set rng = Range(aValue)
On Error GoTo 0
Dim colonPos As Long 'convert single cell "range" address to
colonPos = InStr(aValue, ":") 'single cell reference ("A1:A1" -> "A1")
If (colonPos <> 0) Then
If (Left(aValue, colonPos - 1) = _
Right(aValue, Len(aValue) - colonPos)) Then
aValue = Left(aValue, colonPos - 1)
End If
End If
If (rng.Rows.Count = 1) And _
(rng.Columns.Count = 1) And _
(InStr(aValue, "!") = 0) And _
(InStr(aValue, ":") = 0) Then
IsCellAddress = True
End If 'must be single cell address in this worksheet
Exit Function
GetOut:
End Function
Application.Calculate
전에 Application.EnableEvents = True
? 그렇지 않으면 함수가 94 번 계산됩니다.
셀 B5에 "green"값이 포함되어 있으면 텍스트 "텍스트 A"를 셀 C5에 표시한다고 가정합니다.
당신 양철통 수식 접근 방식을 사용하지만 수식은 다른 셀의 값을 변경할 수 없으므로 수식을 C5 셀에 입력해야합니다.
=IF(ISNUMBER(FIND("green",B5)),"Text A","")
B5에 "녹색"이라는 단어가 포함되어 있으면 셀 C5에 "텍스트 A"만 표시됩니다.
이와 같은 공식은 많은 조건에서 작동하도록 구축 될 수 있습니다. 특정 상황에 대한 도움을 얻으려면 요구 사항을 정의해야합니다.
C5에 수식을 포함시키지 않으려면 VBA 방식을 사용할 수도 있습니다. 수작업으로 값을 편집하거나 셀 B5를 붙여 넣을 때 셀 B5가 변경 될 때마다 실행되는 워크 시트 변경 이벤트를 실행할 수 있습니다.
그러한 매크로의 예는 다음과 같습니다.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B5")) Is Nothing Then
If InStr(1, Target, "green", vbTextCompare) Then
Target.Offset(0, 1) = "Text A"
End If
End If
End Sub
산출물의 조건과 배치는 단지 예일 뿐이며 요구 사항에 맞게 조정해야합니다.
수식과 매크로 접근 방식의 차이점은 다음과 같습니다.
참고 : 위의 내용은 단지 하나의 예일뿐입니다. 숫자 나 텍스트를 평가할 것인지 여부, 평가가 대소 문자를 구분하는지 여부, 평가 규칙이 무엇인지, 결과를 배치 할 위치 등 요구 사항을 정의해야합니다.