0

我有 3 张工作表:Work、Bill 和 Cust。Cust 列 A 包含我的唯一客户,然后我将其粘贴到工作表上的单元格 A3 上,它在其中运行计算,然后将其粘贴到账单表上。然后,我获取 Cust 表上的下一个值,并将其粘贴回 Work,运行计算并将其粘贴到 Bill 表上的前一组下方。我有 2 个问题。

为什么我的循环不起作用?我想继续前进,直到我的客户名单上的客户用完?为什么我可以在代码的第一部分使用自定义范围 BillPlace,但实际上我必须在后面的部分中引用单元格?提前致谢

Sub test1()
    Dim WorkPlace As Range, BillPlace As Range, WorkProd As Range

    Set WorkPlace = Sheets("Work").Cells(3, 1)
    Set BillPlace = Sheets("Bill").Cells(3, 1)
    Set WorkProd = WorkPlace.CurrentRegion

    WorkPlace.CurrentRegion.Copy
    BillPlace.PasteSpecial xlPasteAll

    Sheets("Cust").Select
    Cells(1, 1).Copy
    WorkPlace.PasteSpecial xlPasteAll

    WorkProd.Copy
    Sheets("Bill").Select
    Range("A3").Select
    Selection.End(xlDown).Select
    Selection.Offset(1, 0).PasteSpecial xlPasteAll
    Sheets("Cust").Select
    Cells(2, 1).Select
    Selection.Offset(1, 0).Select

    Do
        ActiveCell.Offset(1, 0).Copy
        WorkPlace.PasteSpecial xlPasteAll
        WorkProd.Copy
        Sheets("Bill").Select
        Range("A3").Select
        Selection.End(xlDown).Select
        Selection.Offset(1, 0).PasteSpecial xlPasteAll
    Loop Until IsEmpty(ActiveCell.Offset(1, 0))
End Sub
4

3 回答 3

2

@Portland Runner 有一点关于使用For Each/Next循环。通过这样做,您可能可以从上面的工作代码中消除计数器和一堆选择,从而从您的过程中消除一堆复杂性。

For/Next 循环的原理很简单:定义包含要循环的单元格的 TheLargerRange。定义一个 SingleCell 范围以包含您正在使用的当前单元格。然后你可以开始循环说这样的话:

For Each SingleCell in TheLargerRange 
    '~~> your loop actions go here 
Next SingleCell

此外,您可以在不选择工作簿中的特定位置的情况下做很多事情。而是通过仅引用该位置来复制、粘贴或分配值。如果需要,您可以设置变量以在更长的代码中更容易做到这一点。

下面的示例只是将一列客户数据从一个工作表移动到另一个工作表,作为如何使用For Each/Next循环结构以及如何避免选择您使用的所有内容的示例。此代码中只有一个选择,这只是因为如果您End(xldown)尝试在未选择的选项卡上设置范围,编译器会阻塞。否则可能没有选择。

Sub UsingForNextAndAvoidingSelections()

    '~~> Set variables for referencing the "Cust" tab
        Dim CustomerList As Range
        Dim Customer As Range
        Dim CustomerTab As Worksheet

        Set CustomerTab = Sheets("Cust")
        CustomerTab.Select
        Set CustomerList = CustomerTab.Range("A1", Range("A1").End(xlDown))

    '~~> Set variables for referencing the "Bill" tab
        Dim BillTab As Worksheet
        Dim BillRow As Range

        Set BillTab = Sheets("Bill")
        Set BillRow = BillTab.Range("A1")

    '~~> Loop through the customer list, copying each value to the new BillRow location
        For Each Customer In CustomerList
            Customer.Copy
            BillRow.PasteSpecial xlPasteAll
            Set BillRow = BillRow.Offset(1, 0)
        Next Customer

End Sub

2013 年 12 月 27 日:我刚刚意识到为什么在Set CustomerList = CustomerTab.Range("A1", Range("A1").End(xlDown))未选择 CustomerTab 时代码会引发错误:我忘记完全限定该行中的第二个范围语句:Range("A1").End(xlDown).

我相信,如果您像这样限定那行代码,Set CustomerList = CustomerTab.Range("A1", CustomerTab.Range("A1").End(xlDown))您可以消除CustomerTab.Select它之前的代码,并在没有单个Select.

于 2013-10-16T02:18:39.240 回答
1
     WorkProd.Copy
    Sheets("Bill").Select
    Range("A3").Select
    Selection.End(xlDown).Select
    Selection.Offset(1, 0).PasteSpecial xlPasteAll
Loop Until IsEmpty(ActiveCell.Offset(1, 0))

您将到达一列的末尾并向下粘贴一行。然后,您检查下一行的单元格是否为空,但这不会是因为您刚刚粘贴到其中。这就是它不断重复的原因。

我假设您应该在当前光标位置下方的一行以外的地方寻找一个空单元格。

于 2013-10-15T18:50:33.367 回答
0

哈!我修好了它。这不是最正统的方法,但它确实有效。哦,对不起,但我是在生产中这样做的,所以床单的名称和单元格的位置略有变化。CountC 是一个计算客户数量的辅助单元。感谢大家的帮助。

Sub Pull_Billing()
    Dim WorkPlace As Range, BillPlace As Range, WorkProd As Range, PlaceHolder As Range, CountC As Integer, n As Integer


    Set WorkPlace = Sheets("Work").Cells(3, 1)
    Set BillPlace = Sheets("ABS_Billing_Sheet").Cells(3, 1)
    Set WorkProd = WorkPlace.CurrentRegion
    CountC = Sheets("CTA_Info").Cells(1, 5).Value


    Sheets("CTA_info").Cells(2, 2).Copy
    WorkPlace.PasteSpecial xlPasteAll
    WorkPlace.CurrentRegion.Copy
    BillPlace.PasteSpecial xlPasteAll
    Sheets("CTA_Info").Select
    Cells(3, 2).Copy
    WorkPlace.PasteSpecial xlPasteAll


    WorkProd.Copy
    Sheets("ABS_Billing_Sheet").Select
    Range("A3").Select
    Selection.End(xlDown).Select
    Selection.Offset(1, 0).PasteSpecial xlPasteAll


    Sheets("CTA_Info").Select
    Cells(4, 2).Select
    n = ActiveCell.Row
    Do
    Cells(n, 2).Select
    Selection.Copy
    WorkPlace.PasteSpecial xlPasteAll
    WorkProd.Copy
    Sheets("ABS_Billing_Sheet").Select
    Range("A3").Select
    Selection.End(xlDown).Select
    Selection.Offset(1, 0).PasteSpecial xlPasteAll
    Sheets("CTA_Info").Select
    Cells(n + 1, 2).Select
    n = ActiveCell.Row
    Loop Until n > CountC + 2


    Sheets("CTA_info").Cells(2, 2).Copy
    WorkPlace.PasteSpecial xlPasteAll


    Sheets("ABS_Billing_Sheet").Select



    End Sub
于 2013-10-15T22:28:54.680 回答