Excel VBA循环错误

我有一张正在用来创build最终是HTML文本文档的工作表,但是该工作表以Excel开头。 它可以有任何地方从其上的一百个项目,然后每个项目必须有三个领域(SKU,说明,类别),然后两个可选(项目符号,图像)。

它会这样。 Sheet1 A2复制到Sheet2 A2 Sheet2 B2 =“描述”Sheet1 B2(描述数据)复制到Sheet2 C2 Sheet1 A2复制到Sheet2上的新行A3 Sheet2 B3 =“Category”Sheet1 C2(分类数据)复制到Sheet2 C3

那些是强制性的领域。 从那里。

如果填充Sheet 1 D2(Bullet数据),则Sheet1 A2复制到Sheet2 A4 Sheet2 B4 =“Bullet”Sheet1 D2复制到Sheet2 C4

如果填充了工作表1 E2(图像数据),则工作表1 A2复印到工作表2 A5工作表2 B5 =“图像”工作表1 E2复制到工作表2 C5

这需要处理Sheet 1的第一行。从那里,我希望它循环遍历Sheet 1列A中的每一行,直到它到达A中的空单元格为止。

这是我写的。 第一部分工作。 但是这是循环(注释的块部分),使我困惑。 我太可怕了。 目前,它进入了一个永无止境的循环,直到我停止它。

任何指导将非常感激。 谢谢。

Sub MigrateToTemplate() Dim NextSKU As Range Set NextSKU = Worksheets("EAPData").Range("A2").Offset(1, 0) Sheets("EAPData").Select Range("A2").Select ActiveCell.Copy Sheets("TemplateTest").Select Range("A2").Select ActiveCell.PasteSpecial xlPasteValues ActiveCell.Offset(0, 1).Value = "DESCRIPTION" ActiveCell.Offset(0, 2).Value = Sheets("EAPData").Range("C2").Value ActiveCell.Offset(1, 0).Value = Sheets("EAPData").Range("A2").Value ActiveCell.Offset(1, 1).Value = "CATEGORY" ActiveCell.Offset(1, 2).Value = Sheets("EAPData").Range("E2").Value If Sheets("EAPData").Range("A2").Offset(0, 3) <> "" Then Sheets("EAPData").Range("A2").Offset(0, 3).Copy Range("A1").End(xlDown).Offset(1, 0).Select ActiveCell.Value = Range("A2").Value ActiveCell.Offset(0, 1).Value = "BULLET" ActiveCell.Offset(0, 2).PasteSpecial xlPasteValues ActiveCell = WorksheetFunction.Substitute(Selection, Chr(10), " ") Else Range("A1").End(xlDown).Select End If If Sheets("EAPData").Range("A2").Offset(0, 5) <> "" Then Sheets("EAPData").Range("A2").Offset(0, 5).Copy Range("A1").End(xlDown).Offset(1, 0).Select ActiveCell.Value = Range("A2").Value ActiveCell.Offset(0, 1).Value = "IMAGE" ActiveCell.Offset(0, 2).PasteSpecial xlPasteValues Application.CutCopyMode = False Else Sheets("EAPData").Select End If Sheets("EAPData").Select NextSKU.Select 'Do 'ActiveCell.Copy 'Sheets("TemplateTest").Select 'Range("A1").End(xlDown).Offset(1, 0).Select 'ActiveCell.PasteSpecial xlPasteValues 'ActiveCell.Offset(0, 1).Value = "DESCRIPTION" 'ActiveCell.Offset(0, 2).Value = NextSKU.Offset(0, 2).Value 'ActiveCell.Offset(1, 0).Value = NextSKU.Value 'ActiveCell.Offset(1, 1).Value = "CATEGORY" 'ActiveCell.Offset(1, 2).Value = NextSKU.Offset(0, 4).Value 'If NextSKU.Offset(0, 3) <> "" Then ' NextSKU.Offset(0, 3).Copy ' Range("A1").End(xlDown).Offset(1, 0).Select ' ActiveCell.Value = NextSKU.Value ' ActiveCell.Offset(0, 1).Value = "BULLET" ' ActiveCell.Offset(0, 2).PasteSpecial xlPasteValues ' ActiveCell = WorksheetFunction.Substitute(Selection, Chr(10), " ") ' Else ' Range("A1").End(xlDown).Select ' End If 'If NextSKU.Offset(0, 5) <> "" Then ' NextSKU.Offset(0, 5).Copy ' Range("A1").End(xlDown).Offset(1, 0).Select ' ActiveCell.Value = NextSKU.Value ' ActiveCell.Offset(0, 1).Value = "IMAGE" ' ActiveCell.Offset(0, 2).PasteSpecial xlPasteValues ' Application.CutCopyMode = False ' Else ' Sheets("EAPData").Select ' End If 'Sheets("EAPData").Select 'NextSKU.Offset(1, 0).Select 'Loop While NextSKU.Offset(1, 0) <> "" End Sub 

当然,你的循环将永远持续下去。 在把它放在SO上之前,请确保尝试debugging你的代码。 请注意,我只删除了正在使用工作表和范围的行。 见下文:

 Do ' Copy cell, then write some values If NextSKU.Offset(0, 3) <> "" Then ' Copy some more cells and write values Else ' Change the selection End If If NextSKU.Offset(0, 5) <> "" Then ' Copy and Write Else ' Change Sheet selection End If ' Change Range and Sheet Selection ' And right here is the key to your problem. ' Notice that you have only changed values on the sheet, ' as well as the selection, but never 'NextSKU' Loop While NextSKU.Offset(1, 0) <> "" 

这个问题在两个方面很容易避免。 首先,确保你有一些允许迭代的控制variables。 我的意思是,你应该使用一个计数器(对于i = X到Y),或者你应该使用一个集合(对于Y中的每个X)。 你可以使用while循环,但是你必须改变while指向的variables。

我强烈build议您学习如何避免使用SelectActivate等。此代码效率低下且容易出错。