워크시트에서 셀을 검색하여 Dictionary 개체에 축적하는 함수

4591 단어 VBAExcelExcelVBA

FindCells 함수 설명



아래에 표시된 프로그램 FindCells 함수는 인수 워크시트 TargetWorksheet의 모든 셀을 대상으로 문자열 SearchText와 정확히 일치하는 셀을 검색하여 Dictionary 객체로 함께 반환합니다.

검색할 셀이 발견되면 셀 주소를 키로, 셀의 Range 객체를 Item으로 Dictionary 객체에 추가합니다. Count 속성의 값은 발견된 셀 수입니다.

표준 모듈
' TargetWorksheet内の全てのセルを対象に、SearchTextと完全一致するセルを検索する
' 戻り値のDictionaryオブジェクトは、KeyがセルのアドレスでItemがRangeオブジェクトの集合
' セルが見つからない場合は空(Count = 0)のDictionaryオブジェクトとなる
Function FindCells(ByRef TargetWorksheet As Worksheet, ByRef SearchText As String) As Dictionary

  Dim FoundCell As Range

  Set FindCells = New Dictionary

  ' TargetWorksheet内でSearchTextと完全一致する最初のセルを探す
  Set FoundCell = TargetWorksheet.Cells.Find(What:=SearchText, LookIn:=xlValues, LookAt:=xlWhole)

  ' セルが見つかった場合は2つ目以降を探す
  If Not FoundCell Is Nothing Then
    Do
      If Not FindCells.Exists(FoundCell.Address) Then
        FindCells.Add FoundCell.Address, FoundCell
        ' FindNextはセルを探し終わると最初のセルに戻って検索し続ける
        Set FoundCell = TargetWorksheet.Cells.FindNext(FoundCell)
      Else
        Exit Do
      End If
    Loop
  End If

  Set FoundCell = Nothing

End Function

Dictionary 객체를 사용하기 위한 참조 설정



Dictionary 객체를 사용하기 때문에 VBA IDE (Excel 통합 문서에서 Alt + F11에서 열기 화면)의 ツール > 参照設定를 클릭하여 Microsoft Scripting Runtime을 선택합니다. 만약 새 통합 문서를 만들면 참조 설정도 초기화되므로 사용하려는 라이브러리는 통합 문서 단위로 참조 설정을 해야 합니다.



Microsoft Scripting Runtime을 참조하지 않으면 "컴파일 오류: 사용자 정의 형식이 정의되지 않았습니다"라는 오류가 발생합니다.



FindCells 함수 사용법



이 FindCells 함수의 사용법을 설명합니다.

이제 시트 이름 Sheet1의 워크 시트에 "검색 테스트"라는 값의 셀을 세 개 준비했습니다. 셀의 주소는 B2, C11, E6입니다.



따라서 이러한 셀을 검색하려면 FindCells 함수를 다음과 같이 사용합니다.

표준 모듈
Sub Test_FindCells()

  Dim FoundCellSet As Dictionary
  Dim CellAddress  As Variant

  Set FoundCellSet = FindCells(ThisWorkbook.Sheets("Sheet1"), "検索テスト")

  ' 見つかったセルのワークシート名とアドレスを表示する
  For Each CellAddress In FoundCellSet
    Debug.Print FoundCellSet(CellAddress).Worksheet.Name, FoundCellSet(CellAddress).Address
  Next

  Set FoundCellSet = Nothing

End Sub

실행 후 출력을 캡처했습니다.



Dictionary 객체는 매우 편리하지만 그대로는 인텔리센스가 작동하지 않습니다. 예를 들어, 위의 테스트라면 발견된 셀은 FoundCellSet(CellAddress) 가 객체가 되고 있는데, FoundCellSet(CellAddress). 라고 해도 Range 객체의 메서드와 속성이 표시되지 않습니다.

인텔리센스가 작동하려면 Dictionary 객체의 멤버를 다음과 같이 Range 객체로 다시 설정합니다.

표준 모듈
Sub Test_FindCells2()

  Dim FoundCellSet As Dictionary
  Dim CellAddress  As Variant
  Dim FoundCell    As Range

  Set FoundCellSet = FindCells(ThisWorkbook.Sheets("Sheet1"), "検索テスト")

  ' 見つかったセルのワークシート名とアドレスを表示する
  For Each CellAddress In FoundCellSet
    Set FoundCell = FoundCellSet(CellAddress)
    Debug.Print FoundCell.Row
  Next

  Set FoundCellSet = Nothing

End Sub

이렇게 하면 IntelliSense가 작동합니다.



와일드카드로 입력이 있는 셀 모두 검색


Set FoundCellSet = FindCells(Sheet1, "*")

그러면 워크시트 1 Sheet1 내의 입력이 있는 모든 셀을 검색할 수 있습니다.

Dictionary 객체 정보



Dictionary 객체에 대한 좋은 설명은 웹에 특별히 없다고 생각하지만 Dictionary 개체 - Microsoft MSDN에 약간의 설명이 있습니다.

그리고, Dictionary 객체를 사용하고 있으면(자) 대량의 데이터를 축적하는 일도 있다고 생각합니다. 사용이 끝나면 Set object = Nothing를 잊지 않고 쓰지 않으면 메모리 릴리스되지 않으므로 주의가 필요합니다. 나는 Set object = Nothing을 작성하지 않으면 메모리가 릴리스되지 않습니다. - KOSUKE MAEDA에 쓴 것처럼 실패했습니다.

좋은 웹페이지 즐겨찾기