Zakładając, że nie masz nic przeciwko używaniu VBA w arkuszu kalkulacyjnym, jest to możliwe. Po pierwsze, jeśli nie masz jeszcze karty Deweloper na Wstążce, przejdź do opcji Plik-> Opcje, Dostosuj wstążkę, a na panelu po prawej stronie zaznacz opcję Deweloper, a następnie kliknij przycisk OK. Następnie kliknij kartę Deweloper, a następnie Visual Basic. Po lewej stronie kliknij dwukrotnie ten skoroszyt i wklej poniższy kod. W razie potrzeby zmień konfigurację. Teraz, gdy klikniesz, aby zapisać skoroszyt, wiersze automatycznie dostosują się do określonych parametrów.
Warto zauważyć, że na stronie można zmieścić więcej niż 31 wierszy, pomimo obliczeń; przy użyciu zwykłych marginesów Excela i nagłówka / stopki, 34 wiersze pasują do strony. Zmiana marginesów i nagłówka / stopki na 0, 31 wierszy pasuje na stronie.
Z tego powodu sugeruję dwukrotne sprawdzenie za pomocą Podglądu wydruku i odpowiednie zmniejszenie RowsPerPage, jeśli masz więcej wierszy niż oczekiwano na stronę. Rozdzielczość Row Heights jest tak duża, więc niestety nie jest idealna. W każdym razie mam nadzieję, że to pomoże.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' Configuration
RowsPerPage = 31 ' number of rows per page, as stated in question
NumberOfPages = 1 ' how many pages of data you have
NumberOfSheets = 1 ' How many spreadsheets are in use
TargetPageHeight = 29.7 ' A4 height in cm
' Don't change anything below here
TargetPageHeight = Application.CentimetersToPoints(TargetPageHeight)
TotalRowCount = NumberOfPages * RowsPerPage + 1 'Resize beyond the specified area so a smaller row doesn't sneak in
For sheetIndex = 1 To NumberOfSheets
AvailablePageHeight = TargetPageHeight
With Worksheets(sheetIndex).PageSetup
AvailablePageHeight = AvailablePageHeight - (.TopMargin + .BottomMargin + .HeaderMargin + .FooterMargin)
End With
OptimalRowHeight = AvailablePageHeight / RowsPerPage
currentIndex = 1
With Worksheets(sheetIndex)
While currentIndex <= TotalRowCount
Rows(currentIndex).RowHeight = OptimalRowHeight
currentIndex = currentIndex + 1
Wend
End With
Next sheetIndex
End Sub