缩放几列以适合使用VBA的页面

时间:2018-11-08 10:42:40

标签: excel vba

我无法在工作表上的Excel中调整列。 我的工作表的列从A到CK(每个项目可能不同)。 我不需要打印A列,但是B列必须在所有页面上,并且B列旁边必须是3列。这样一来,第一页将成为“ B,C:E”列,下一页将成为“ B,F:H”列,依此类推... B列被设置为标题,因此将在每页上打印。 >

我的问题是设置刻度。我在做什么:

  • 获取页面大小并转换为磅,从左边距取下,右边距取下=我的可打印区域
  • 获取范围的宽度(“ B:E”)=我的范围以适合页面
  • 将我的可打印区域除以我的适合范围,将其乘以100%,然后提取1%以确保它适合我

在我的情况下,结果为83,但要适合该页面,结果必须为77。我必须找到我认为的其他数字,但我不知道如何以及该...。

我的代码:

If ActiveSheet.Name = "Meterkastlijst" Then
    Dim lngZoom As Long
    Dim lngKolB As Long
    Dim lngPagB As Long
    lngKolB = ActiveSheet.Range("B:E").Width
    If ActiveSheet.PageSetup.PaperSize = xlPaperA4 Then
        lngPagB = CLng(Application.CentimetersToPoints(21)) - CLng((ActiveSheet.PageSetup.LeftMargin + ActiveSheet.PageSetup.RightMargin))
    ElseIf ActiveSheet.PageSetup.PaperSize = xlPaperA3 Then
        lngPagB = CLng(Application.CentimetersToPoints(29.7)) - CLng((ActiveSheet.PageSetup.LeftMargin + ActiveSheet.PageSetup.RightMargin))
    End If
    If lngPagB <> 0 And lngKolB <> 0 Then
        lngZoom = ((lngPagB / lngKolB) * 100) - 1
        With ActiveSheet.PageSetup
            .Zoom = lngZoom
        End With
    End If
End If

不同的宽度:

  • B列:45(319像素)->在Excel中,使用VBA设置
  • 列C:15(109像素)->在Excel中,使用VBA设置
  • D列:30(214像素)->在Excel中,使用VBA设置
  • E栏:20(144像素)->在Excel中,使用VBA设置
  • B-E栏:589点->使用VBA
  • 页面:21厘米(595点)
  • 边距(左右):1.8厘米(50.4分)
  • 打印区域:595-101(100.8)= 494点

使用上面的数字可以计算出83%,但随后却不适合,当我手动将其设置为77%时,它确实适合,但是如何使用VBA获得该数字?我不了解列宽,在Excel中看到的以及在VBA中如何设置(45 + 15 + 30 + 20)与VBA告诉我应该是(589)...

1 个答案:

答案 0 :(得分:0)

列宽单位

列宽以字符,点,厘米/英寸,像素,...为单位

  • 以字符为单位的列宽
    如果通过手动值输入或鼠标设置列宽,则会看到“标准字体编号字符的数量”。有关详细信息,请参阅Microsoft support
    可以在VBA .Range.ColumnWidth = 10.78中读取和写入此值。
    最大值为255。

  • 以点为单位的列宽
    这是在手动调整列大小时未在GUI中显示的内部值。
    相当于每英寸72点。
    在VBA中,只能读取:.Range.Width

  • 列宽(以像素为单位)
    Excel在常规视图中手动调整列宽的大小时会显示列宽(以像素为单位)(在括号中)。无法在VBA中直接读取或写入此值。

  • 以厘米或英寸为单位的列宽
    在页面布局视图中进行手动调整大小时,Excel以厘米(或英寸)为单位显示列宽,而不是以像素为单位。
    仅此值取决于打印缩放级别!
    可以在VBA中读取测量单位本身:
    Application.MeasurementUnit ' 0 = xlInches, 1 = xlCentimeters, 2 = xlMillimeters

转换公式

这样,您可以检查或验证环境中的所有值:

Dim ScreenResolution As Double
Dim ColumnWidthChars As Double
Dim ColumnWidthPoints As Double
Dim ColumnWidthPixels As Double
Dim ColumnWidthInches As Double
Dim ColumnWidthCentimeters As Double

ScreenResolution = 120  ' normal (96 dpi) or large (120 dpi)
ColumnWidthChars = ActiveSheet.Columns(1).ColumnWidth
ColumnWidthPoints = ActiveSheet.Columns(1).Width
ColumnWidthPixels = (ColumnWidthPoints / 72) * ScreenResolution
ColumnWidthInches = ColumnWidthPoints / 72 * ActiveSheet.PageSetup.Zoom / 100
ColumnWidthCentimeters = ColumnWidthInches * 2.54

Debug.Print ColumnWidthChars, ColumnWidthPoints, ColumnWidthInches, _
    ColumnWidthCentimeters, ColumnWidthPixels

ScreenResolution可以使用API​​函数GetDeviceCaps(hDC, 88)

检索

环绕效果

Excel将工作簿文件中每个相关列的基于字符的.Range.ColumnWidth用小数存储。如果将其设置为100,则将其存储为e。 g。
<cols><col min="1" max="1" width="100.77734375" customWidth="1"/></cols> 重新打开此文件后,报告的.ColumnWidth为100,不含小数。

如果您设置了较大的列宽并在普通视图和页面布局视图之间切换,那么您可能会发现小节之间的差异大约为2%(.Range.Width和像素突然改变)-但所有值仍对应彼此根据上面的公式。

显示比例依赖性

所有不同的列宽值均独立于Excel的视图缩放级别和/或Windows 10显示比例。

打印缩放依赖性

如果更改打印缩放级别,则仅英寸和厘米值会更改。

但是您获得的列或多或少。 e。纸上的点数。
Excel以磅为单位测量.PageSetup.Leftmargin(每英寸72个磅)。这对应于.Range.Width,它也以点为单位。

示例:如果我将两个纸页边距都设置为5.5厘米,则生成的10厘米A4纸宽度为e。 G。两列,总计.Width为appr。 283点,对应于72点/英寸。 如果将打印缩放比例设置为约.Width的83%。最高为340点,而打印缩放比例为30%时,则接近943点。

打印比例缩放

打印缩放系数的计算方式是
WorkSheet.PageSetup.Zoom = (PageWidthInPoints / AllColumnsWidthInPoints) * 100

您的计算似乎是正确的,但我至少会减去2%(请参见上面的舍入效果)。