如何解决使用 VBA 复制和粘贴多个单元格
我正在尝试在 Excel 工作表中自动执行宏。我在第一个工作表上有一个大表,行数可变,我需要为主工作表的每一行创建多个“板”(具有特定数据的 5 行组)(张贴在附图中) .为了以 .pdf 文件导出,需要按照屏幕截图中的方式显示板(在同一级别上有 2 个,直到最后一个)
这是我想出的代码,使用宏录制和其他宏发现并且已经为我工作(pdf打印):
Sheets("Summary").Select
lastRow = Cells(Rows.Count,1).End(xlUp).Row
first_row = "A2"
sec_row = "F2"
For i = 1 To lastRow
Sheets("Foglio1").Select
Range("S3:V7").Select
Selection.copy
Range("first_row:first_row+4").Select
ActiveSheet.Paste
Range("sec_row:sec_row+4").Select
ActiveSheet.Paste
i = i + 2
Next
在此之后,我有一个代码部分,我将所选区域导出为 pdf(简单且正在工作)。
解决方法
假设你的汇总表是这样的
然后试试
Option Explicit
Sub CreatePDF()
Dim wb As Workbook,ws As Worksheet,wsPDF As Worksheet
Dim iLastRow As Long,ar(1 To 5,1 To 1),rng As Range
Dim i As Long,r As Long,c As Integer,k As Integer
Set wb = ThisWorkbook
Set ws = wb.Sheets("Summary")
Set wsPDF = wb.Sheets("Foglio1")
'wsPDF.Cells.Clear
' fixed
ar(1,1) = "Factory s.r.l."
ar(2,1) = "Ph. +39 0000 00000"
ar(3,1) = "Web www.website.net"
iLastRow = ws.Cells(Rows.Count,1).End(xlUp).Row
r = 2 ' start row
c = 1 ' column A
For i = 2 To iLastRow
ar(4,1) = "JOB " & ws.Cells(i,"A")
ar(5,1) = "ORDER " & ws.Cells(i,"B")
' fill plate
Set rng = wsPDF.Cells(r,c).Resize(5,1)
rng.Value2 = ar
' merge cells
For k = 1 To 5
With rng.Cells(k,1).Resize(1,4)
.Merge
.HorizontalAlignment = xlCenter
.Font.Bold = True
End With
Next
' move to next plate
If i Mod 2 = 0 Then
c = 6 ' column F
Else
c = 1 ' column A
r = r + 6
End If
Next
MsgBox "Done"
End Sub
,
好的,目前您的代码中有许多“我希望这会起作用”类型的部分,而且现在可能问题多于答案。
您的输出表“Foglio1”目前的格式似乎是在六个位置接受“板”。如果您的意图是这六个应该来自主表“摘要”的不同行,那么这比将每行的六个副本打印出来要复杂一些。
在工作表之间来回切换时,值得使用一些 Range
和 Worksheet
变量来防止屏幕变得太忙。
有许多活动需要分离:
- 从主表中获取“车牌”信息
- 格式正确
- 更新汇总表
- 如果时间合适,输出为 pdf
所以我的总体方案如下:
' set up plate locations in output sheet Array("A2","F2","A8",...)
' ---- set up range of records to scan (ScanRange) (only column A,other data by .Offset)
For Each ACell in ScanRange
' ---- get data from this record e.g.
phone = ACell.Offset(0,5).Text
' ---- fill next plate (Range) in output sheet e.g.
whichPlate = whichPlate + 1 ' & cycle
Set plate = Range(plates(whichPlate))
plate.Offset(1,0).Value = "Ph. " & phone 'etc.
' ---- send to pdf if appropriate
' ---- clean up output sheet if needed
Next ACell
' ---- send last batch to pdf
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。