【问题标题】:Why Does This VBA Code Cause Duplicate Entries为什么此 VBA 代码会导致重复条目
【发布时间】:2014-02-26 09:37:26
【问题描述】:

这是我在这个网站上的第一个查询,我只是偶尔使用 VBA。下面的代码可能不是很优雅,但确实有效。

我有一个 Excel 工作簿,它是我自己设计的,本质上是一个会计工具。该工作簿有一个“日志”表,我将每笔交易都发布到该表中。在运行 VBA 代码时,每笔交易都会过帐到指定的帐户(或工作表)。一个子例程发布我称之为“一般交易”的内容,而另一个发布我称之为“账户间转账”的内容,即将从一个账户开始的交易转移到另一个账户——因此第一个账户有借方,第二个账户有贷方.账户间转账例程在一般事务例程之后运行,因此过帐总是会在所有一般事务之后立即出现在行上。我还有一个例程可以在其余例程运行之前清除所有帐户工作表的内容。

我遇到的问题是“借记”账户间转账。当我第一次运行完整代码时,一切正常,账户间转账借记出现在它应该出现的位置 - 在最后一次一般交易下方。如果我再次运行它,尽管该运行清除了 Account 表上的所有内容,但 Inter Account Transfer 会出现两次,如果我再次运行它会出现 3 次,等等。但是,如果有更多交易在帐户的借方。在信用方面也根本不会发生这种情况。

帐户表有六列 - A 到 F,定义如下: A = '日期 (Cr)', B = '描述/子类别 (Cr)', C = '金额 (Cr)', D = '日期 (Dr)', E = '描述/子类别(博士)',F = '金额(博士)'。

我使用的代码如下所示 - 而不是全部显示,我只是展示了来自贷方和借方每一方的一个项目的例程。

'DESCRIPTION/SUB-CATEGORY (Cr)
With Sheets(strWSJournal)
    I = 1
    LASTROW = .Range("A" & Rows.Count).End(xlUp).Row
    Set MyRG = .Range("B2:B" & LASTROW)
        For Each F In MyRG
            strWSGoToSheet = F.Offset(0, 1)

             With Sheets(strWSGoToSheet)
                LASTROW2 = .Range("B" & Rows.Count).End(xlUp).Row
            End With


                If (F.Value = strInterAcTran) Then
                    Sheets(strWSGoToSheet).Cells(LASTROW2 + I, "B") = F.Offset(0, 2)
                End If
        Next F
End With



'DESCRIPTION/SUB-CATEGORY (Dr)
With Sheets(strWSJournal)
    I = 1
    LASTROW = .Range("K" & Rows.Count).End(xlUp).Row
    Set MyRG = .Range("L2:L" & LASTROW)
        For Each F In MyRG
            strWSGoToSheet = F.Offset(0, 1)

            With Sheets(strWSGoToSheet)
                LASTROW2 = .Range("E" & Rows.Count).End(xlUp).Row
            End With


                If (F.Value = strInterAcTran) Then
                    Sheets(strWSGoToSheet).Cells(LASTROW2 + I, "E") = F.Offset(0, 2)
                    'I = I + 1
                End If
        Next F
End With

可以看出,除了单元格引用之外,代码是相同的,所以我不明白出了什么问题。如果需要更多信息来帮助我解决此问题,请告诉我。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您忘记指定要在每个 .Range(...& rows.count) 处计算行数的工作表

    将其更改为 .range(... & .rows.count)

    基本上,在每个 rows.count 之前添加一个点。

    【讨论】:

    • 谢谢帕特里克,但不确定你的意思。我没有通过声明“With Sheets(strWSGoToSheet)”来指定工作表吗?
    • 只有当你写成“.rows.count”而不是“rows.count”时,“with”才适用
    • 再次感谢帕特里克。很抱歉在您第一次回复后如此昏暗 - 不明白您对“。”的看法。在“行”之前。但是,我已经尝试过了,但我仍然得到相同的结果。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多