선택 안 함 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 looped
through (타깃은 싱글)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에 표시되는 경우에만 유지됩니다.
이 밖에도 몇 가지 포인트는 다음과 같습니다.
- Application.goto를 사용해도 왼쪽 상단에 이동하려는 셀이 반드시 배치되지 않습니다.
- .goto를 사용할 때 왼쪽 상단에 배치되는 셀은 Excel 창의 크기, 현재 줌 수준 등에 따라 달라질 수 있습니다(매우 임의적임).
- 분할을 볼 수 없도록 배치하거나 보이는 창에서 스크롤할 수도 있습니다(.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
'itsource' 카테고리의 다른 글
T-SQL 선택에서 각 행에 대해 난수를 생성하려면 어떻게 해야 합니까? (0) | 2023.04.17 |
---|---|
「 」의 맞추기 「 」의 맞추기 「 」의 맞추기 페이지 중앙(가로/가로)까지 (0) | 2023.04.17 |
git 풀 실행 취소, 저장소를 이전 상태로 되돌리는 방법 (0) | 2023.04.17 |
Swift의 Documents 디렉토리에 파일이 있는지 확인하는 방법 (0) | 2023.04.17 |
PowerShell에서 명령 실행 타이밍 설정 (0) | 2023.04.17 |