简体   繁体   中英

Using a For Loop with a Counter in VBA

I am trying to construct a loop that will pull data from two separate sheets and place them into a single table. I was trying to get it to place the data going across the row to the end, then move down one row and repeat until it reaches the end of the table. The Changes and WTD columns I and going to figure after the fact. I am just trying to get the This Year and Last Year data dropped in. here is the coding that I have.

Sub MakeTable()

Application.ScreenUpdating = False

Dim gRange As Range
Dim i As Integer
Dim j As Integer
Dim baseSheet As Worksheet
Dim from1Sheet As Worksheet
Dim from2Sheet As Worksheet
Dim baseBaseCell As Range
Dim baseFrom1Cell As Range
Dim baseFrom2Cell As Range


Set baseSheet = Sheets("Chart")
Set from1Sheet = Sheets("Week")
Set from2Sheet = Sheets("WeekMinusYear")
Set baseBaseCell = Sheets("Chart").Range("B3")
Set baseFrom1Cell = Sheets("Week").Range("C2")
Set baseFrom2Cell = Sheets("WeekMinusYear").Range("C2")




For i = 0 To 4
    For j = 0 To 12

        If i = ((4 Mod 2) <> 0) Then
            setRawData1
        Else
            setRawData2
        End If

    Next j
Next i


End Sub
Function setRawData1()


Dim baseSheet As Worksheet
Dim from1Sheet As Worksheet
Dim from2Sheet As Worksheet
Dim baseBaseCell As Range
Dim baseFrom1Cell As Range
Dim baseFrom2Cell As Range

Set baseSheet = Sheets("Chart")
Set from1Sheet = Sheets("Week")
Set from2Sheet = Sheets("WeekMinusYear")
Set baseBaseCell = Sheets("Chart").Range("B3")
Set baseFrom1Cell = Sheets("Week").Range("C2")
Set baseFrom2Cell = Sheets("WeekMinusYear").Range("C2")


'Sales
baseBaseCell.Offset(0, 0) = baseFrom1Cell.Value 'This Year

'Cost
baseBaseCell.Offset(0, 3) = baseFrom1Cell.Offset(0, 1) 'This Year

'Margin
baseBaseCell.Offset(0, 6) = baseFrom1Cell.Offset(0, 2) 'This Year

'Basis Points
baseBaseCell.Offset(0, 9) = baseFrom1Cell.Offset(0, 3) 'This Year



End Function
Function setRawData2()

Dim baseSheet As Worksheet
Dim from1Sheet As Worksheet
Dim from2Sheet As Worksheet
Dim baseBaseCell As Range
Dim baseFrom1Cell As Range
Dim baseFrom2Cell As Range

Set baseSheet = Sheets("Chart")
Set from1Sheet = Sheets("Week")
Set from2Sheet = Sheets("WeekMinusYear")
Set baseBaseCell = Sheets("Chart").Range("B3")
Set baseFrom1Cell = Sheets("Week").Range("C2")
Set baseFrom2Cell = Sheets("WeekMinusYear").Range("C2")

'Sales
baseBaseCell.Offset(0, 1) = baseFrom2Cell.Value 'Last Year

'Cost
baseBaseCell.Offset(0, 4) = baseFrom2Cell.Offset(0, 1) 'Last Year

'Margin
baseBaseCell.Offset(0, 7) = baseFrom2Cell.Offset(0, 2) 'Last Year

'Basis Points
baseBaseCell.Offset(0, 10) = baseFrom2Cell.Offset(0, 3) 'Last Year

End Function

Here is an example of the table I have.

抱歉,质量很差,但是所有列都像应该的那样被拆分了

Sorry for the poor quality on the image. All the columns are broken up like they should be. I have tried several different methods for accomplishing this. as it is now it will go through and drop the last year information into the correct columns, but for the first row only. Any help I could get would be greatly appreciated!

Use Option Explicit ... otherwise you can run into weird problems with using so similar variable names. But this isn't your issue.

Each of your methods does not actually change the cell it is writing to based on row.

For example (removing additional code):

Function setRawData1()

Set baseFrom1Cell = Sheets("Week").Range("C2")
baseBaseCell.Offset(0, 0) = baseFrom1Cell.Value 'This Year

'Cost
baseBaseCell.Offset(0, 3) = baseFrom1Cell.Offset(0, 1) 'This Year

'Margin
baseBaseCell.Offset(0, 6) = baseFrom1Cell.Offset(0, 2) 'This Year

'Basis Points
baseBaseCell.Offset(0, 9) = baseFrom1Cell.Offset(0, 3) 'This Year

End Function

This function will ALWAYS be setting the exact same cells (regardless as to what your loop status is) because nothing in there ever causes them to be offset in rows.

So when you call

 If i = ((4 Mod 2) <> 0) Then
        setRawData1    'write to same row every time...
    Else
        setRawData2     'write to same row every time...
    End If

I would suggest modifying your functions to be something like:

Function setRawData1(int rowOffset)    
    baseBaseCell.Offset(rowOffset, 0) = baseFrom1Cell.Value 'This Year

    'Cost
     baseBaseCell.Offset(rowOffset, 3) = baseFrom1Cell.Offset(0, 1) 'This Year

    'Margin
    baseBaseCell.Offset(rowOffset, 6) = baseFrom1Cell.Offset(0, 2) 'This Year

    'Basis Points
     baseBaseCell.Offset(rowOffset, 9) = baseFrom1Cell.Offset(0, 3) 'This Year

and then passing the correct offset values to each of them

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