微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 VBA 复制和粘贴多个单元格

如何解决使用 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(简单且正在工作)。

Second worksheet where all the plates are displayed

解决方法

假设你的汇总表是这样的

SUmmary Table

然后试试

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”目前的格式似乎是在六个位置接受“板”。如果您的意图是这六个应该来自主表“摘要”的不同行,那么这比将每行的六个副本打印出来要复杂一些。

在工作表之间来回切换时,值得使用一些 RangeWorksheet 变量来防止屏幕变得太忙。

有许多活动需要分离:

  • 从主表中获取“车牌”信息
  • 格式正确
  • 更新汇总表
  • 如果时间合适,输出为 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 举报,一经查实,本站将立刻删除。