2017-06-21 5 views
0

最終的にHTMLのテキストドキュメントを作成するために使用されているシートがありますが、これはExcelで開始されます。それは1から何百ものアイテムを持つことができ、各アイテムは3つのフィールド(SKU、Description、Category)、2つのオプション(Bullet、Image)を持っていなければなりません。Excel VBAループバグ

このようになります。シート2 A2 シート2 B2 =「説明」 シート1 B2(記述データ)シート2 A3上の新しい行にシート2 C2 シート1 A2の再コピーにコピー シート2 B3 =「カテゴリ」 シート1 C2(カテゴリデータに シート1 A2コピー)コピーをSheet2にコピーC3

これらは必須フィールドです。 そこから。シート1 D2(弾丸データ) シート2 B4 = "弾丸" シート1 D2コピーシート2 C4にシート2 A4に次にシート1 A2コピーを移入された場合

シート1 E2(画像データ)が取り込まれている場合、次いで、シート2 A5にシート1 A2コピーそこからシート1の第1行の世話をシート2 C5

に シート2 B5 =「IMAGE」 シート1 E2コピーは、私は、シート1の列の各行をループにしたいですAで空のセルに到達するまでAを返します。

これは私が書いたものです。最初の部分は動作します。しかし、それは私に悩まされるループ(Commented block部分)です。私はループで恐ろしいです。現在、私はそれを止めるまで無限ループに入ります。

ガイダンスは大変ありがとうございます。ありがとう。

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

最初に、選択を使用しないでください。https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros 第2に、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、TTESTワーク 暗いように、I列として整数 暗いA2と セットEAP = ThisWorkbook.Worksheets( "EAPData") セットTTEST = ThisWorkbook.Worksheets( "TemplateTest") lastRow =範囲( "A65536")。終了(xlUp)。ロー 'Sheet1からSheet2へのコピー a2 = EAP.Cells(2、1)。バリュー TTest.Cells(2、1).Valueの= A2 「(2 EAP.Cells場合は、LASTROW へのI = 1の場合はタイトル TTest.Cells(2、2).Valueの= "説明" を挿入4)。値 ">" "Then" "何かを作る 終了場合 次はi End Sub'役立つ例 – danieltakeshi

答えて

1

もちろん、あなたのループは永遠に続くでしょう。それを上に置く前に、あなたのコードをデバッグするようにしてください。シートと範囲で作業している行だけを削除していることに注意してください。下記を参照してください。

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

この問題は、2つの方法で回避するのは簡単です。まず、反復可能な制御変数を用意してください。これはつまり、カウンター(i = XからYまで)を使うか、(Yの各Xについて)コレクションを使うかのいずれかでなければなりません。 whileループを使用することはできますが、whileが指す変数を変更する必要があります。

Select,Activateなどの使用を避けることを強くお勧めします。このコードは非効率的でエラーが発生しやすいでしょう。