programing

엑셀 워크시트를 이름으로 참조하시겠습니까?

yellowcard 2023. 4. 15. 08:41
반응형

엑셀 워크시트를 이름으로 참조하시겠습니까?

변수에 문자열로 저장된 워크시트의 이름이 있습니다.이 워크시트에 대한 작업을 수행하려면 어떻게 해야 합니까?

이런 걸 해야겠다고 생각했어요

nameOfWorkSheet = "test"
ActiveWorkbook.Worksheets(nameOfWorkSheet).someOperation()

이걸 어떻게 끝내야 하죠?

시연 방법 사용, 포함, 변수 사용 등 여러 가지 옵션이 있습니다.

아래 옵션 4를 선호합니다.Dim활자의 변수Worksheet워크시트를 저장하고 변수에 있는 메서드를 호출하거나 함수에 전달하지만 모든 옵션이 작동합니다.

Sub Test()
  Dim SheetName As String
  Dim SearchText As String
  Dim FoundRange As Range

  SheetName = "test"      
  SearchText = "abc"

  ' 0. If you know the sheet is the ActiveSheet, you can use if directly.
  Set FoundRange = ActiveSheet.UsedRange.Find(What:=SearchText)
  ' Since I usually have a lot of Subs/Functions, I don't use this method often.
  ' If I do, I store it in a variable to make it easy to change in the future or
  ' to pass to functions, e.g.: Set MySheet = ActiveSheet
  ' If your methods need to work with multiple worksheets at the same time, using
  ' ActiveSheet probably isn't a good idea and you should just specify the sheets.

  ' 1. Using Sheets or Worksheets (Least efficient if repeating or calling multiple times)
  Set FoundRange = Sheets(SheetName).UsedRange.Find(What:=SearchText)
  Set FoundRange = Worksheets(SheetName).UsedRange.Find(What:=SearchText)

  ' 2. Using Named Sheet, i.e. Sheet1 (if Worksheet is named "Sheet1"). The
  ' sheet names use the title/name of the worksheet, however the name must
  ' be a valid VBA identifier (no spaces or special characters. Use the Object
  ' Browser to find the sheet names if it isn't obvious. (More efficient than #1)
  Set FoundRange = Sheet1.UsedRange.Find(What:=SearchText)

  ' 3. Using "With" (more efficient than #1)
  With Sheets(SheetName)
    Set FoundRange = .UsedRange.Find(What:=SearchText)
  End With
  ' or possibly...
  With Sheets(SheetName).UsedRange
    Set FoundRange = .Find(What:=SearchText)
  End With

  ' 4. Using Worksheet variable (more efficient than 1)
  Dim MySheet As Worksheet
  Set MySheet = Worksheets(SheetName)
  Set FoundRange = MySheet.UsedRange.Find(What:=SearchText)

  ' Calling a Function/Sub
  Test2 Sheets(SheetName) ' Option 1
  Test2 Sheet1 ' Option 2
  Test2 MySheet ' Option 4

End Sub

Sub Test2(TestSheet As Worksheet)
    Dim RowIndex As Long
    For RowIndex = 1 To TestSheet.UsedRange.Rows.Count
        If TestSheet.Cells(RowIndex, 1).Value = "SomeValue" Then
            ' Do something
        End If
    Next RowIndex
End Sub

가장 좋은 방법은 유형의 변수를 만드는 것입니다.Worksheet워크시트를 할당하여 VBA가 암묵적으로 사용할 때마다 사용합니다.ActiveSheet.

이렇게 하면 프로그램의 크기가 커질 때 나타나는 버그를 방지할 수 있습니다.

예를 들면...Range("A1:C10").Sort Key1:=Range("A2")매크로는 한 장에서만 작동해야 합니다.그러나 결국 매크로를 확장하여 여러 시트로 작업할 수 있게 되고, 이것이 작동하지 않는다는 것을 알게 됩니다.ShTest1.Range("A1:C10").Sort Key1:=Range("A2")...그리고 그것이 여전히 작동하지 않는다는 것을 알게 된다.

올바른 방법은 다음과 같습니다.

Dim ShTest1 As Worksheet
Set ShTest1 = Sheets("Test1")
ShTest1.Range("A1:C10").Sort Key1:=ShTest1.Range("A2")

Ryan의 답변에 대해 자세히 설명하자면, 변수를 선언할 때(Dim 사용) 아래 그림과 같이 VBE의 예측 텍스트 기능을 사용하여 약간의 부정행위를 할 수 있습니다. VBE 예측 텍스트 스크린샷

해당 목록에 표시되는 경우 해당 유형의 개체를 변수에 할당할 수 있습니다.따라서 Ryan이 지적한 것처럼 워크시트뿐만 아니라 차트, 범위, 워크북, 시리즈 등에도 사용할 수 있습니다.

이 변수를 조작할 개체와 동일하게 설정하면 이 예에서 Ryan이 지적한 것처럼 메서드를 호출하거나 함수 등에 전달할 수 있습니다.컬렉션 대 오브젝트(차트 또는 차트, 범위 또는 범위 등)에 관해 몇 가지 문제가 발생할 수 있지만 시행착오를 통해 확실하게 해결됩니다.

언급URL : https://stackoverflow.com/questions/9628690/reference-excel-worksheet-by-name

반응형