VBA 열에 값이 있는지 확인합니다.
저는 500줄이 넘는 숫자의 열을 가지고 있습니다.변수 X가 열의 값과 일치하는지 확인하기 위해 VBA를 사용해야 합니다.
누가 저 좀 도와주실 수 있나요?
범위의 찾기 방법은 for 루프를 사용하여 모든 셀을 수동으로 순환하는 것보다 빠릅니다.
다음은 vba에서 찾기 방법을 사용하는 예입니다.
Sub Find_First()
Dim FindString As String
Dim Rng As Range
FindString = InputBox("Enter a Search value")
If Trim(FindString) <> "" Then
With Sheets("Sheet1").Range("A:A") 'searches all of column A
Set Rng = .Find(What:=FindString, _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not Rng Is Nothing Then
Application.Goto Rng, True 'value found
Else
MsgBox "Nothing found" 'value not found
End If
End With
End If
End Sub
가장 단순한 사용 방법Match
If Not IsError(Application.Match(ValueToSearchFor, RangeToSearchIn, 0)) Then
' String is in range
VBA 없이 이 작업을 수행하려면 다음과 같은 조합을 사용할 수 있습니다.IF
,ISERROR
,그리고.MATCH
.
따라서 모든 값이 열 A에 있으면 열 B에 다음 공식을 입력합니다.
=IF(ISERROR(MATCH(12345,A:A,0)),"Not Found","Value found on row " & MATCH(12345,A:A,0))
그러면 값 "12345"(셀 참조일 수도 있음)가 검색됩니다.값을 찾을 수 없으면,MATCH
"#N/A"를 반환하고ISERROR
그것을 잡으려고 노력합니다.
VBA를 사용하려면 FOR 루프를 사용하는 것이 가장 빠릅니다.
Sub FindMatchingValue()
Dim i as Integer, intValueToFind as integer
intValueToFind = 12345
For i = 1 to 500 ' Revise the 500 to include all of your values
If Cells(i,1).Value = intValueToFind then
MsgBox("Found value on row " & i)
Exit Sub
End If
Next i
' This MsgBox will only show if the loop completes with no success
MsgBox("Value not found in the range!")
End Sub
VBA에서 워크시트 함수를 사용할 수 있지만 워크시트 함수는 까다롭고 때로는 무의미한 오류를 발생시킵니다.그FOR
루프는 꽤 완벽합니다.
사용해 보십시오.
If Application.WorksheetFunction.CountIf(RangeToSearchIn, ValueToSearchFor) = 0 Then
Debug.Print "none"
End If
스콧의 답변을 함수로 수정하기 위해:
Function FindFirstInRange(FindString As String, RngIn As Range, Optional UseCase As Boolean = True, Optional UseWhole As Boolean = True) As Variant
Dim LookAtWhat As Integer
If UseWhole Then LookAtWhat = xlWhole Else LookAtWhat = xlPart
With RngIn
Set FindFirstInRange = .Find(What:=FindString, _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=LookAtWhat, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=UseCase)
If FindFirstInRange Is Nothing Then FindFirstInRange = False
End With
End Function
값을 찾을 수 없으면 FALSE를 반환하고, 값이 발견되면 범위를 반환합니다.
선택적으로 대소문자를 구분하거나 부분 단어 일치를 허용하도록 지정할 수 있습니다.
당신이 원한다면 그것을 미리 추가할 수 있기 때문에 제가 트림을 뺐습니다.
예:
MsgBox FindFirstInRange(StringToFind, Range("2:2"), TRUE, FALSE).Address
그러면 두 번째 행에서 대소문자를 구분하는 부분 단어 검색이 수행되고 주소가 있는 상자가 표시됩니다.다음은 동일한 검색이지만 대소문자를 구분하지 않는 전체 단어 검색입니다.
MsgBox FindFirstInRange(StringToFind, Range("2:2")).Address
이 기능을 원하는 대로 쉽게 조정하거나 변형에서 부울 또는 기타로 변경하여 속도를 조금 높일 수 있습니다.
VBA의 찾기는 때때로 브루트 포스 루프 또는 매치와 같은 다른 방법보다 느리기 때문에 VBA가 기본이라고 해서 가장 빠르다고 가정하지 마십시오.더 복잡하고 유연하기 때문에 항상 효율적이지는 않습니다.그리고 "Object variable or with block variable not set" 오류와 같이 주의해야 할 몇 가지 재미있는 특이점이 있습니다.
@JeffC가 @sdanse의 함수에서 언급한 문제 해결:
Function FindFirstInRange(FindString As String, RngIn As Range, Optional UseCase As Boolean = True, Optional UseWhole As Boolean = True) As Variant
Dim LookAtWhat As Integer
If UseWhole Then LookAtWhat = xlWhole Else LookAtWhat = xlPart
With RngIn
Set FindFirstInRange = .Find(What:=FindString, _
After:=.Cells(.Cells.Count), _
LookIn:=xlValues, _
LookAt:=LookAtWhat, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=UseCase)
If FindFirstInRange Is Nothing Then
FindFirstInRange = False
Exit Function
End If
If IsEmpty(FindFirstInRange) Then
FindFirstInRange = False
Else
FindFirstInRange = True
End If
End With
End Function
워크시트 함수 추가 시도:
If Not IsError(Application.WorksheetFunction.Match(ValueToSearchFor, RangeToSearchIn, 0)) Then
' String is in range
=IF(COUNTIF($C$2:$C$500,A2)>0,"Exist","Not Exists")
언급URL : https://stackoverflow.com/questions/12642164/check-if-value-exists-in-column-in-vba
'programing' 카테고리의 다른 글
Git에 단계별 변경 사항만 저장하려면 어떻게 해야 합니까? (0) | 2023.05.16 |
---|---|
grep을 사용하여 폴더 내에서 단어를 찾으려면 어떻게 해야 합니까? (0) | 2023.05.16 |
MongoDB에서 커서란 무엇입니까? (0) | 2023.05.16 |
Bash에서 변수로 정의된 숫자 범위에서 반복하는 방법은 무엇입니까? (0) | 2023.05.16 |
WPF의 app.config에서 값 목록 모음을 가져오는 방법은 무엇입니까? (0) | 2023.05.11 |