Excel VBA循环错误
我有一张工作表正在用于创建最终为HTML的文本文档,但在Excel中开始。它可以有1到数百个物品,然后每个物品必须有三个字段(SKU,Description,Category),然后是两个可选的(Bullet,Image)。Excel VBA循环错误
它会这样。 Sheet 1中A2拷贝到Sheet A2 Sheet2的B2 = “说明” Sheet 1中B2(描述数据)拷贝到Sheet C2 Sheet 1中A2重新复制到Sheet 2上A3一个新行 Sheet2的B3 = “类别” Sheet 1中C2(第二类数据)复制到Sheet2 C3
这些是必填字段。 从那里。
如果表1 D2(子弹数据)被填充然后Sheet 1中A2拷贝到Sheet A4 Sheet2的B4 = “子弹” Sheet 1中D2拷贝到Sheet C4
如果表1 E2(图像数据)被填充,然后Sheet 1中A2复制到Sheet A5 Sheet2的B5 =“IMAGE” Sheet 1中E2拷贝到Sheet C5
即负责表1的第一行的从那里,我希望它遍历片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上之前尝试调试您的代码。请注意,我只删除了使用表格和范围的线条。见下:
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) <> ""
这个问题很容易在两种方式避免。首先,确保你有一些允许迭代的控制变量。我的意思是,你应该使用一个计数器(对于i = X到Y)或者你应该使用一个集合(对于Y中的每个X)。你可以使用while循环来做这件事,但是你必须改变while指向的变量。
我强烈建议您学习如何避免使用Select
,Activate
等。此代码效率低下且容易出错。
首先,你应该避免使用Select:https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros 第二,你可以使用lastRows来制作一个for循环,如:https://stackoverflow.com/questions/29653616/how-to-know-the-last-row-filled-in-vba-excel – danieltakeshi
你还应该学会[缩进你的代码](http ://rubberduckvba.com/indentation)使它更容易阅读。 –
'子MigrateToTemplate() 昏暗EAP,t检验作为工作表 昏暗我作为整数 昏暗A2作为字符串 集EAP = ThisWorkbook.Worksheets( “EAPData”) 集TTEST = ThisWorkbook.Worksheets( “TemplateTest”) lastRow = Range(“A65536”)。End(xlUp).Row '从Sheet1复制到Sheet2 a2 = EAP.Cells(2,1)。值 TTest.Cells(2,1)。价值= A2 “插入标题 TTest.Cells(2,2)。价值= “描述” 对于i = 1至LASTROW 如果EAP.Cells(2, 4).Value “”Then 'Make something End If Next i End Sub'帮助示例 – danieltakeshi