2016-10-07 25 views
1

こんにちは私は、セルの名前、データの最後に空白になるまでループする別のシートに行を移動するコードを持っています。ここでコードの抽出。コードのこの部分が実行されているの最新のインスタンスに罰金の前に働いている間 VBAタイプの不一致エラーDo While ActiveCell.Value <> ""

Range("AF2").Select 
Do While ActiveCell.Value <> "" 
    strDestinationSheet = ActiveCell.Value 
    ActiveCell.Offset(0, -31).Resize(1, ActiveCell.CurrentRegion.Columns.count).Select 
    Selection.Copy 

    Sheets(strDestinationSheet).Select 
    N = Cells(Rows.count, "AF").End(xlUp).Row 
    lastRow = N 

    Cells(lastRow + 1, 1).Select 
    Selection.PasteSpecial xlPasteValues 
    Application.CutCopyMode = False 

    Sheets(strSourceSheet).Select 
    ActiveCell.Offset(0, 31).Select 
    ActiveCell.Offset(1, 0).Select 
Loop 

は、しかし、それは今、二行目んがActiveCell.Value <>「」、と言っ型の不一致のエラーをスローします。私は突然この作業を停止するために何が変わったのか分かりません。どうもありがとう。

+2

おそらく、いずれかのセルにエラーがあります。 –

+0

ありがとうScott実際には列に#N/Asがありますが、これに遭遇したときにスキップするエラートラップを置くことはできますか?どこに行く必要がありますか? – jrb2b

+2

( '.Select'を使わないでください)(http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – BruceWayne

答えて

4

個人的には、Doループを使用してセルのグループを反復処理するのが嫌いです。私はFor Eachループが好きです。

また、@ bruceWayneで述べたように、Selectを使用するとコードが遅くなることは避けてください。

適切なインデントを行うと、コードを読みやすくなり、簡単な間違いを避けることができます。

Dim cel As Range 
With Sheets(strSourceSheet) 
    For Each cel In .Range("AF2", .Range("AF2").End(xlDown)) 
     If Not IsError(cel) Then 
      strDestinationSheet = cel.Value 
      cel.Offset(0, -31).Resize(1, cel.CurrentRegion.Columns.Count).Copy 
      N = Sheets(strDestinationSheet).Cells(Sheets(strDestinationSheet).Rows.Count, "AF").End(xlUp).Row 
      Sheets(strDestinationSheet).Cells(N + 1, 1).PasteSpecial xlPasteValues 
     End If 
    Next cel 
End With