【问题标题】:How get list of available page size in combobox and change size如何在组合框中获取可用页面大小列表并更改大小
【发布时间】:2020-04-13 22:50:34
【问题描述】:

我正在尝试使用 vba 将组合框中所有可用页面大小的列表作为下拉列表。当用户选择大小时,我需要相应地更改工作表大小。同样在另一个组合中,我需要在选择Combobox中的页面大小时填充该纸张尺寸的宽度和高度。

我试过类似的东西。

Dim i As integer
for i = 1 to 30
activesheet.combobox1.value = Activesheet.PageSetup.Papersize(i)
next i

谢谢

【问题讨论】:

标签: excel vba


【解决方案1】:

这里有一个基于This link的解决方案

ActiveSheet.ComboBox1.List = GetPaperSizes

GetPaperSizes 是您必须放在标准模块中的以下函数:

Option Explicit

'Written: June 14, 2010
'Author:  Leith Ross
'Summary: Lists the supported paper sizes for the default printer in a message box.

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

【讨论】:

  • 感谢您的宝贵回答。它工作得很好,尺寸被加载到组合框中,我的第一个任务完成了。我还想在另一个组合框中加载所选尺寸的高度和宽度,即分别在组合框 2 和组合框 3 中......如果它的,它也会加载自定义尺寸由打印机驱动程序创建?如果不能,请帮帮我。谢谢。
  • 不客气。如果我的回答解决了您的问题,请将其标记为已接受,以指导未来的读者……至于新问题,您应该发布一个新问题。谢谢
  • 我肯定会标记它已解决,因为它解决了我的问题。但在我的问题中,它解决了部分问题。你能帮我休息一下吗?
  • 我正在更改页面大小如下但不工作 Dim Papersizetext As String Papersizetext = "xlPaper" & Worksheets("Static").Range("B7").value 'A4 shgenerate.PageSetup.PaperSize = Papersizetext '不工作,但 shgenerate.PageSetup.PaperSize = xlPaperA4 ' 工作 - 有什么问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多