일요일 08 10월 2017
  0 답글
  3.1K 방문
0
투표
취소
400개 이상의 행, 8개 열 및 160개의 병합된 범위가 포함된 통합 문서에 워크시트가 있는데 모양이 엉망입니다. 인터넷에서 VBA Autofit Merged Cells를 검색했습니다. URL이 많이 사용되지 않습니다. 이 웹사이트의 매크로는 올바른 방향으로 가고 있지만: -
1) 160개의 병합된 범위를 수동으로 식별하고 입력해야 합니다.
병합된 셀 범위에 대한 검색을 추가했습니다.
2) 행 1을 사용하여 병합된 셀 계산(셀 ZZ1)을 수행합니다. 셀 AXNUMX(제목)에 훨씬 더 큰 글꼴을 사용하여 필요한 병합된 자동 맞춤 높이를 계산하는 데 오류가 발생했습니다.
셀 1열 오른쪽과 1행 아래 데이터를 사용합니다. (Ctrl+Shift+End, 이 셀을 찾지 못함)
3) 병합된 모든 셀을 재계산하여 병합된 셀과 일반 셀을 모두 포함하는 두 행의 높이를 줄여 일반 셀을 읽을 수 없게 만듭니다.
필요한 병합 높이가 기존 높이를 초과하는 경우에만 행 높이를 변경합니다.
4) 병합된 범위의 데이터를 ZZ1 셀에 복사하는 방법이 올바르지 않습니다. 병합된 범위의 텍스트만 기반으로 하지만 병합된 다양한 셀의 서로 다른 글꼴 크기는 고려하지 않았습니다.
복사 방법을 수정했습니다.
5) 매크로가 느립니다: 내 워크시트에서 약 15초 이상입니다.
화면 새로 고침을 끄고 매크로 종료 시 다시 켜면 이 시간이 2초로 줄어듭니다.

나는 또 다른 짜증나는 결점을 찾았다. 병합된 범위를 수정하기 전에 워크시트를 자동으로 맞추면 여러 행이 왜곡됩니다. 래핑으로 설정된 일부 "일반" 셀의 높이가 증가하고 텍스트 아래에 빈 행이 있는 텍스트 줄(또는 두 줄)로 나타납니다. 인터넷 검색 결과 Excel이 프린터 글꼴을 수용하도록 디스플레이를 변경했기 때문에 발생한 것으로 나타났습니다. "해결 방법"을 찾아 매크로에 추가했습니다.
열 너비를 약간 늘립니다.
워크시트의 모든 행을 자동으로 맞춥니다.
병합된 범위를 수용하도록 행 높이 수정을 수행합니다.
열 너비를 원래 크기로 되돌립니다.
문제가 해결되어 이제 빈 행이 더 이상 나타나지 않습니다!

이제 모든 것이 정확하다고 생각했지만 더 많은 문제를 발견했습니다. 통합 문서를 닫았다가 다시 열면 빈 행이 다시 나타납니다. 파일/옵션을 살펴보고 통합 문서를 성공하지 않고 닫거나 열 때 통합 문서가 화면 표시를 업데이트하는 것을 방지하는 방법을 인터넷에서 검색했습니다. 통합 문서가 열릴 때 매크로를 실행하는 호출과 함께 "ThisWorkbook" 탭에 Private Sub Workbook_Open()을 추가해야 했습니다.


Option Explicit

하위 Look4Merged()
Dim WSN As String '워크시트 이름
Dim sht As Worksheet 'Used by "Set"
Dim LastRow As Long '데이터가 있는 모든 열의 마지막 행
Dim LastRowCC As Long ' 데이터가 있는 현재 열의 마지막 행
Dim LastColumn As Integer '데이터가 있는 모든 행의 마지막 열 수
Dim CurrCol As Integer '현재 열의 수
Dim Letter As String 'CurrCol 숫자를 문자열로 변환
Dim ILetter As String '인덱스 열을 마지막 열의 오른쪽으로
Dim ICell As String ' 오른쪽으로 한 열 셀 및 frpm 데이터 영역 아래로 한 행. 필요한 병합 높이를 계산하는 데 사용됩니다.
Dim CRow As Long '현재 행 번호
Dim TwN As Long '오류 처리
Dim TwD As String '오류 처리
Dim Mgd As Boolean '셀이 병합되면 참/거짓 테스트
Dim MgdCellAddr As String ' 병합된 범위를 문자열로 포함
Dim MgdCellStart As String '병합된 셀 범위의 시작 문자 병합된 셀에 대해 열 B를 검사하는 데 사용됩니다. 열 A에서 시작하여 열 B로 확장되는 병합된 셀은 무시합니다(이미 평가됨).
Dim MgdCellStart1 As String ' MgdCellStart 계산에 사용
Dim MgdCellStart2 As String ' MgdCellStart 계산에 사용
Dim OldHeight As Single ' 병합된 범위에 있는 모든 행의 기존 높이
Dim P1 As Integer '루프 카운트/포인터
Dim OldWidth As Single '병합된 범위에 있는 셀의 기존 너비
Dim NewHeight As Single '병합된 범위에 있는 모든 행의 필수 높이입니다. OldHeight를 초과하는 경우 개별 행을 비례적으로 업데이트합니다.
Dim C1 As Integer '루프 열 수
Dim R1 As Long '루프 행 수/포인터
Dim Tweak As Single '빈 행 문제를 극복하기 위해 열 너비를 약간 늘림
주황색을 범위로 어둡게
오류 시 GoTo TomsHandler

Application.ScreenUpdating = False '화면이 15초만 꺼지면 2초 더 빨라집니다.
Tweak = 1.04 '모든 행을 자동 맞춤하기 전에 열 너비를 4% 늘립니다.
WSN = ActiveSheet.이름
열("A:A").EntireRow.Hidden = False

'데이터가 포함된 전체 워크시트에서 마지막 활성 행 및 열 찾기
ActiveSheet.UsedRange 사용
LastColumn = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder : = xlByColumns, SearchDirection : = xlPrevious) .Column
LastRow = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

CurrCol = LastColumn + 1 '즉, 마지막 열의 오른쪽
CurrCol < 27인 경우
ILetter = Chr$(CurrCol + 64) '인덱스 열
다른
ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) '두 자리 숫자인 경우 인덱스 열.
END IF

'Icell은 데이터의 오른쪽과 아래에 위치합니다. 셀은 병합된 범위에 맞는 데 필요한 높이를 계산하는 데 사용됩니다.
ICell = ILetter & LastRow + 1

'빈 행 줄 바꿈 버그를 해결하기 위해 열 너비를 약간 늘립니다.
범위("A" & LastRow + 1).선택
C1 = 1인 경우 LastColumn까지
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * Tweak '버그를 치료하기 위해 열 너비를 약간 늘립니다.
ActiveCell.Offset(0, 1).Range("A1").Select ' 한 셀 오른쪽으로 이동
다음 보기

'일부 래핑 행에서 빈 행 버그를 방지하기 위해 열 너비가 4% 추가된 자동 맞춤 행(병합된 행 무시)
셀. 선택
선택.행.자동 맞춤
Set sht = Worksheets(WSN) '데이터가 있는 열의 마지막 항목을 찾는 데 필요함

CurrCol의 경우 = 1 To LastColumn
'현재 열 번호를 알파로 변환(단일 문자 또는 이중 문자)
CurrCol < 27인 경우
문자 = Chr$(CurrCol + 64)
다른
문자 = Chr$(Int((CurrCol - 1) / 26) + 64)
Letter = Letter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
END IF
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row '현재 열에서 마지막 행 찾기

CRow의 경우 = 1 ~ LastRowCC
범위(문자 및 CRow).선택
Mgd = ActiveCell.MergeCells '병합된 범위의 셀입니다.
If Mgd = True Then 'If True이면
'병합된 범위 주소는 무엇입니까? 범위 시작을 위한 한자리/두자리 추출
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = 중간(MgdCellAddr, 2, 1)
MgdCellStart2 = 중간(MgdCellAddr, 3, 1)
MgdCellStart2 = "$"인 경우
MgdCellStart = MgdCellStart1
다른
MgdCellStart = MgdCellStart1 & MgdCellStart2
END IF
If MgdCellStart = Letter Then 'Is 병합된 셀의 첫 번째 열은 현재 열과 같습니다.
시트 포함(WSN)
올드폭 = 0
Set oRange = Range(MgdCellAddr) 'oRange를 감지된 병합된 범위로 설정
C1의 경우 = 1 ~ oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth '셀 범위에 대한 열 너비 누적(4% 추가)
다음 보기
이전 높이 = 0
R1 = 1 ~ oRange.Rows.Count의 경우
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight '셀 범위에 대한 기존 행 높이를 누적합니다.
다음 보기
oRange.MergeCells = 거짓
.Range(Letter & CRow).Copy Destination:=Range(ICell) '값만 복사하지 않고 텍스트와 글꼴 크기를 복사합니다.
.Range(ICell).WrapText = True ' ICell 감싸기
.Columns(ILetter).ColumnWidth = OldWidth '기존 범위를 모방하기 위해 ICell을 포함하는 열의 너비를 변경합니다.
.Rows(LastRow + 1).EntireRow.AutoFit '필요한 병합 높이를 측정할 준비가 된 ICell 행을 자동 맞춤
oRange.MergeCells = True '병합된 Range를 다시 병합된 상태로 재설정
oRange.WrapText = True ' 및 래핑
'병합된 범위에 필요한 높이 측정
NewHeight = .Rows(LastRow + 1).RowHeight
'새 필수 높이가 이전 기존 높이를 초과합니까?
NewHeight > OldHeight인 경우
R1의 경우 = CRow To CRow + oRange.Rows.Count - 1
'범위 비율에 따라 각 행을 늘립니다.
범위(ILetter & R1).RowHeight = 범위(ILetter & R1).RowHeight * NewHeight / OldHeight
다음 보기
다른
'병합된 셀에 충분한 공간
END IF
CRow = CRow + oRange.Rows.Count - 여러 행 범위의 1 'else는 범위의 두 번째 행으로 떨어지고 "다음"에 도달하면 계산을 반복합니다.
.Range(ICell).Clear 'Zap ICell 다음 계산 준비
.Range(ICell).ColumnWidth = 8.1 '열 너비 정리

END IF
END IF
다음 보기
다음 보기

'열 너비 재설정 4% 추가 제거(래핑 오류 수정 필요)
범위("A" & LastRow + 1).선택
C1 = 1인 경우 LastColumn까지
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / Tweak '열 너비를 원래대로 줄입니다.
ActiveCell.Offset(0, 1).Range("A1").Select ' 한 셀 오른쪽
다음 보기
범위 ( "A1"). 선택

Application.ScreenUpdating = True '스위치 업데이트 다시 켜기
서브 종료

Toms핸들러:
Application.ScreenUpdating = True '스위치 업데이트 다시 켜기
TwN = 오류 번호
TwD = 오류 설명
MsgBox "오류 처리 필요" & TwN & " " & TwD
중지
이력서
최종 하위

통합 문서를 닫거나 다시 열 때 Excel에서 화면 표시 모양이 변경되지 않도록 할 수 있습니까?
이 게시물에 대한 답변이 없습니다.