Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用VBA缩放两列以适应页面_Excel_Vba - Fatal编程技术网

Excel 使用VBA缩放两列以适应页面

Excel 使用VBA缩放两列以适应页面,excel,vba,Excel,Vba,我在将Excel中的列放入工作表时遇到问题。 我有一个从a到CK列的工作表(每个项目可以不同)。 我不需要打印A列,但B列必须在所有页面上,B列旁边必须有3列。这将使第一页的“B,C:E”列,下一页的“B,F:H”列等等。。。列B被设置为标题,因此它将打印在每一页上 我的问题是设置刻度。我在做什么: 取pagesize并转换为点,取左边距和右边距=我的可打印区域 获取范围宽度(“B:E”)=适合页面的我的范围 将我的可打印区域除以适合的范围,乘以100%,然后提取1%以确保适合 在我的情况下

我在将Excel中的列放入工作表时遇到问题。 我有一个从a到CK列的工作表(每个项目可以不同)。 我不需要打印A列,但B列必须在所有页面上,B列旁边必须有3列。这将使第一页的“B,C:E”列,下一页的“B,F:H”列等等。。。列B被设置为标题,因此它将打印在每一页上

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

  • 取pagesize并转换为点,取左边距和右边距=我的可打印区域
  • 获取范围宽度(“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
如果ActiveSheet.Name=“Meterkastlijst”那么
昏暗的房间和长的一样
暗长的
变暗lngPagB为长
lngKolB=ActiveSheet.Range(“B:E”).Width
如果ActiveSheet.PageSetup.PaperSize=xlPaperA4,则
lngPagB=CLng(Application.cmystopoints(21))-CLng((ActiveSheet.PageSetup.LeftMargin+ActiveSheet.PageSetup.RightMargin))
ElseIf ActiveSheet.PageSetup.PaperSize=xlPaperA3然后
lngPagB=CLng(Application.cmmstopoints(29.7))-CLng((ActiveSheet.PageSetup.LeftMargin+ActiveSheet.PageSetup.RightMargin))
如果结束
如果lngPagB 0和lngKolB 0,则
lngZoom=((lngPagB/lngKolB)*100)-1
使用ActiveSheet.PageSetup
.Zoom=lngZoom
以
如果结束
如果结束
不同宽度:

  • 列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)不同。

列宽单位 列宽以字符、点、厘米/英寸、像素等为单位测量

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

    最大值为255

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

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

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

换算公式 通过此操作,您可以检查或验证环境中的所有值:

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
可以使用API函数
GetDeviceCaps(hDC,88)

舍入效应 Excel存储基于字符的
.Range.ColumnWidth
,并为工作簿文件中的每个相关列使用小数。如果将其设置为100,则存储为e。g、
重新打开此文件后,报告的
.ColumnWidth
为100,不带小数

如果设置较大的列宽并在普通视图和页面布局视图之间切换,则可能会在度量值之间注册约2%的差异(
.Range.width
和像素突然变化)-但根据上述公式,所有值仍然相互对应

显示缩放相关性 所有不同的列宽值都与Excel的视图缩放级别和/或Windows 10显示比例无关

打印缩放相关性 如果更改打印缩放级别,则只有英寸和厘米值会更改

但你或多或少会得到我的专栏。E论文上的分数。
Excel以点为单位测量
.PageSetup.Leftmargin
(刻度为每英寸72点)。这对应于
.Range.Width
,它也是以点为单位测量的

示例:如果我将两张纸的边距都设置为5.5厘米,那么得到的A4纸张宽度为10厘米的值将保持e。G两列,总宽度
.Width
约。283点,相当于72点/英寸。 如果我将打印缩放设置为83%a
.Width
。最大值为340点,在30%的打印缩放率下,几乎为943点

打印缩放 打印缩放因子的计算为
WorkSheet.PageSetup.Zoom=(PageWidthInPoints/AllColumnsWidthInPoints)*100


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

必须将缩放因子设置为8%左右,这肯定是有特殊原因的,我不认为这只是一个舍入问题。你的专栏里有什么?您是否在文件中插入了尺寸有点过大的形状、图片或特殊字体(导致圆角问题)