【问题标题】:How can the same file on two different computers give different result?两台不同计算机上的同一个文件如何给出不同的结果?
【发布时间】:2018-08-12 23:12:35
【问题描述】:

我制作了一个 VBA 脚本,它会从一张纸上读取值并在另一张纸上创建一个“标签”。
该标签应该打印在分为三部分的特殊纸张上。

由于我住在瑞典,我们使用 A4 纸尺寸(297x210 毫米)。标签应该是 99x210 毫米。
这意味着每个值都需要打印在纸上的确切位置。

我为我的公司这样做,因此所有计算机都完全相同。
相同的型号,相同版本的 Windows,相同版本的 Excel。

这是代码的一小部分(与文本定位相关的部分)

For i = 2 To Lastrow

        ' Location name
        Sheets("Etikett").Range("A" & intRad) = Sheets("Bins").Range("A" & i)
        With Sheets("Etikett").Range("A" & intRad & ":K" & intRad)
            .MergeCells = True
            .Font.Color = clr 
            .Font.Size = 150
            .Font.Bold = True
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .BorderAround Weight:=xlThick
            .Borders.Color = clr
            .Borders(xlEdgeLeft).Weight = xlThick ' this may look odd but is needed
            .Borders(xlEdgeRight).Weight = xlThick
        End With

        'Checknumber
        Sheets("Etikett").Range("B" & intRad + 1) = Sheets("Bins").Range("B" & i)
        With Sheets("Etikett").Range("B" & intRad + 1 & ":D" & intRad + 1)
            .MergeCells = True
            .Font.Color = clr
            .Font.Size = 100
            .NumberFormat = "00"
            .Font.Bold = True
            .VerticalAlignment = xlCenter
            .HorizontalAlignment = xlCenter
        End With

        ' old location
        If Sheets("Bins").Range("E" & i) <> "" Then
            Sheets("Etikett").Range("K" & intRad + 1) = Sheets("Bins").Range("E" & i)
            With Sheets("Etikett").Range("K" & intRad + 1)
                .MergeCells = True
                .Font.Color = clr
                .Font.Size = 8
                .Font.Bold = True
                .VerticalAlignment = xlBottom
                .HorizontalAlignment = xlLeft
            End With
        End If

        ' copy already premade barcode or generate barcode if not premade
        If Sheets("Bins").Cells(i, 2) < 100 Then
            Sheets("0-99").Select
            shp = "B" & Right("0" & Sheets("Bins").Cells(i, 2), 2)
            Sheets("0-99").Shapes(shp).Select
        Else
            Sheets("VBA").Select
            ThisWorkbook.ActiveSheet.Shapes.SelectAll
            Selection.Delete

            Code128Generate_v2 30, 0, 40, 2.5, ThisWorkbook.ActiveSheet, Sheets("Bins").Cells(i, 2), 200
            ThisWorkbook.ActiveSheet.Shapes.SelectAll
            Selection.ShapeRange.Group.Select
        End If

        'color the barcode
        Selection.ShapeRange.Line.ForeColor.RGB = clr

        Selection.Copy
        Sheets("Etikett").Select
        Sheets("Etikett").Range("G" & intRad + 1 & ":J" & intRad + 1).MergeCells = True

        ' Set rowheights
        Sheets("Etikett").Rows(intRad).RowHeight = 135
        Sheets("Etikett").Rows(intRad + 1).RowHeight = 115
        If Etikettcount Mod 3 = 0 Then ' if it's the last label on paper, no space is needed between this and the next.
            Range("G" & intRad + 1).Select
            intRad = intRad - 1 
        Else
            Sheets("Etikett").Rows(intRad + 2).RowHeight = 25
            Range("G" & intRad + 1).Select
        End If
        ActiveSheet.Paste ' paste barcode

        Etikettcount = Etikettcount + 1
        intRad = intRad + 3
    End If
Next i

请记住,这并不是所有的代码,而是复制文本和条形码并将它们放置在工作表上的内容。

在我的电脑上,输出如预期:
打印输出

在其他计算机上,最后一个字符被略微切断,垂直对齐不正确。
正如我之前写的,我需要标签之间的空白空间距离顶部约 99 毫米,然后它们之间的距离为 99 毫米。

如果有人想在这里测试,我已经上传了完整的文件:http://hoppvader.nu/docs/Streckkod.xlsm
请注意,它仅使用模块 3,如果您选择 00-99 以外的校验码“Checksiffra”,则模块 2。

感谢任何帮助说明为什么它仅适用于我的计算机。

【问题讨论】:

  • 我没有阅读整个代码,但我运行了你的宏,我也得到了最后一个字母被切断的相同结果 - 直到我将纸张类型从 A4 更改为 Letter。然后它看起来很好。我认为您不小心为字母纵横比(这是默认值)编写了代码,并且在纸张类型已设置为 A4 的公司计算机上遇到了问题,因为该问题发生在所有计算机(包括我的计算机)上,但是不是你的,相信问题出在你的电脑上是合乎逻辑的。
  • 这可能是真的。问题出在我的电脑上,但实际问题出在其他电脑上。那么,将纸张类型更改为 Letter 会起作用吗?我认为这应该可以用宏来完成。会看的,谢谢!
  • @Banana 我看了看,似乎不是问题所在。它设置为 A4,如果我更改为“字母”,它就会搞砸。当我切换回 A4 时,我的边距被重置为正常,所以我不得不再次将它们更改为自定义。
  • 您没有在代码中设置字体系列。您是否有可能更改了 excel 中的默认字体并使用文本和条形码设计了表格,而其他人都使用原始默认字体运行?
  • 我同意之前的评论,这很可能是字体/打印机设置问题。您没有向我们展示您指定这些设置的代码,这让我怀疑您没有明确设置所有这些设置。打印时,您绝对应该明确设置字体、大小和打印机设置,否则它将默认为用户的默认值/上次设置。

标签: vba excel printing


【解决方案1】:

输出会受到许多因素的影响,例如打印机的分辨率、桌面的分辨率、字体或单元格的大小。

例如,当我在一张新纸上绘制一个 10 厘米 x 10 厘米的正方形时,即使在页面设置和高级选项中禁用了缩放,打印结果也是一个 10.5 厘米 x 9.5 厘米的矩形。

要获得准确的输出,一种解决方案是在图表表上绘制内容,因为此类表上的任何绘图都打印为以厘米为单位提供的确切尺寸:

以下是添加图表工作表和创建标签的示例:

Sub DrawLabel()

  ' add new empty Chart sheet '
  Dim ch As Chart
  Set ch = ThisWorkbook.Charts.Add()
  ch.ChartArea.ClearContents
  ch.ChartArea.Format.Fill.Visible = msoFalse
  ch.ChartArea.Format.line.Visible = msoFalse

  ' setup page as A4 with no margin '
  ch.PageSetup.PaperSize = xlPaperA4
  ch.PageSetup.Orientation = xlPortrait
  ch.PageSetup.LeftMargin = 0
  ch.PageSetup.TopMargin = 0
  ch.PageSetup.RightMargin = 0
  ch.PageSetup.BottomMargin = 0
  ch.PageSetup.HeaderMargin = 0
  ch.PageSetup.FooterMargin = 0
  DoEvents ' force update '

  ' add labels
  AddText ch, x:=0.5, y:=0.5, w:=19.9, h:=4.6, Color:=vbRed, Border:=3, Size:=150, Text:="DB136C"
  AddText ch, x:=2.5, y:=5.1, w:=5, h:=4, Color:=vbRed, Border:=0, Size:=100, Text:="79"
  AddText ch, x:=0.5, y:=10, w:=19.9, h:=4.6, Color:=vbGreen, Border:=3, Size:=150, Text:="DB317A"
  AddText ch, x:=2.5, y:=14.6, w:=5, h:=4, Color:=vbGreen, Border:=0, Size:=100, Text:="35"
  AddText ch, x:=0.5, y:=19.5, w:=19.9, h:=4.6, Color:=vbBlack, Border:=3, Size:=150, Text:="AA102A"
  AddText ch, x:=2.5, y:=24.1, w:=5, h:=4, Color:=vbBlack, Border:=0, Size:=100, Text:="10"

End Sub

Private Sub AddText(self As Chart, x#, y#, w#, h#, Color&, Border#, Size#, Text$)
  With self.Shapes.AddTextBox( _
    msoTextOrientationHorizontal, _
    Application.CentimetersToPoints(x) - 8, _
    Application.CentimetersToPoints(y) - 8, _
    Application.CentimetersToPoints(w), _
    Application.CentimetersToPoints(h))

    .line.Weight = Border
    .line.ForeColor.RGB = Color
    .line.Visible = Border <> 0
    .TextFrame.VerticalAlignment = xlVAlignCenter
    .TextFrame.HorizontalAlignment = xlHAlignCenter
    .TextFrame2.TextRange.Font.Name = "Calibri"
    .TextFrame2.TextRange.Font.Size = Size
    .TextFrame2.TextRange.Font.Bold = msoTrue
    .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = Color
    .TextFrame2.TextRange.Text = Text
  End With
End Sub

【讨论】:

    【解决方案2】:

    检查列宽并将您的计算机列宽与其他列宽进行比较,如果它们不同,这可能是字体版本问题:

    • 检查您在工作表中使用的字体。
    • 检查您计算机上的字体版本以及另一台计算机上的字体版本。
    • 另外检查两台计算机上的 Calibri 和 Cambria 字体版本(因为这些是 Microsoft 的默认设置)。

    确保在所有计算机上安装相同的字体版本!

    这里的问题可能是 Excel 通过字符宽度确定列宽(请参阅Description of how column widths are determined in Excel)。所以如果字体改变,列宽也会改变。

    不久前,当 Microsoft Update 提供了一个具有不同字符宽度的错误字体文件时,我遇到了一些类似的问题。如果这些错误文件之一在您或其他计算机上,则列宽计算错误。
    另见:Why is Excel column Pixel width different on different machines, but same OS, same resolution, same Excel verison, etc.?

    【讨论】:

    • 字体相同,无法安装字体。请参阅问题下方的评论。
    • @Andreas 对不起,我回问,但如果你说字体是一样的,你检查这些字体的版本号了吗?我也有相同的字体,但字体的版本号不一样,这导致了列宽问题。并且您无法安装字体并不意味着它们会自动使用相同的版本号。为了您的兴趣:在我的电脑右侧被切断(Excel 2016 x64 Win10 所有最新版本)C:\Windows\Fonts\Calibri\calibri.ttf 版本 6.20
    • 至少两台电脑安装了6.18版本,意思是一样的。
    • 哇,您对上传的文件进行了更改吗?上次我测试你的文件时,它肯定被切断了。现在我再次测试(并下载)它并没有被切断(一切都适合)。同一台电脑,还没有更新,就在5天后!这里发生了一些奇怪的事情。
    • 这就是我要说的。我没有对文件进行任何更改。 Excel 有点奇怪。
    【解决方案3】:

    打印时应该有一个选项:“scale to fit” 它可能在高级选项中。在 Mac 上,我必须点击“显示详细信息”

    我以前是这样的vba。我是一名计算机程序员。但问题似乎不是代码问题。

    ps-您可能会找到一种通过宏启用“缩放以适应”的方法。 以下是检查编程解决方案的一些资源: https://www.ozgrid.com/forum/forum/help-forums/excel-general/5968-force-printing-macro-to-fit-page

    https://www.experts-exchange.com/questions/28156905/VBA-Print-Code-Print-Area-Fit-on-one-page.html

    Patrick Matthews 解决的上述链接摘录

     With Worksheets("name").PageSetup
       .Zoom = False
       .FitToPagesTall = 1
       .FitToPagesWide = 1
     End With
    

    回复@Andreas,代码sn-p怎么样?

    另外,删除 .FitToPagesTall

     With Worksheets("name").PageSetup
       .Zoom = False
       .FitToPagesWide = 1
     End With
    

    希望它不会垂直对齐,但仍会水平对齐。

    【讨论】:

    • 缩放以适应将不起作用。这与将其缩小以适合纸张相同。这意味着垂直对齐将完全关闭。
    【解决方案4】:

    听起来在不同的计算机上使用相同的文件不是你的问题。文件只是影响文档打印最终结果的众多因素之一。

    • Windows 打印机驱动程序在每台计算机上可能是不同的版本(即,在一台计算机上更新,但在另一台计算机上没有更新)

    • Windows 打印机设置在每台计算机之间可能略有不同。

    我知道您坚持认为两台计算机是相同的,并且这些设置无法更改,但是在看似相同的工作站上,这种差异总是发生,这是由任意数量的意外变量引起的。 (即,“有一次将 Windows 更新推送到两台机器时,其中一台意外关机,没有正确检索或安装更新。”)

    有大量隐藏的打印机设置和其他变量可能是您的问题的潜在原因,它们隐藏在各个层面。 (即,系统级、设备级、应用程序级)


    下面如何找到可能是违规者的三组属性。从两台计算机检查所有三个位置,然后比较设置。

    设备管理器

    • 点击Windows键,输入device manger并按下Enter

    • 双击Imaging Devices,然后右键单击所需的打印机并选择Properties

    • 单击Driver 标签,并记下Driver DateDriver Version

    • 在另一台计算机上重复这些步骤以比较驱动程序日期和版本。

    如果它们不匹配,则使它们匹配。如果您无法访问这些区域中的任何一个,或者不确定要更改哪个选项,请咨询您的 IT。部门。

    打印机制造商设置

    • 点击Windows键,输入printers并按下Enter

    • 右键单击所需的打印机并选择Printer Preferences

    • 此窗口的布局取决于您的打印机制造商。检查 all 选项卡上的 all 值,寻找两台机器上两个设置之间的差异。

    打印机属性

    • 转到Control PanelHardware and SoundDevices and Printers

    • 右键单击所需的打印机并选择Printer Properties

    • 检查 all 选项卡上的 all 值,寻找两台机器上两个设置之间的差异。

    • 最后,print a test page 来自两台计算机的所需打印机,并仔细检查它们是否存在任何差异(包括版本号)。

    【讨论】:

    • 为了确保打印机和打印机驱动程序不是问题,我也尝试打印到 PDF,但这也有所作为。昨天回家之前我注意到的一件事是:最右边一列的列宽(不记得是哪一列)的列宽为 8.46。如果我将其更改为 8 页面的宽度适合,但我仍然遇到垂直对齐问题。
    【解决方案5】:

    我会首先检查是否所有打印设置都按需要设置(打印机也有内部“默认”打印设置,可能会干扰所需的打印)。如果您使用的字体安装在工作计算机上。

    然后,我将添加以下 VBA 代码,以确保所有计算机上的 Excel 打印设置都相同(这只是给您一个提示,是可以设置的一小部分)

    With Sheets("Etikett").PageSetup
        .PaperSize = xlPaperA4
        .PrintQuality = 600
        .CenterHorizontally = False
        .CenterVertically = False
        .Orientation = xlPortrait
        .FitToPagesWide = 1
        .FitToPagesTall = 1
    End With
    

    如果以上没有帮助...请阅读以下内容。

    MS Office 打印有点棘手。问题是 Excel(不仅是 Excel)不能自己生成打印预览,那么它是做什么的呢?它将所有数据发送到打印机(因此它是完成这项工作的打印机)并且只是将结果“转发”回来。这通常不是问题,并且在有人尝试设计像素完美的打印之前被忽视。

    我在公司也遇到过类似的问题,我们将地址标签用于邮寄贴纸。在我们的打印机发生故障并且我们得到了一台闪亮的新打印机(完全不同的型号、品牌等)之后,我们的模板一团糟,必须重新调整。

    总而言之,它可以归结为打印机驱动程序...

    【讨论】:

    • 如果我今天有时间,我稍后再试一试。我之前看到了一个不同的答案或评论,现在已删除,与您的陈述大致相同。它可能是驱动程序和打印机。似乎有些道理。如果我直接打印到另一台打印机,它会错位。但如果我打印到 PDF,我会得到我想要的结果。
    • 我很确定我发布的代码应该会有所帮助。当我第一次打开你的文件时,我得到了未对齐的结果。应用我的修复后,标签看起来很完美。试试吧:)
    • 对不起,没有。周五没时间试,10分钟前又开始工作了:-)
    • 我试过了,但完全没有帮助。如果我在另一台计算机上稍微调整了边距,它适合宽度,但与 99 毫米不匹配。
    • @Andreas 如果您跳过我刚刚发布的代码并将边距调整为左 0 pt 和右 0 pt?或者将我的代码替换为: Sheets("Etikett").PageSetup.LeftMargin = Application.InchesToPoints(0) Sheets("Etikett").PageSetup.RightMargin = Application.InchesToPoints(0)
    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多