【问题标题】:Copy and Paste multiple cells with VBA使用 VBA 复制和粘贴多个单元格
【发布时间】:2021-05-18 17:16:29
【问题描述】:

我正在尝试自动化 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(简单且有效)。

【问题讨论】:

    标签: excel vba copy-paste worksheet-function


    【解决方案1】:

    假设你的摘要表是这样的

    那就试试

    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
    

    【讨论】:

    • 这很完美,而且以我想要的方式,我需要适应一些东西,但总体来说是完美的,我想我可以处理我想要改变的事情。我不知道该怎么感谢你,你让我很开心。
    【解决方案2】:

    好的,目前您的代码中有许多“我希望这会起作用”类型的部分,而且现在可能问题多于答案。

    您的输出表“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
    
    

    【讨论】:

    • 非常感谢您的诚实回复。我脑子里有代码概念,但目前我缺乏 vba 知识。我将尝试遵循您的提示并提高我的代码技能。我的最后一个目标是从主工作表中生成的每一行创建一个单板(以相同的顺序,我认为这可以降低整体复杂性)。再次感谢您的帮助。
    • 没问题;在开发流程时,您总是可以提出更多问题。如果您认为这是一个可以接受的答案,请随时用复选标记接受它。如果您提出其他问题但没有得到一般性答复,您也可以在此处回复以通知我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多