2017-06-21 131 views
0

我有一张工作表正在用于创建最终为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 
+1

首先,你应该避免使用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

+1

你还应该学会[缩进你的代码](http ://rubberduckvba.com/indentation)使它更容易阅读。 –

+0

'子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

回答

1

当然,你的循环将永远持续下去。请务必在将它放在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指向的变量。

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