itsource

선택 안 함 Excel vba 고정 창

mycopycode 2023. 4. 17. 21:48
반응형

선택 안 함 Excel vba 고정 창

엑셀에 엑셀 워크시트의 페인을 고정하는 VBA 스크립트가 있는데, 우선 범위를 선택하지 않고 이것이 가능한지 궁금합니다.이것은 1 ~ 7행은 고정시키지만,Range.Select:

ActiveSheet.Range("A8").Select
ActiveWindow.FreezePanes = True

좋은 의견이라도 있나?

[ View ] 、 [ Freeze Panes ] 、 [ Freeze Top Row ]명령어를 사용하여 녹음을 실시합니다.이것이 에 대한 결과입니다.프리즈 페인

With ActiveWindow
    If .FreezePanes Then .FreezePanes = False
    .SplitColumn = 0
    .SplitRow = 1
    .FreezePanes = True
End With

그래서 를 변경합니다.Split Column 및/또는.ActiveCell 속성의 종류에 관계없이 SplitRow 속성은 사용자를 대신합니다.

유리를 얼리는 것은 오해할 점이 많다.제가 직접 답변을 추가했으므로 여기서 찾을 수 있으므로 다음 번에는 재창조하지 않아도 됩니다.

Public Sub FreezePanesAt(rngDataTopLeft As Range)
    Dim wndCurrent As Window
    
    For Each wndCurrent In rngDataTopLeft.Worksheet.Parent.Windows
        With wndCurrent
            .FreezePanes = False
            If Not ((rngDataTopLeft.Row = 1) And (rngDataTopLeft.Column = 1)) Then
                .ScrollRow = 1
                .ScrollColumn = 1
                .SplitRow = rngDataTopLeft.Row - 1
                .SplitColumn = rngDataTopLeft.Column - 1
                .FreezePanes = True
            End If
        End With
    Next
End Sub

사용 예:

FreezePanesAt ThisWorkbook.Worksheets("Sheet1").Range("B3")
FreezePanesAt ThisWorkbook.Names("Header").RefersToRange
  • 입력 파라미터는 오른쪽 하단 페인의 왼쪽 상단 셀입니다.이것이 가장 빈번한 사용 예라고 생각합니다.분할 범위를 알고 있기 때문에 워크북/워크시트/창이 어떤 위치에 있는지 상관없습니다.
  • 입력 파라미터가 첫 번째 행/첫 번째 셀에 있지만 A1이 아닌 경우 창은 두 개밖에 없습니다.A1은 특수한 경우지만 Excel은 현재 뷰의 중앙에서 창을 분할하기 때문에 의도하는 경우를 생각할 수 없기 때문에 이를 방지했습니다.
  • 워크북/워크시트에 연결된 모든 윈도우를 반복하여 인덱싱합니다.Application.Windows(Windows(Thisworkbook.Name)동일한 워크북(이름은 "MyWorkbook:1")에 대한 창이 더 있거나 Excel이 크래시 후 워크북 복구를 시도한 경우(이름은 "MyWorkbook [Repaired]) 오류는 발생하지 않습니다.
  • 페인은 이미 동결되어 있고 사용자/다른 매크로가 워크북의 위치로 스크롤되었을 수 있으며 창의 왼쪽 상단 셀이 A1이 아닐 수 있습니다.

이전 답변은 일부 시트에서만 사용할 수 있습니다.looping통해.tabs다음 코드가 작동한다는 것을 알게 되었습니다tab I loopedthrough (타깃은 싱글)workbook)는 것에도 불구하고workbook이었습니다.activeworkbook.

요점:

With Application.Windows(DataWKB.Name) 
    Application.Goto ws.Cells(4, 5)
    .SplitColumn = 4
    .SplitRow = 3
    .FreezePanes = True
End With

내 코드에 있는 그대로의 코드Sub: (이 서브에서는 포맷을 훨씬 더 많이 하고 있습니다.이 서브에서는 그것을 삭제하고 여기에 필요한 코드만 남겨두려고 했습니다.

Sub Format_Final_Report()
Dim DataWKB As Workbook
Set DataWKB = Workbooks("Report.xlsx")
Dim ws As Worksheet

Dim tabCNT As Long
Dim tabName As String
tabCNT = DataWKB.Sheets.Count

For i = 1 To tabCNT
    Set ws = DataWKB.Worksheets(i)
    tabName = ws.Name


    With Application.Windows(DataWKB.Name)
        Application.Goto ws.Cells(4, 5)
        .SplitColumn = 4
        .SplitRow = 3
        .FreezePanes = True
    End With

Next i

End Sub

바라건대, 이것은 미래에 어떤 사람의 연구 시간을 절약해 줄 것이다.

액티브 셀을 잃거나 가시 범위를 흐트러뜨리지 않고 (특히 새 창을 만들 때) 페인을 적절히 다시 얼릴 수 있어야 합니다.많은 시간을 들였지만, 뭔가 확실한 효과를 얻을 수 있는 것이 있다고 생각합니다.

Sub FreezePanes(nbLignes As Integer, nbColonnes As Integer, Optional ByVal feuille As Worksheet)
    If feuille Is Nothing Then Set feuille = ActiveSheet Else feuille.Activate
    Error GoTo erreur
    With ActiveWindow
        If .View = xlNormalView Then
            If .FreezePanes Then .FreezePanes = False
            If .Split Then .Split = False

            .SplitColumn = nbColonnes
            .SplitRow = nbLignes

            If .Panes.Count = 4 Then 'rows and columns frozen
                .Panes(1).ScrollRow = 1
                .Panes(1).ScrollColumn = 1
                .Panes(2).ScrollRow = 1 'top right pane
                .Panes(3).ScrollColumn = 1 'bottom left pane
            ElseIf nbLignes > 0 Then .Panes(1).ScrollRow = 1
            ElseIf nbColonnes > 0 Then .Panes(1).ScrollColumn = 1
            Else: GoTo erreur
            End If

            .FreezePanes = True
        End If
    End With
    Exit Sub
erreur:
    Debug.print "Erreur en exécutant le sub 'FreezePanes " & nbLignes & ", " & nbColonnes & ", '" & feuille.Name & "' : code #" & Err.Number & Err.Description
End Sub

이게 오래된 건 알지만 도움이 될 만한 걸 발견했어요ChrisB가 설명한 바와 같이 SplitColumn/SplitRow 값은 현재 표시되는 창의 분할 BUT 위/왼쪽 마지막 셀을 나타냅니다.만약 이런 코드가 있다면:

Application.Goto Worksheets(2).Range("A101"), True
With ActiveWindow
 .SplitColumn = 0
 .SplitRow = 10
 .FreezePanes = True
End With

분할은 10과 11이 아닌 110과 111 행 사이에 있습니다.

자세한 설명과 추가 정보를 위해 편집:
내 요점은 값이 셀 주소가 아니라 왼쪽 위 셀의 오프셋이라는 것이다.따라서 ChrisB의 15년 12월 4일 18시 34분 메인 답변 아래의 코멘트는 행 1이 Active Window에 표시되는 경우에만 유지됩니다.

이 밖에도 몇 가지 포인트는 다음과 같습니다.

  1. Application.goto를 사용해도 왼쪽 상단에 이동하려는 셀이 반드시 배치되지 않습니다.
  2. .goto를 사용할 때 왼쪽 상단에 배치되는 셀은 Excel 창의 크기, 현재 줌 수준 등에 따라 달라질 수 있습니다(매우 임의적임).
  3. 분할을 볼 수 없도록 배치하거나 보이는 창에서 스크롤할 수도 있습니다(.FreezePanes = true인 경우).예를 들어 다음과 같습니다.
Application.Goto Worksheets(1).Range("A1"), True  
With ActiveWindow  
 .SplitColumn = 100  
 .SplitRow = 100  
 .FreezePanes = True  
End With  

CETAB는 응답에서 이 문제를 다루고 있을 수 있습니다.

ㅇㅇ, ㅇㅇ.ActiveWindow.ScrollRow = 1 ★★★★★★★★★★★★★★★★★」ActivWindow.ScrollColumn = 1되는 창에 셀 A1이 되지 않은 FreezePanes에 입니다.FreezePanes A1은FreezePanes입니다.

행 4 또는 셀 A4를 선택하여 행 1:3을 고정하고 셀 A3이 표시되지 않으면 FreezePanes 기능은 표시되는 창 중앙에 있는 창을 고정합니다.

또한 셀 B4가 선택되고 열 A가 표시되지 않으면 행 1:3만 고정됩니다(열 A는 고정되지 않습니다).마찬가지로 행 1:3이 표시되지 않으면 열 A만 고정됩니다.열 A와 행 1:3이 모두 표시되지 않으면 FreezePanes 기능은 창이 보이는 창 중앙에 고정됩니다.

분할의 문제는 사용자가 페인을 동결 해제해도 페인은 분할된 상태로 유지된다는 것입니다.(페인을 정지한 채로 두고 나중에 스플릿을 끄는 방법을 찾을 수 없었습니다.)

너무 뻔하거나 단순할 수 있지만, 현재 선택 항목을 단순히 저장했다가 나중에 다시 선택하면 어떻게 됩니까?

Sub FreezeTopRow()
    
    'First save the current selection to go back to it later
    Dim rngOriginalSelection As Range
    Set rngOriginalSelection = Selection
    
    'Change selection to A2 to make .FreezePanes work
    ActiveSheet.Range("A2").Select
    ActiveWindow.FreezePanes = True

    'Change selection back to original
    rngOriginalSelection.Select

End Sub

이게 내가 쓰는...

Public Sub FreezeTopRowPane(ByRef MyWs As Excel.Worksheet, _
                            Optional ByVal AfterRowNr As Integer = 1)

Dim SavedWS As Worksheet
Dim SavedUpdating As Boolean

SavedUpdating = Application.ScreenUpdating      'save current screen updating mode

Set SavedWS = ActiveSheet                       'save current active sheet

Application.ScreenUpdating = False              'turn off screen updating
MyWs.Activate                                   'activate worksheet for panes freezing
ActiveWindow.FreezePanes = False                'turn off freeze panes in case 
With ActiveWindow
    .SplitColumn = 0                            'set no column to split
    .SplitRow = AfterRowNr                      'set the row to split, default = row 1
End With
ActiveWindow.FreezePanes = True                 'trigger the new pane freezing

SavedWS.Activate                                'restore previous (saved) ws as active

Application.ScreenUpdating = SavedUpdating      'restore previous (saved) updating mode

End Sub

를 사용하여 프리즈 타이밍 테스트를 실시했습니다.[ vs ]를 선택합니다.작동시키다.여기 코드가 있습니다.

Dim numLoops As Long
Dim StartTime, LoopTime As Long
numLoops = 1000


Debug.Print ("Timing test of numloops:" & numLoops)

StartTime = Timer

For I = 0 To numLoops
        targetSheet.Activate
    With ActiveWindow
    If .FreezePanes Then .FreezePanes = False
        .SplitColumn = 2
        .SplitRow = 1
        .FreezePanes = True
    End With

Next I

LoopTime = Timer
Debug.Print ("Total time of activate method:" & Format((LoopTime - StartTime) / 86400, "hh:mm:ss"))
StartTime = Timer

For I = 0 To numLoops
        targetSheet.Select
        Application.Range("C2").Select
        Application.ActiveWindow.FreezePanes = True
Next I

LoopTime = Timer
Debug.Print ("Total time of select method:" & Format((LoopTime - StartTime) / 86400, "hh:mm:ss"))

결과는 다음과 같습니다.

Timing test of numloops:1000 
Total time of activate method:00:00:39 
Total time of select method:00:00:01

당신이 볼 수 있듯이.선택이 훨씬 빠릅니다.

언급URL : https://stackoverflow.com/questions/34094445/excel-vba-freeze-pane-without-select

반응형