合并工作表并在Excel中添加列

时间:2014-03-26 00:06:44

标签: excel excel-vba vba

我有一个包含多个标签的工作表,这些标签用于标识不同的数据源。我需要将所有工作表合并为一个,并添加一个包含工作表名称的列作为新组合工作表的一部分。

我找到了以下代码,如果我剪切/粘贴到我的工作表中,它就像一个魅力,但我有几个这样的工作簿,我必须能够每月重新创建这个过程。

我的研究表明我应该创建一个com add或recallable宏来执行此操作,但每次尝试时,该过程都会失败。我非常感谢somone能否指出我在Excel(2013)中执行此操作的步骤,并告诉我我的代码是否有效。
提前谢谢。

Sub Combine()
    Dim J As Integer, wsNew As Worksheet
    Dim rngCopy As Range, rngPaste As Range
    Dim Location As String

    On Error Resume Next
    Set wsNew = Sheets("Combined")
    On Error GoTo 0
        'if sheet does not already exist, create it
        If wsNew Is Nothing Then
        Set wsNew = Worksheets.Add(before:=Sheets(1)) ' add a sheet in first place
        wsNew.Name = "Combined"
    End If

    'copy headings and paste to new sheet starting in B1
    With Sheets(2)
        Range(.Range("A1"), .Cells(1, Columns.Count).End(xlToLeft)).Copy wsNew.Range("B1") 
    End With

    ' work through sheets
    For J = 2 To Sheets.Count ' from sheet 2 to last sheet
        'save sheet name/location to string
        Location = Sheets(J).Name

        'set range to be copied
        With Sheets(J).Range("A1").CurrentRegion
            Set rngCopy = .Offset(1, 0).Resize(.Rows.Count - 1)
        End With

        'set range to paste to, beginning with column B
        Set rngPaste = wsNew.Cells(Rows.Count, 2).End(xlUp).Offset(2, 0)

        'copy range and paste to column *B* of combined sheet
        rngCopy.Copy rngPaste

        'enter the location name in column A for all copied entries
        Range(rngPaste, rngPaste.End(xlDown)).Offset(0, -1) = Location

    Next J
End Sub

1 个答案:

答案 0 :(得分:4)

您可以将此代码添加到您的个人宏工作簿中,并对其进行修改,使其作用于ActiveWorkbook。这样,当您运行它时,它将在Excel中选择的任何工作簿上运行。

还值得使用工作簿对象引用来限定所有工作表引用。当你使用(例如):

Sheets("Combined")

然后默认情况下会引用ActiveWorkbook。通常这是你想要的(虽然它可能不是),但是如果(例如)你在代码中打开/激活不同的工作簿,并且其他工作簿现在是你的{{1参考。您可以通过始终明确指出您所指的工作簿来解决此问题:例如 -

Sheets(....)

因此,修改现有代码:

ThisworkBook.Sheets()             'the workbook containing the running code
ActiveWorkbook.Sheets()           'the selected workbook
Workbooks("test.xlsx").Sheets()   'named workbook
wb.Sheets()                       'use a variable set to a workbook object