EXCEL-VBA记录的宏给出了运行时错误“ 1004”

时间:2018-09-02 20:32:47

标签: excel vba excel-vba

我做了一个简短的VBA代码,该代码基本上只是在单元格内自动拟合文本/内容。我记录了此宏,然后对其进行了重新制作,以使代码可以遍及整个工作表:

Sub Macro3()
    Dim lastRowIndex As Integer
    Dim rowIndex As Integer
    lastRowIndex = 2600

For rowIndex = 0 To lastRowIndex
    If ActiveSheet.Cells(rowIndex, 1).Value <> "" Then
        If ActiveSheet.Rows(rowIndex).RowHeight < 10.7 Then
            If ActiveSheet.Rows(rowIndex).RowHeight > 8 Then
                ActiveSheet.Rows(rowIndex).Select
                With Selection
                    .HorizontalAlignment = xlGeneral
                    .VerticalAlignment = xlBottom
                    .WrapText = True
                    .Orientation = 0
                    .AddIndent = False
                    .IndentLevel = 0
                    .ShrinkToFit = False
                    .ReadingOrder = xlContext
                    .MergeCells = False
                End With
                Selection.Rows.AutoFit
            End If
        End If
    End If
Next rowIndex

End Sub

应用程序在IF条件下停止。它们在那里是因为我不想影响所有单元,只是我需要修改的那些单元。

当我尝试运行此代码时,它给我一个运行时错误“ 1004”-应用定义或对象定义的错误。我不知道为什么...

我尝试将Option Explicit放在代码上方,因为我在某处阅读了该内容,然后为您提供了有关该错误的更详细的信息,但这似乎也不起作用。我以前从未真正使用过VBA,所以不知道发生错误的原因是什么。

(为什么上面的代码的一部分向左移动?我无法修复它)

2 个答案:

答案 0 :(得分:0)

CELLS()索引从1开始,因此:

For rowIndex = 1 To lastRowIndex

(可能还有其他错误。)

答案 1 :(得分:0)

  1. 在代码顶部使用Option Explicit
  2. 给您的子对象一个有意义的名字
  3. 如前所述,从1开始循环
  4. 使用显式工作表引用(非活动表),并将其保存在With语句中,然后在其中使用点运算符
  5. 使用vbNullString而不是空字符串文字""可以更快地进行比较
  6. If条件合并为一行以减少嵌套并提高可读性
  7. 使用With语句保留对当前行的引用
  8. 在处理行时使用Long而不是Integer,将来可能会有更大的数字溢出的风险
  9. 当前lastRowIndex是一个常量,因此应这样声明

代码:

Option Explicit
Public Sub FormatRows()
    Const lastRowIndex As Long = 2600
    Dim rowIndex As Long

    With ThisWorkbook.Worksheets("Sheet1")
        For rowIndex = 1 To lastRowIndex
            If Not .Cells(rowIndex, 1).Value <> vbNullString Then
                If .Rows(rowIndex).RowHeight > 8 And .Rows(rowIndex).RowHeight < 10.7 Then
                    With .Rows(rowIndex)
                        .HorizontalAlignment = xlGeneral
                        .VerticalAlignment = xlBottom
                        .WrapText = True
                        .Orientation = 0
                        .AddIndent = False
                        .IndentLevel = 0
                        .ShrinkToFit = False
                        .ReadingOrder = xlContext
                        .MergeCells = False
                        .AutoFit
                    End With
                End If
            End If
        Next
    End With
End Sub