我发臭了

我有3张纸:工作,账单和客户。 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 

@Portland Runner有一个关于使用For Each / Next循环的观点。 通过这样做,您可能会消除计数器,并从上面的工作代码中select一堆,从您的stream程中消除一些复杂性。

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

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

另外,您可以在工作簿中select特定的位置来做很多事情。 而是通过引用位置来复制,粘贴或分配值。 如果你愿意的话,你可以设置variables来使得代码变长。

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

 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 

12/27/2013:我刚刚意识到为什么代码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

  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)) 

你将要进入一个专栏的末尾,并进一步向下粘贴一行。 然后检查下一行的单元格是否为空,但这不会是因为你刚粘贴了它。 这就是为什么它无止境地重演。

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

哈! 我修好了它。 这不是最正统的做法,但它的工作。 哦原谅我,但我在生产中,所以表单和单元格的名称略有改变。 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