简体   繁体   中英

Excel VBA - Run-time error 1004

When I run the code below I get the annoying 1004 error.

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

The excel sheet I run this on looks like this: http://i.imgur.com/V7tWTKq.png

The code works for ABC but it doesn't for XYZ. I'm guessing the 0 value cells are messing it up but I don't understand why.

The goal of the code is:

User is prompted to select a range of size DateRangeSize.

For each row in the range the code copies the values of ABC, ABC-D, XYZ and XYZ-D if they aren't 0 and writes them to sheet 2.

If the number of rows in the range is 1, the code works fine. But if the number of rows is greater than 1, I get the 1004 error where this part of the code is highlight:

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

I appreciate the help.

EDIT: I just want to add that the code ALWAYS works for ABC. If the number of rows is 2 then the ABC values for the second row are printed in sheet2 but the code breaks when it attempts to do the same for XYZ.

EDIT 2: I added 0 values to the ABC portion but the code still works for ABC! This is so frustrating.

I figured it out. I defined

    nullcounter = 0
    nullcounterov = 0

    tablelength = 3
    tablelengthov = 3

Outside of the loop so they kept on increasing.

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

Eventually 4 + i << nullcounterov and excel tried to write to a cell that didn't exist.

The fixed code:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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