【问题标题】:Excel VBA Macro - Set Row Variables On Separate Sheets Equal to Each OtherExcel VBA宏 - 在单独的工作表上设置行变量彼此相等
【发布时间】:2016-02-26 19:29:24
【问题描述】:

我发现了与我的问题非常相似的问题和答案,但没有解决我的具体问题。用我的宏我想说:

如果“M”列,分析工作表上的第 6 行不为空且“B”列第 6 行和“C”列第 6 行和“D”列第 6 行(全部在分析工作表上)为空且“列” C" 固定成本测试数据工作表上的第 6 行不为空,并且固定成本测试数据上的“C”列第 6 行的值 >= 今天的日期,那么我想要分析中第 6 行的“M”列的值要计算的工作表:

Sheets("Analysis Worksheet").Range("M" & i).Value = (Sheets("Analysis Worksheet").Range("M" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) - ((Sheets("Analysis Worksheet").Range("M" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) * (Sheets("Analysis Worksheet").Range("E" & i).Value * 0.01))

我想要 i = j。 i 和 j 是相同的数字/相同的行。

我需要在我的代码中进行哪些更改,以便在分析工作表上对一行执行计算时,它使用固定成本测试数据工作表上的相同行的值,并且行在向下移动时保持“同步”一起工作表?

这是我的宏代码:

Sub ReduceCost_Percentage()

    With Worksheets("Analysis Worksheet")

        Dim i As Long
        Dim LastRow As Long
        LastRow = Range("X" & Rows.Count).End(xlUp).Row

        Dim j As Long
        j = i
        Dim LRow As Long
        LRow = Worksheets("Fixed Cost Test Data").Range("C" & Rows.Count).End(xlUp).Row

        For i = 5 To LastRow
            For j = i To i

                If Sheets("Analysis Worksheet").Range("E" & i).Value > 0 And IsEmpty(Sheets("Analysis Worksheet").Range("B" & i).Value) _
                   And IsEmpty(Sheets("Analysis Worksheet").Range("C" & i).Value) And IsEmpty(Sheets("Analysis Worksheet").Range("D" & i).Value) _
                   And Not IsEmpty(Sheets("Analysis Worksheet").Range("M" & i).Value) And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("C" & j).Value) And (Date >= Worksheets("Fixed Cost Test Data").Range("C" & j).Value) Then

                    Sheets("Analysis Worksheet").Range("M" & i).Value = (Sheets("Analysis Worksheet").Range("M" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) - ((Sheets("Analysis Worksheet").Range("M" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) * (Sheets("Analysis Worksheet").Range("E" & i).Value * 0.01))

                ElseIf Sheets("Analysis Worksheet").Range("E" & i).Value > 0 And IsEmpty(Sheets("Analysis Worksheet").Range("B" & i).Value) _
                       And IsEmpty(Sheets("Analysis Worksheet").Range("C" & i).Value) And IsEmpty(Sheets("Analysis Worksheet").Range("D" & i).Value) _
                       And Not IsEmpty(Sheets("Analysis Worksheet").Range("M" & i).Value) And (IsEmpty(Worksheets("Fixed Cost Test Data").Range("C" & j).Value) Or Worksheets("Fixed Cost Test Data").Range("C" & j).Value > Date) Then

                    Sheets("Analysis Worksheet").Range("M" & i).Value = Sheets("Analysis Worksheet").Range("M" & i).Value - (Sheets("Analysis Worksheet").Range("M" & i).Value * (Sheets("Analysis Worksheet").Range("E" & i).Value * 0.01))

                End If

            Next j
        Next i

        For i = 5 To LastRow
            For j = i To i

                If Sheets("Analysis Worksheet").Range("E" & i).Value > 0 And IsEmpty(Sheets("Analysis Worksheet").Range("B" & i).Value) _
                   And IsEmpty(Sheets("Analysis Worksheet").Range("C" & i).Value) And IsEmpty(Sheets("Analysis Worksheet").Range("D" & i).Value) _
                   And Not IsEmpty(Sheets("Analysis Worksheet").Range("N" & i).Value) And Not IsEmpty(Sheets("Fixed Cost Test Data").Range("C" & j).Value) And (Date >= Sheets("Fixed Cost Test Data").Range("C" & j).Value) Then

                    Sheets("Analysis Worksheet").Range("N" & i).Value = (Sheets("Analysis Worksheet").Range("N" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) - ((Sheets("Analysis Worksheet").Range("N" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) * (Sheets("Analysis Worksheet").Range("E" & i).Value * 0.01))

                ElseIf Sheets("Analysis Worksheet").Range("E" & i).Value > 0 And IsEmpty(Sheets("Analysis Worksheet").Range("B" & i).Value) _
                       And IsEmpty(Sheets("Analysis Worksheet").Range("C" & i).Value) And IsEmpty(Sheets("Analysis Worksheet").Range("D" & i).Value) _
                       And Not IsEmpty(Sheets("Analysis Worksheet").Range("N" & i).Value) And (IsEmpty(Sheets("Fixed Cost Test Data").Range("C" & j).Value) Or Sheets("Fixed Cost Test Data").Range("C" & j).Value > Date) Then

                    Sheets("Analysis Worksheet").Range("N" & i).Value = Sheets("Analysis Worksheet").Range("N" & i).Value - (Sheets("Analysis Worksheet").Range("N" & i).Value * (Sheets("Analysis Worksheet").Range("E" & i).Value * 0.01))

                End If

            Next j
        Next i

        '....Continues until Cell "X"

    End With
End Sub

【问题讨论】:

  • tl;dr 但如果你想要同一行,从同一行开始并平均递增?
  • @findwindow,您能否详细说明您的答案?你所说的“平均增加”是什么意思?
  • 看起来你已经是了。 For j = i To i 如果i=5,那么你在做j=5 to 5 不是吗?编辑:我认为你只需要第三个增量变量。
  • 你没有实例化你的变量。首次分配j = i 时,i 为空。

标签: excel macros vba


【解决方案1】:

有几件事:当您使用“with”块(例如With Worksheets("Analysis Worksheet"))时,您可以从该块中的几乎所有代码中省略它。另外,For j = i To i 什么也不做,它在启动时就完成了。您可能想使用 Lrow。

也许这会更好:

Sub ReduceCost_Percentage()

    With Worksheets("Analysis Worksheet")

        Dim i As Long
        Dim LastRow As Long
        LastRow = Range("X" & Rows.Count).End(xlUp).Row

        Dim j As Long
        Dim LRow As Long
        LRow = Worksheets("Fixed Cost Test Data").Range("C" & Rows.Count).End(xlUp).Row

        For i = 5 To LastRow
            For j = i To LRow

                If .Range("E" & i).Value > 0 And IsEmpty(.Range("B" & i).Value) _
                   And IsEmpty(.Range("C" & i).Value) And IsEmpty(.Range("D" & i).Value) _
                   And Not IsEmpty(.Range("M" & i).Value) And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("C" & j).Value) And (Date >= Worksheets("Fixed Cost Test Data").Range("C" & j).Value) Then

                    .Range("M" & i).Value = (.Range("M" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) - ((.Range("M" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) * (.Range("E" & i).Value * 0.01))

                ElseIf .Range("E" & i).Value > 0 And IsEmpty(.Range("B" & i).Value) _
                       And IsEmpty(.Range("C" & i).Value) And IsEmpty(.Range("D" & i).Value) _
                       And Not IsEmpty(.Range("M" & i).Value) And (IsEmpty(Worksheets("Fixed Cost Test Data").Range("C" & j).Value) Or Worksheets("Fixed Cost Test Data").Range("C" & j).Value > Date) Then

                    .Range("M" & i).Value = .Range("M" & i).Value - (.Range("M" & i).Value * (.Range("E" & i).Value * 0.01))

                End If

            Next j
        Next i

        For i = 5 To LastRow
            For j = i To LRow

                If .Range("E" & i).Value > 0 And IsEmpty(.Range("B" & i).Value) _
                   And IsEmpty(.Range("C" & i).Value) And IsEmpty(.Range("D" & i).Value) _
                   And Not IsEmpty(.Range("N" & i).Value) And Not IsEmpty(Sheets("Fixed Cost Test Data").Range("C" & j).Value) And (Date >= Sheets("Fixed Cost Test Data").Range("C" & j).Value) Then

                    .Range("N" & i).Value = (.Range("N" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) - ((.Range("N" & i).Value - Sheets("Fixed Cost Test Data").Range("B" & j).Value) * (.Range("E" & i).Value * 0.01))

                ElseIf .Range("E" & i).Value > 0 And IsEmpty(.Range("B" & i).Value) _
                       And IsEmpty(.Range("C" & i).Value) And IsEmpty(.Range("D" & i).Value) _
                       And Not IsEmpty(.Range("N" & i).Value) And (IsEmpty(Sheets("Fixed Cost Test Data").Range("C" & j).Value) Or Sheets("Fixed Cost Test Data").Range("C" & j).Value > Date) Then

                    .Range("N" & i).Value = .Range("N" & i).Value - (.Range("N" & i).Value * (.Range("E" & i).Value * 0.01))

                End If

            Next j
        Next i

        '....Continues until Cell "X"

    End With
End Sub

【讨论】:

  • 谢谢n8!我发现我的代码的问题是日期函数。我有Date >= Sheets("Fixed Cost Test Data").Range("C" & j).Value Then 的地方应该有`TodayDate >= Worksheets("Fixed Cost Test Data").Range("C" & i).Value Then'。
【解决方案2】:

注意:我将其发布为答案,因为它太长而无法放入评论框中。

谢谢n8!我发现我的代码的问题是 Date 函数,我不需要为我的第二个工作表上的行号使用单独的变量 (j)。在我有Date >= Sheets("Fixed Cost Test Data").Range("C" & j).Value Then 的地方,我应该有TodayDate >= Worksheets("Fixed Cost Test Data").Range("C" & i).Value Then。我的新工作代码是:

Sub ReduceCost_Percentage()

With Worksheets("Analysis Worksheet")

Dim i As Long
Dim LastRow As Long
LastRow = Range("X" & Rows.Count).End(xlUp).Row

Dim TodayDate As Date
TodayDate = Format(Date, "DD/MM/YYYY")

For i = 5 To LastRow
 If .Range("E" & i).Value > 0 And IsEmpty(.Range("B" & i).Value) _
 And IsEmpty(.Range("C" & i).Value) And IsEmpty(.Range("D" & i).Value) _
 And Not IsEmpty(.Range("M" & i).Value) And Not IsEmpty(Worksheets("Fixed Cost Test Data").Range("C" & i).Value) _
 And TodayDate >= Worksheets("Fixed Cost Test Data").Range("C" & i).Value Then
  .Range("M" & i).Value = (.Range("M" & i).Value - Worksheets("Fixed Cost Test Data").Range("B" & i).Value) - ((.Range("M" & i).Value - Worksheets("Fixed Cost Test Data").Range("B" & i).Value) * (.Range("E" & i).Value * 0.01))
 ElseIf .Range("E" & i).Value > 0 And IsEmpty(.Range("B" & i).Value) _
 And IsEmpty(.Range("C" & i).Value) And IsEmpty(.Range("D" & i).Value) _
 And Not IsEmpty(.Range("M" & i).Value) And (IsEmpty(Worksheets("Fixed Cost Test Data").Range("C" & i).Value) Or Worksheets("Fixed Cost Test Data").Range("C" & i).Value > Date) Then
  .Range("M" & i).Value = .Range("M" & i).Value - (.Range("M" & i).Value * (.Range("E" & i).Value * 0.01))
 End If
Next I

谢谢!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多