繁体   English   中英

Excel VBA-运行时错误1004

[英]Excel VBA - Run-time error 1004

当我运行下面的代码时,我会收到令人讨厌的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! 这真令人沮丧。

我想到了。 我定义

    nullcounter = 0
    nullcounterov = 0

    tablelength = 3
    tablelengthov = 3

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

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

最终4 + i << nullcounterov和excel试图写入一个不存在的单元格。

固定代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM