首页 文章

设置不同工作表上的范围导致错误

提问于
浏览
1

我对VBA很新,想知道是否有人可以帮助我 .

我在工作簿中有2个不同的工作表 .

Sheet(Raw Data) 的成本中心范围为 NameS (单元格BC3为空)

我必须复制 Sheet(CC Template) 并将其命名为 Sheet(Raw Data).Range(BC3).Value 的右5个字符,并将 Cell(2,2).value 更改为 Sheet(Raw Data).Range(BC3).Value ...

然后我希望它转到 Sheet(Raw Data) ... BC4中的下一个单元格并创建第二个工作表并相应地更改名称和单元格(2,2),直到 Sheet(Raw Data) 中的列表结束 .

这是我的代码 . 它创建了第一个工作表,但随后我在Sheets(“原始数据”)获得运行时错误'1004' . 范围(“BC3”) . 在do until循环中选择 . 如果可能的话,我想从代码中删除X和CCName变量 .

Sub CreateCCTabsinNewPlantFile2()

Dim i As Integer
Dim x As Integer
Dim CCName As String
i = ActiveWorkbook.Worksheets.Count
x = 1

' Select cell BC3, *first line of data*.
      Sheets("Raw Data").Range("BC3").Select

      ' Set Do loop to stop when an empty cell is reached.
      Do Until IsEmpty(ActiveCell)

        CCName = ActiveCell.Value

         ' Code to make worksheets
        Worksheets("CC Template").Copy after:=Worksheets(i)
        ActiveSheet.Name = Right(CCName, 5)
        ActiveSheet.Cells(2, 2).Value = CCName

         ' Step down 1 row from present location.
         Sheets("Raw Data").Range("BC3").Select
         ActiveCell.Offset(x, 0).Select
         x = x + 1

      Loop

End Sub

2 回答

  • 0
    Sub CreateCCTabsinNewPlantFile2()
    
    Dim i As Integer
    Dim X As Integer
    
    X = 3 'Starting row in Sheet("Raw Data")
    
    With ThisWorkbook.Sheets("Raw Data")
    
        Do Until .Cells(X, 55).Value = "" 'cells(x,55)= BC3. First time x= 3 so Cells(3,55)=BC3
        i = ThisWorkbook.Worksheets.Count 'we update count everytime, because we are adding new sheets
        ThisWorkbook.Worksheets("CC Template").Copy after:=ThisWorkbook.Worksheets(i)
    
        ThisWorkbook.ActiveSheet.Name = Right(.Cells(X, 55).Value, 5)
        ThisWorkbook.ActiveSheet.Cells(2, 2).Value = .Cells(X, 55).Value
    
         ' We increade X. That makes check a lower rower in next loop.
         X = X + 1
    
        Loop
    
    End With
    End Sub
    

    希望这可以帮助 .

    您会收到error1004,因为您只能在Active Sheet中使用 Range.Select . 如果要在不同的工作表中选择范围,首先必须使用 Sheets("Whatever").Activate 激活该工作表 .

    此外,我更新了您的代码,以便您可以从任何工作表执行它 . 您的代码强制用户将Sheets(“原始数据”)作为ActiveSheet .

    尽量不要使用太多选择是否可以避免 . 而且,尝试习惯 Thisworkbook 而不是 ActiveWorkbook . 如果你总是在同一个工作簿中工作,不是问题,但如果你的宏运行多个工作簿,你需要区别何时使用每个工作簿 .

  • 0

    试试这个代码

    Sub Test()
    Dim rng         As Range
    Dim cel         As Range
    
    With Sheets("Raw Data")
        Set rng = .Range("BC3:BC" & .Cells(Rows.Count, "BC").End(xlUp).Row)
    End With
    
    Application.ScreenUpdating = False
        For Each cel In rng
            If Not SheetExists(cel.Value) Then
                Sheets("CC Template").Copy After:=Sheets(Sheets.Count)
                With ActiveSheet
                    .Name = Right(cel.Value, 5)
                    .Range("B2").Value = cel.Value
                End With
            End If
        Next cel
        Sheets("Raw Data").Activate
    Application.ScreenUpdating = True
    End Sub
    
    Function SheetExists(sheetName As String) As Boolean
    On Error Resume Next
        SheetExists = (LCase(Sheets(sheetName).Name) = LCase(sheetName))
    On Error GoTo 0
    End Function
    

相关问题