创建宏,将excel行从单个工作表转换为新工作表

时间:2012-05-16 23:05:12

标签: excel-vba excel-2007 vba excel

我需要创建一个宏,将excel行从单张表转换为新表。

我有3行标题,后面跟着很多行数据。

我想把这张“Dept”上的每一行放到他们自己的新表中(标题行除外)。在创建的每个新工作表上,我希望重复前3行(标题)并复制格式(如果可能),然后从“部门”工作表中单个对应的行。我还希望将新工作表命名为在A列中输入的值(即下面示例中的天花板灯或壁灯)。

我没有宏观经验,因此我无法从之前的答案中获取代码并尝试将其应用于我的事业。谢谢你的帮助!

       A           B           C          D
  1. dept template // promos // quicklinks // main banner

  2. 在哪里找到//内容插槽//类别//属性

  3. 空白//内容资产// html //英雄形象

  4. 吸顶灯//值//值//值

  5. 壁灯//值//值//值

  6. 楼层灯//值//值//值

  7. 转换为同一工作簿中的3个标题行后面有一行的新工作表:

    名为:Ceiling Lights

    的新工作表
           A           B           C          D
    
    1. dept template // promos // quicklinks // main banner

    2. 在哪里找到//内容插槽//类别//属性

    3. 空白//内容资产// html //英雄形象

    4. 吸顶灯//值//值//值

    5. 名为“壁灯”的新表

             A           B           C          D
      
      1. dept template // promos // quicklinks // main banner

      2. 在哪里找到//内容插槽//类别//属性

      3. 空白//内容资产// html //英雄形象

      4. 壁灯//值//值//值

      5. 这是我到目前为止的代码......

        Sub Addsheets()
        Dim cell As Range
        Dim b As String
        Dim e As String
        Dim s As Integer
        Sheets("Dept").Select
        a = "a4"
        e = Range(a).End(xlDown).Address 'get's address of the last used cell
         'loops through cells,creating new sheets and renaming them based on the cell value
        For Each cell In Range(a, e)
            s = Sheets.Count
            Sheets.Add After:=Sheets(s)
            Sheets(s + 1).Name = cell.Value
        Next cell
        
        Application.CutCopyMode = True
        
        Dim Counter As Long, i As Long
        
        Counter = Sheets.Count
        For i = 1 To Counter
            Sheets("Dept").Cells(1, 3).EntireRow.Copy
            Sheets(i).Cells(1, 3).PasteSpecial
        
        Next i
        
        Application.CutCopyMode = False
        End Sub
        

        我可以根据代码顶部的A列中的单元格来创建和命名新工作表,但是当我尝试添加代码以使前三行(标题行)复制到每个新代码时创建工作表我得到错误9下标超出范围:Sheets(i).Cells(1,3).PasteSpecial。

        不确定如何修复? 另外,有没有办法保留标题格式(列宽)?

1 个答案:

答案 0 :(得分:1)

这是你在尝试的吗?

Option Explicit

Sub Sample()

    Dim ws As Worksheet, tmpSht As Worksheet
    Dim LastRow As Long, i As Long, j As Long

    '~~> Change Sheet1 to the sheet which has all the data
    Set ws = Sheets("Sheet1")

    With ws
        LastRow = .Range("A" & .Rows.Count).End(xlUp).Row

        If LastRow < 4 Then Exit Sub

        For i = 4 To LastRow
            If DoesSheetExist(.Range("A" & i).Value) Then
                Set tmpSht = Sheets(.Range("A" & i).Value)
            Else
                Sheets.Add After:=Sheets(Sheets.Count)
                Set tmpSht = ActiveSheet
                tmpSht.Name = .Range("A" & i).Value
            End If

            .Rows("1:3").Copy tmpSht.Rows(1)

            For j = 1 To 4
                tmpSht.Columns(j).ColumnWidth = .Columns(j).ColumnWidth
            Next j

            .Rows(i).Copy tmpSht.Rows(4)
        Next
    End With
End Sub

Function DoesSheetExist(Sht As String) As Boolean
    Dim ws As Worksheet

    On Error Resume Next
    Set ws = Sheets(ws)
    On Error GoTo 0

    If Not ws Is Nothing Then DoesSheetExist = True
End Function