2017-10-19 3 views
1

こんにちは私は範囲を単一の列にコピーしようとしています。範囲は空白のセルと値のセルが混在しています。値をコピーして貼り付けたいだけで、最初の空白のセルを見つけてそこから列の下を歩きたいと思います。範囲を単一の列にコピー - 値のみ

私は今、(永遠にとっている)ペーストを最初の行に入れています。

Dim i As Integer 
i = 1 

ThisWorkbook.Worksheets("amount date").Select 
For Row = 51 To 100 
    For col = 2 To 1000 
     If Cells(Row, col).Value <> "" Then 
      Cells(Row, col).Copy 
      Worksheets("sheet 2").Range("G" & i).PasteSpecial xlPasteValues 
     End If 
    Next 
Next 

Do While Worksheets("sheet 2").Range("G" & i).Value <> "" 
    i = i + 1 
Loop 

End Sub 
+1

あなたの 'i'ループはあなたの他のループの外にありますので、決して更新されません。 – SJR

+0

サンプルデータ、テーブル構造を提供するので、より具体的なアドバイスを行うことができます。 –

答えて

0

おそらくこれは少し遅くなります(到着が遅いようですが)。

Sub CopyRangeToSingleColumn() 
    ' 20 Oct 2017 

    Dim LastRow As Long 
    Dim LastClm As Long 
    Dim Rng As Range, Cell As Range 
    Dim CellVal As Variant 
    Dim Spike(), i As Long 

    With ThisWorkbook.Worksheets("amount date") 
     With .UsedRange.Cells(.UsedRange.Cells.Count) 
      LastRow = Application.Max(Application.Min(.Row, 100), 51) 
      LastClm = .Column 
     End With 
     Set Rng = .Range(.Cells(51, "A"), .Cells(LastRow, LastClm)) 
    End With 

    ReDim Spike(Rng.Cells.Count) 
    For Each Cell In Rng 
     CellVal = Trim(Cell.Value)    ' try to access the sheet less often 
     If CellVal <> "" Then 
      Spike(i) = CellVal 
      i = i + 1 
     End If 
    Next Cell 

    If i Then 
     ReDim Preserve Spike(i) 
     With Worksheets("sheet 2") 
      LastRow = Application.Max(.Cells(.Rows.Count, "G").End(xlUp).Row, 2) 
      .Cells(LastRow, "G").Resize(UBound(Spike)).Value = Application.Transpose(Spike) 
     End With 
    End If 
End Sub 

上記のコードは、既存のセル値を上書きするのではなく、結果をG列に追加するように変更されました。

+0

こんにちは、これは本当に速いです!複数のワークシート範囲を同じ列UBoundにポストして他のワークシートを上書きしないようにしたい場合は、どうすればよいと思いますか? @Variatus – JRR

+0

シート2の列Gに結果を追加するようにコードを修正したので、その列の既存のデータは後続のプロシージャの実行によって上書きされません。 – Variatus

+0

ブリリアント!、ありがとう! – JRR

1

これは動作します:

Sub qwerty() 
    Dim i As Long, r As Long, c As Long 
    i = 1 

    ThisWorkbook.Worksheets("amount date").Select 
    For r = 51 To 100 
     For c = 2 To 1000 
      If Cells(r, c).Value <> "" Then 
       Cells(r, c).Copy 
       Worksheets("sheet 2").Range("G" & i).PasteSpecial xlPasteValues 
       i = i + 1 
      End If 
     Next 
    Next 
End Sub 
+0

"amount date 2"シートの別の範囲を同じ列 "G"に最後の空白行を見つけようとすると、 "amount date"シートの最初の範囲を貼り付けた後、最初の範囲の「金額日付」と「金額日付2」のデータを比較しますか? – JRR

0

あなたが一つのセル、行ごとに行全体をコピーする必要がありますか?各ループのために速くなければならない。これはうまくいくと思います。

Sub RowToCell() 
Dim rng As Range 
Dim rRow As Range 
Dim rRowNB As Range 
Dim cl As Range 
Dim sVal As String 


Set rng = Worksheets("Sheet3").Range("$B$51:$ALN$100") 'check this range 
For Each rRow In rng.Rows 
    On Error Resume Next 
    Set rRowNB = rRow.SpecialCells(xlCellTypeConstants) 
    Set rRowNB = Union(rRow.SpecialCells(xlCellTypeFormulas), rRow) 
    On Error GoTo 0 

    For Each cl In rRowNB.Cells 
      sVal = sVal & cl.Value 
    Next cl 
    Worksheets("sheet4").Range("G" & rRow.Row - 50).Value = sVal 
    sVal = "" 
Next rRow 


End Sub 

この範囲ではすばやいです。

+0

こんにちは、これは本当に速いです!複数のワークシート範囲を同じ列UBoundにポストして他のワークシートを上書きしないようにしたい場合は、どうすればよいと思いますか? @MarcinSzaleniec – JRR

+0

ワークシート( "sheet4")の範囲( "G"とcells.rows.count)のRange( "G"とrRow.Row - 50).Value = sVal。 End(xlUp).Offset(1,0) – MarcinSzaleniec

関連する問題