使用变量选择范围,运行时错误1004

时间:2018-02-18 11:17:07

标签: excel excel-vba vba

VBA不断给出运行时错误'1004':以下代码片段的应用程序定义或对象定义错误;

Sub deneme()

    Dim a As Long
    Dim b As Integer

    For a = 12 To 13

        For b = 2 To 3

            Sheets(2).Select

            ActiveSheet.Cells(a, 1).Select

            Sheets.Add After:=Sheets(Sheets.Count)

            ActiveSheet.Name = Worksheets(2).Cells(a, 1).Value & " " & Left(Worksheets(2).Cells(a, 2).Value, 18)

            ActiveSheet.Range("A1:D1").Select

            Selection.Merge

            ActiveCell.Select

            ActiveCell.FormulaR1C1 = Worksheets(2).Cells(a, 1).Value

            With Selection
                .HorizontalAlignment = xlCenter
            End With

            Sheets(Sheets.Count).Select

            ActiveSheet.Range(Cells(b, 1), Cells(b, 2)).Select

            Selection.Merge

            ActiveCell.Select

            ActiveCell.FormulaR1C1 = Worksheets(2).Cells(8, b + 1)

            With Selection
                .HorizontalAlignment = xlCenter
            End With

            ActiveSheet.Range(Cells(b, 3), Cells(b, 4)).Select

            Selection.Merge

            ActiveCell.Select

            ActiveCell.FormulaR1C1 = Worksheets(2).Cells(a, b + 1).Value

            With Selection
                .HorizontalAlignment = xlCenter
            End With

        Next b
    Next a
End Sub

两个不同的变量a和b在分离时正常工作,但是当我将它们写在一起时,vba会产生1004错误。

我使用代码获取不同的值并将它们安排在新的工作表中。这只是之前正常工作的一小部分。

1 个答案:

答案 0 :(得分:0)

这一行是问题所在:

 ActiveSheet.Name = Worksheets(2).Cells(a, 1).Value & " " & Left(Worksheets(2).Cells(a, 2).Value, 18)

你把它放在里面:

For b = 2 To 3

 Next b

由于您没有考虑b的第二个循环,因此您尝试创建一个具有相同名称的工作表,从而导致错误。你需要找到一种方法来解释你用b做两个循环的事实而不是外部循环 - 你需要考虑它。

我想你可能想把所有不涉及b的东西,包括表格添加和名字,移到b循环之前。

有点像,但没有看到你的数据很难:

Option Explicit

Public Sub deneme()

    Dim a As Long
    Dim b As Integer

    For a = 12 To 13

        Sheets(2).Select

        ActiveSheet.Cells(a, 1).Select

        Sheets.Add After:=Sheets(Sheets.Count)

        ActiveSheet.Name = Worksheets(2).Cells(a, 1).Value & " " & Left(Worksheets(2).Cells(a, 2).Value, 18)

        ActiveSheet.Range("A1:D1").Select

        Selection.Merge

        ActiveCell.Select

        ActiveCell.FormulaR1C1 = Worksheets(2).Cells(a, 1).Value

        With Selection
            .HorizontalAlignment = xlCenter
        End With

        For b = 2 To 3

            Sheets(Sheets.Count).Select

            ActiveSheet.Range(Cells(b, 1), Cells(b, 2)).Select

            Selection.Merge

            ActiveCell.Select

            ActiveCell.FormulaR1C1 = Worksheets(2).Cells(8, b + 1)

            With Selection
                .HorizontalAlignment = xlCenter
            End With

            ActiveSheet.Range(Cells(b, 3), Cells(b, 4)).Select

            Selection.Merge

            ActiveCell.Select

            ActiveCell.FormulaR1C1 = Worksheets(2).Cells(a, b + 1).Value

            With Selection
                .HorizontalAlignment = xlCenter
            End With

        Next b
    Next a
End Sub

主要:在尝试命名工作表之前,您应该为existence of a sheet name添加测试。如果A列中的不同行导致您尝试创建具有相同名称的工作表,会发生什么?

之后,您应该开始考虑使用工作表变量,避免.Select,使用With语句和Option Explicit,查看.FormulaR1C1可以应用于整个范围而不是循环到当前的ActiveCell并将重复的代码行拉出到函数中。也可以使用键入的函数Left$而不是Left

我发布的代码还取决于您实际想要发生的事情,如果出现相同的工作表名称..您是要创建新名称还是想要使用现有工作表?工作表上的所有填充错误处理和工作表的测试都可以处理。