Я создал пользовательский размер страницы для Excel в разделе "windows Свойства сервера печати". следуя приведенным здесь шагам https://www.win2pdf.com/doc/pdf-custom-paper-windows-10.html
Теперь у меня есть все нестандартные размеры, включая размеры по умолчанию, указанные в списке размеров страниц Excel. Далее я вытащил все размеры для выпадающего списка Combobox со следующими кодами.
, поэтому мое требование - изменить размер листа Excel при изменении выбора Combobox.
Обратите внимание: мы не можем измените размер с помощью метода case или задайте его заранее, если размеры не являются фиксированными, поскольку размеры в Combobox будут динамическими c, когда пользователь создаст новый размер, он будет добавлен в Combobox.
Спасибо
'worksheet code
ActiveSheet.ComboBox1.List = GetPaperSizes
'код модуля
Option Explicit
Private Const DC_PAPERNAMES = &H10
Private Declare Function DeviceCapabilities _
Lib "winspool.drv" _
Alias "DeviceCapabilitiesA" _
(ByVal lpDeviceName As String, _
ByVal lpPort As String, _
ByVal iIndex As Long, _
ByRef lpOutput As Any, _
ByRef lpDevMode As Any) _
As Long
Private Declare Function StrLen _
Lib "kernel32.dll" _
Alias "lstrlenA" _
(ByVal lpString As String) _
As Long
Function GetPaperSizes() As Variant
Dim AllNames As String
Dim I As Long
Dim Msg As String
Dim PD As Variant
Dim Ret As Long
Dim papersizes() As Byte
Dim PaperSize As String
'Retrieve the number of available paper names
PD = Split(Application.ActivePrinter, " on ")'<<<== change "on" with its local Language translation from english
Ret = DeviceCapabilities(PD(0), PD(1), DC_PAPERNAMES, ByVal 0&, ByVal 0&)
'resize the array
ReDim papersizes(0 To Ret * 64) As Byte
'retrieve all the available paper names
Call DeviceCapabilities(PD(0), PD(1), DC_PAPERNAMES, papersizes(0), ByVal 0&)
'convert the retrieved byte array to an ANSI string
AllNames = StrConv(papersizes, vbUnicode)
'loop through the string and search for the names of the papers
For I = 1 To Len(AllNames) Step 64
PaperSize = Mid(AllNames, I, 64)
PaperSize = Left(PaperSize, StrLen(PaperSize))
If PaperSize <> vbNullString Then Msg = Msg & PaperSize & vbCrLf
Next I
GetPaperSizes = Split(Left(Msg, Len(Msg) - 2), vbCrLf)
End Function
