繁体   English   中英

在VBA中将For循环与计数器一起使用

[英]Using a For Loop with a Counter in VBA

我正在尝试构建一个循环,该循环将从两个单独的工作表中提取数据并将其放入单个表中。 我试图将它放置到行尾的数据,然后向下移动一行并重复直到它到达表的末尾。 ChangesWTD列I以及事实之后的数字。 我只是想获取“ This YearLast Year数据。这是我的编码。

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

这是我的桌子的一个例子。

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

对不起,图像质量不好。 所有列均按应有的方式分解。 我尝试了几种不同的方法来完成此任务。 现在,它将检查最后一年的信息并将其放入正确的列中,但仅用于第一行。 我能得到的任何帮助将不胜感激!

使用Option Explicit ...否则使用如此相似的变量名可能会遇到奇怪的问题。 但这不是你的问题。

您的每个方法实际上都不会根据行更改要写入的单元格。

例如(删除其他代码):

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

此功能将始终设置完全相同的单元格(无论您的循环状态如何),因为其中没有任何内容导致它们在行中偏移。

所以当你打电话

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

我建议将您的功能修改为:

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

然后将正确的偏移值传递给每个偏移值

暂无
暂无

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

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