【问题标题】:Excel VBA - Run-time error 1004Excel VBA - 运行时错误 1004
【发布时间】:2014-07-10 23:17:10
【问题描述】:

当我运行下面的代码时,我得到了恼人的 1004 错误。

Sub TEST_MACRO()
    Dim shSource As Worksheet
    Dim shDest As Worksheet
    Dim DateRange As Range
    Dim i As Integer, nullcounter As Integer, nullcounterov As Integer, tablelength As Integer, tablelengthov As Integer, DateRangeSize As Integer
    Dim q As Integer

    Set shSource = ThisWorkbook.Sheets("Sheet1")
    Set shDest = ThisWorkbook.Sheets("Sheet2")

    Set DateRange = shSource.Application.InputBox("Select date", Type:=8)
    DateRangeSize = DateRange.Rows.Count

    nullcounter = 0
    nullcounterov = 0

    tablelength = 3
    tablelengthov = 3

    For q = 0 To DateRangeSize - 1

        shDest.Range("C4:I17").ClearContents
        'THIS IS THE CODE FOR ABC
        For i = 0 To 3
            If IsEmpty(shSource.Cells(DateRange.Row + q, 2 + i)) = True Or shSource.Cells(DateRange.Row + q, 2 + i) = 0 Then
                nullcounter = nullcounter + 1
            Else
                shDest.Cells(4 + i - nullcounter, 4) = shSource.Cells(DateRange.Row + q, 2 + i)
                shDest.Cells(4 + i - nullcounter, 5) = shSource.Cells(DateRange.Row + q, 6 + i)
                shDest.Cells(4 + i - nullcounter, 3) = shSource.Cells(1, 2 + i)
                tablelength = tablelength + 1
            End If
        Next
        'THIS IS THE CODE FOR XYZ
        For i = 0 To 6
            If IsEmpty(shSource.Cells(DateRange.Row + q, 10 + i)) = True Or shSource.Cells(DateRange.Row + q, 10 + i) = 0 Then
                nullcounterov = nullcounterov + 1
            Else
                shDest.Cells(4 + i - nullcounterov, 8) = shSource.Cells(DateRange.Row + q, 10 + i)
                shDest.Cells(4 + i - nullcounterov, 9) = shSource.Cells(DateRange.Row + q, 17 + i)
                shDest.Cells(4 + i - nullcounterov, 7) = shSource.Cells(1, 10 + i)
                tablelengthov = tablelengthov + 1
            End If
        Next
    Next
End Sub

我运行它的 excel 表如下所示: http://i.imgur.com/V7tWTKq.png

该代码适用于 ABC,但不适用于 XYZ。我猜 0 值单元格搞砸了,但我不明白为什么。

代码的目标是:

提示用户选择大小范围 DateRangeSize。

对于范围内的每一行,代码复制 ABC、ABC-D、XYZ 和 XYZ-D 的值(如果它们不为 0)并将它们写入工作表 2。

如果范围内的行数为 1,则代码可以正常工作。但是如果行数大于1,我会得到1004错误,这部分代码是高亮的:

shDest.Cells(4 + i - nullcounterov, 8) = shSource.Cells(DateRange.Row + q, 10 + i)

感谢您的帮助。

编辑:我只想补充一点,代码始终适用于 ABC。如果行数为 2,则第二行的 ABC 值将打印在 sheet2 中,但在尝试对 XYZ 执行相同操作时代码会中断。

编辑 2:我在 ABC 部分添加了 0 个值,但代码仍然适用于 ABC!这太令人沮丧了。

【问题讨论】:

  • 为该行中的所有变量添加监视,并在发生故障时发布它们是什么。了解 i、nullcounterov 或 q 是否以某种方式引起问题会有所帮助。
  • 这些是添加手表后的值:i.imgur.com/7eJd7NG.png
  • 我想我明白了:如果我是对的,我会编辑。
  • 酷,在这种情况下,您可以输入您的解决方案并将自己标记为已回答!

标签: vba excel


【解决方案1】:

我想通了。我定义了

    nullcounter = 0
    nullcounterov = 0

    tablelength = 3
    tablelengthov = 3

在循环之外,因此它们不断增加。

shDest.Cells(4 + i - nullcounterov, 8) = shSource.Cells(DateRange.Row + q, 10 + i)

最终 4 + i

固定代码:

Sub TEST_MACRO()
    Dim shSource As Worksheet
    Dim shDest As Worksheet
    Dim DateRange As Range
    Dim i As Integer, nullcounter As Integer, nullcounterov As Integer, tablelength As Integer, tablelengthov As Integer, DateRangeSize As Integer
    Dim q As Integer

    Set shSource = ThisWorkbook.Sheets("Sheet1")
    Set shDest = ThisWorkbook.Sheets("Sheet2")

    Set DateRange = shSource.Application.InputBox("Select date", Type:=8)
    DateRangeSize = DateRange.Rows.Count


    For q = 0 To DateRangeSize - 1

    nullcounter = 0
    nullcounterov = 0

    tablelength = 3
    tablelengthov = 3

        shDest.Range("C4:I17").ClearContents
        'THIS IS THE CODE FOR ABC
        For i = 0 To 3
            If IsEmpty(shSource.Cells(DateRange.Row + q, 2 + i)) = True Or shSource.Cells(DateRange.Row + q, 2 + i) = 0 Then
                nullcounter = nullcounter + 1
            Else
                shDest.Cells(4 + i - nullcounter, 4) = shSource.Cells(DateRange.Row + q, 2 + i)
                shDest.Cells(4 + i - nullcounter, 5) = shSource.Cells(DateRange.Row + q, 6 + i)
                shDest.Cells(4 + i - nullcounter, 3) = shSource.Cells(1, 2 + i)
                tablelength = tablelength + 1
            End If
        Next
        'THIS IS THE CODE FOR XYZ
        For i = 0 To 6
            If IsEmpty(shSource.Cells(DateRange.Row + q, 10 + i)) = True Or shSource.Cells(DateRange.Row + q, 10 + i) = 0 Then
                nullcounterov = nullcounterov + 1
            Else
                shDest.Cells(4 + i - nullcounterov, 8) = shSource.Cells(DateRange.Row + q, 10 + i)
                shDest.Cells(4 + i - nullcounterov, 9) = shSource.Cells(DateRange.Row + q, 17 + i)
                shDest.Cells(4 + i - nullcounterov, 7) = shSource.Cells(1, 10 + i)
                tablelengthov = tablelengthov + 1
            End If
        Next
    Next
End Sub

【讨论】:

  • 这就是我认为某处发生的事情。我只是不知道您正在查看多少个空单元格,以及您是否在某个地方变得消极。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多