programing

Excel 탭 시트 이름과Visual Basic 시트 이름

minimums 2023. 4. 13. 20:42
반응형

Excel 탭 시트 이름과Visual Basic 시트 이름

Visual Basic은 사용자가 수정한 시트명에 따라 시트를 참조할 수 없는 것 같습니다.워크시트 탭은 이름을 변경할 수 있지만 Visual Basic은 워크시트 탭이 유용한 것으로 변경되었음에도 불구하고 여전히 워크시트 이름을 Sheet1 등으로 생각하는 것 같습니다.

이거 있어요.

TABname = rng.Worksheet.Name  ' Excel sheet TAB name, not VSB Sheetx name.

Visual Basic 루틴에서는 시트명을 사용하고 싶습니다.제가 할 수 있는 최선의 방법은 워크시트 탭과 워크시트 탭을 선택하는 것입니다.비주얼 베이직 이름들 때문에 기분이 안 좋아

Visual Basic은 Sheet1, Sheet2 등의 이름을 알고 있어야 합니다.새로운 시트 또는 시트 탭의 이름을 변경할 때마다 달라지는 룩업 테이블을 유지할 필요가 없도록 이러한 이름을 Excel 탭 이름과 연결하려면 어떻게 해야 합니까?

Excel 개체 모델에서 워크시트에는 두 가지 다른 이름 속성이 있습니다.

이름. 이름.
「.

Name 속성은 읽기/쓰기이며 시트 탭에 나타나는 이름을 포함합니다.사용자 및 VBA 변경 가능

CodeName 속성이 읽기 전용입니다.

특정 시트를 워크시트("Fred")로 참조할 수 있습니다.범위("A1")는 Fred 입니다.속성 이름 또는 Sheet1로 지정합니다.범위("A1") 여기서 Sheet1은 워크시트의 코드 이름입니다.

모든 워크시트 객체의 이름(VBA 에디터의 관점)이 시트 이름과 일치하도록 변경됩니다(Excel의 관점).

Sub ZZ_Reset_Sheet_CodeNames()
'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name)

    Dim varItem As Variant

    For Each varItem In ThisWorkbook.VBProject.VBComponents
        'Type 100 is a worksheet
        If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then
            varItem.Name = varItem.Properties("Name").Value
        End If
    Next
End Sub

개체 이름(코드명) "(이름)"이 속성 이름 "이름"에 의해 재정의되므로 하위 속성으로 참조해야 합니다.

실제로 "Sheet1" 객체/코드명은 변경할 수 있습니다.VBA에서 Excel Objects 목록에서 Sheet1을 클릭합니다.속성 창에서 Sheet1을 rng로 변경할 수 있습니다.

그런 다음 변수를 먼저 작성할 필요 없이 rng을 글로벌오브젝트로 참조할 수 있습니다.따라서 debug.print rng.name은 정상적으로 동작합니다.워크시트("rng").name이 없습니다.

탭과 달리 오브젝트 이름에는 다른 변수와 동일한 제한이 있습니다(즉, 공백 없음).

사용자가 제공한 이름으로 시트를 참조할 수 있어야 합니다.올바른 워크북을 참조하고 있습니까?시트를 참조할 때 워크북이 두 개 이상 열려 있는 경우 문제가 발생할 수 있습니다.

, 「」를 해 주세요.ActiveWorkbook한 워크북) (워크북)ThisWorkbook(매크로가 포함된 워크북)에서 해결할 수 있습니다.

예를들면,

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet")

이것은 매우 기본적인 해결책입니다(질문의 요점을 이해하지 못할 수도 있습니다).액티브 시트Name은 현재 탭 이름의 문자열을 반환합니다(사용자에 의한 향후 변경 내용이 반영됩니다).활성 시트를 호출하고 변수를 설정한 다음 워크시트의 개체로 사용합니다.부서 보고서를 작성하기 위해 테이블에서 데이터를 검색하고 있습니다.이 매크로는 워크북의 동일한 필터(기준 및 복사 범위)로 포맷된 모든 시트에서 작동합니다. 각 부문은 자체 시트를 가지고 이 단일 매크로를 사용하여 기준을 변경하고 업데이트할 수 있습니다.

Dim currRPT As String
ActiveSheet.Select
currRPT = (ActiveSheet.Name)
Range("A6").Select
Selection.RemoveSubtotal
Selection.AutoFilter
Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
    ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True
Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear
Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _
    Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal

Worksheet 표시

  • the를 Sheets ★★★★★★★★★★★★★★★★★」WorksheetsDanMDanM에 의해
  • 수식되지 않은 개체 이름으로

하며, 이 되지 않은 할 수: 3개의 워크북은 4개의 오브젝트는 4개의 워크시트입니다.ThisWorkbookSheet1Sheet2Sheet3이렇게 하면 다음과 같은 내용을 쓸 수 있습니다.

Sheet1.Range("A1").Value = "foo"

이 방법이 유용한 단축키처럼 보일 수 있지만 워크시트 이름이 변경될 때 문제가 발생합니다.되지 않은 입니다.Sheet1워크시트 이름이 완전히 다른 것으로 변경되더라도 말이죠.

여기에는 다음과 같은 몇 가지 논리가 있습니다.

  • 워크시트 이름이 변수 이름과 동일한 규칙을 준수하지 않음
  • 실수로 기존 변수를 마스킹할 수 있습니다.

를 들어 2003에서 완료) (Excel 2003에서 테스트 완료)를 .Workbook3월 1일2년 전에서는 다음과 선언합니다. 1 의의 음음 음음 음음 음 in in in in in in in 。

Public Sheet4 As Integer

다른 모듈에는 다음과 같이 입력합니다.

Sub main()

Sheet4 = 4

MsgBox Sheet4

End Sub

이를 실행하면 메시지 상자가 올바르게 나타납니다.

에 네 하여 워크북을 .Sheet4다시 한 번 메인 하면 " or method"라는 오류가 나타납니다.

시트 코드명을 사용하는 것은 일련의 매크로가 쓰러지는 것을 막기 위해서도 필요했습니다.상기 ccampj의 답변은 이 솔루션을 반영하고 있습니다(화면 사진 포함).

어쩔 수 없이 이 방법을 사용했지만, 유지보수에 문제가 있습니다.

Function sheet_match(rng As Range) As String  ' Converts Excel TAB names to the required VSB Sheetx names.
  TABname = rng.Worksheet.Name                ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates.
' Next, match this Excel sheet TAB name to the VSB Sheetx name:
   Select Case TABname 'sheet_match
      Case Is = "Sheet1": sheet_match = "Sheet1"  ' You supply these relationships
      Case Is = "Sheet2": sheet_match = "Sheet2"
      Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB
      Case Is = "Sheet4": sheet_match = "Sheet4"
      Case Is = "Sheet5": sheet_match = "Sheet5"
      Case Is = "Sheet6": sheet_match = "Sheet6"
      Case Is = "Sheet7": sheet_match = "Sheet7"
      Case Is = "Sheet8": sheet_match = "Sheet8"
   End Select
End Function

제가 틀렸을 수도 있지만 워크북을 열고 워크시트를 선택한 후 속성(이름)을 원하는 대로 변경할 수 있습니다.이는 "Sheetx" 명명 규칙을 재정의합니다.이러한 이름은 VBA Editor에도 표시됩니다.

수동으로 하는 방법: 1.워크북에서 시트를 선택합니다(템플릿을 작성하는 경향이 있습니다).2. 탭 이름을 원하는 대로 설정합니다("foo").3. [Developer]메뉴를 클릭합니다(이전에 유효하게 했습니다). 4. [Properties](속성)을 찾아서 클릭하면 해당 워크시트의 [Properties](속성)창이 나타납니다.5알파벳 목록의 첫 번째 항목은 (이름)이고 (이름) 오른쪽에는 "Sheetx"가 있습니다.
6. 해당 필드를 클릭하여 변경합니다('MyFav'를 사용하는 것이 좋습니다). 7. 속성 창을 닫습니다.8. Visual Basic 편집기로 이동합니다. 9. 방금 수정한 워크북의 시트를 검토합니다. 10.변경한 "MyFav" 이름과 그 오른쪽 괄호 안에 워크시트 탭 이름("foo")이 MicroSoft Excel 개체에 표시되는 것을 확인합니다.

는 변경할 수 있습니다.필요에 따라 프로그래밍 방식으로 CodeName을 클릭합니다.템플릿 조작을 용이하게 하기 위해 시트 이외의 이름을 사용합니다.일반적인 디폴트인 "Sheetx"를 사용할 필요가 없습니다.

다른 방법이 있을 것 같아요.좀 못생겼지만 효과가 있는 것 같아요.

Function GetAnyNameValue(NameofName) As String
    Dim nm, ws, rng As String
    nm = ActiveWorkbook.Names(NameofName).Value
    ws = CStr(Split(nm, "!")(0))
    ws = Replace(ws, "'", "")
    ws = Replace(ws, "=", "")
    rng = CStr(Split(nm, "!")(1))
    GetAnyNameValue = CStr(Worksheets(ws).Range(rng).Value)
End Function

언급URL : https://stackoverflow.com/questions/2649844/excel-tab-sheet-names-vs-visual-basic-sheet-names

반응형