用于组合表格的代码清理

时间:2016-11-23 19:09:12

标签: excel vba excel-vba

我对VBA没有太多经验,但我会从解释我的情况开始。

我有一张341张的工作簿。每张纸的布局相同,因为它们占据空间A1:J48。我需要将所有这些组合成一张名为“COMBINATION”的表格。相关信息来自A10:J48。我还需要从A1:J9获取单元格,因为它们是所有工作表共享的标题。

我所做的是编写一个代码复制A1:J48 for Sheet1(获取标题和信息)并将其粘贴到“COMBINATION”中,粘贴特殊为文本,然后是代码转到Sheet2并从A10复制:J48并将其粘贴到“COMBINATION”列A的第一个空单元格中。

这让我想到了我的问题。我已经意识到必须有一种更简单的方法,而不是为每张纸复制代码339次。

见下面的代码。它做了我想要的正确但是如上所述,我想找到一种不再做339次的方法......

Sheets("Sheet1").Select
Range("A1:J48").Select
Selection.Copy
Sheets("COMBINATION").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Selection.Columns.AutoFit

Sheets("Sheet2").Select
Range("A10:J10").Select
Range("J10").Activate
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("COMBINATION").Select
NextFree = Range("A10:A" & Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row
Range("A" & NextFree).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

3 个答案:

答案 0 :(得分:0)

我会使用如下代码:

PHP >= 7

如果您的工作表并非始终包含所有39行(10到48)中的数据,请将Dim ws As Worksheet Dim r As Long 'Copy A1:J9 from the first sheet Worksheets("Sheet1").Range("A1:J9").Copy WorkSheets("COMBINATION").Range("A1").PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False 'Now loop through every sheet (except "COMBINATION") copying cells A10:J48 r = 10 ' first sheet will be copied to row 10 in COMBINATION For Each ws In Worksheets If ws.Name <> "COMBINATION" Then ws.Range("A10:J48").Copy Worksheets("COMBINATION").Range("A" & r).PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False 'Set pointer ready for next sheet r = r + 39 End If Next 'Set column widths Worksheets("COMBINATION").Columns.AutoFit 替换为

r = r + 39

答案 1 :(得分:0)

将重复代码放入循环(未经测试):

usr/bin/i686-w64-mingw32.static-pkg-config Qt5Widgets --libs

答案 2 :(得分:0)

Range.PasteSpecial xlPasteValues很方便但很慢。定义你的目标&#39;要快得多。范围与源范围相同,并进行直接分配。

Sub CombineData()
    Application.ScreenUpdating = False

    Dim ws As Worksheet
    Dim Target As Range
    With Worksheets("COMBINATION")
        .Range("A1:J9").Value = Worksheets("Sheet1").Range("A1:J49").Value
        For Each ws In Worksheets
            If ws.Name <> .Name Then
                Set Target = .Range("A" & .Rows.Count).End(xlUp).Offset(1)
                Target.Resize(39, 10).Value = ws.Range("A10:J48").Value
            End If
        Next
    End With

    Application.ScreenUpdating = True
End Sub