【发布时间】: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 中的默认字体并使用文本和条形码设计了表格,而其他人都使用原始默认字体运行?
-
我同意之前的评论,这很可能是字体/打印机设置问题。您没有向我们展示您指定这些设置的代码,这让我怀疑您没有明确设置所有这些设置。打印时,您绝对应该明确设置字体、大小和打印机设置,否则它将默认为用户的默认值/上次设置。