两台不同计算机上的同一文件如何给出不同的结果?

时间:2018-03-05 10:17:24

标签: excel vba excel-vba printing

我制作了一个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

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

在我的电脑上,输出符合预期:
打印输出
enter image description here

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

如果有人想在此处测试,我已上传完整文件:http://hoppvader.nu/docs/Streckkod.xlsm
请注意,它仅使用module3,如果您选择00-99以外的复选单“Checksiffra”,则module2。

任何帮助都会被理解为什么它只适用于我的电脑。

5 个答案:

答案 0 :(得分:8)

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

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

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

enter image description here

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

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

答案 1 :(得分: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.?

答案 2 :(得分:2)

打印时应该有一个选项:&#34;缩放以适应&#34; 它可能是高级选项。在Mac上我必须单击&#34;显示详细信息&#34;

我曾经这么过vba。我是一名计算机程序员。但问题似乎不是代码问题。

ps-你可能找到一种方法来启用&#34;缩放以适应&#34;通过宏。 以下是一些检查编程解决方案的资源: 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,代码片段怎么样?

另外,删除.FitToPagesTall

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

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

答案 3 :(得分:0)

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

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

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

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

有大量埋藏的打印机设置和其他变量可能成为您问题的潜在原因,隐藏在各个级别。 (即系统级,设备级,应用级)

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

设备管理器

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

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

  • 点击Driver标签,记下Driver DateDriver Version

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

如果不匹配,请将它们匹配。如果您无法访问这些区域中的任何区域,或者不确定要更改哪个选项,请查看您的I.T.部。

打印机制造商设置

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

  • 右键点击所需的打印机,然后选择 Printer Preferences

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

打印机属性

  • 转到Control PanelHardware and SoundDevices and Printers

  • 右键点击所需的打印机,然后选择 Printer Properties

  • 检查所有标签上的所有值,查找两台计算机上两个设置之间的差异。

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

答案 4 :(得分:-1)

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

然后,我添加了以下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)无法自行生成打印预览,那么它的作用是什么?它将所有数据发送到打印机(因此它是完成工作的打印机)并且只是&#34;转发&#34;结果回来了。这通常不是问题,直到有人试图设计像素完美的打印件时才会被忽视。

我的公司也有类似的问题,我们使用邮寄贴纸的地址标签。在我们的打印机坏了之后,我们得到了一个闪亮的新产品(完全不同的型号,品牌等),我们的模板很乱,必须重新对齐。

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