2011-03-17 3 views
5

셀 범위를 복사하는 방법을 찾고 있지만 값이 들어있는 셀만 복사하는 방법을 찾고 있습니다.셀 범위를 복사하고 데이터가있는 셀만 선택하십시오.

내 Excel 시트에는 A1-A18에서 실행중인 데이터가 있고 B는 비어 있고 C1-C2입니다. 이제 값이 들어있는 모든 셀을 복사하고 싶습니다.

With Range("A1") 
    Range(.Cells(1, 1), .End(xlDown).Cells(50, 3)).Copy 
End With 

이 A1-C50에서 모든 것을 복사합니다,하지만 난 단지 이러한 데이터를 포함하는 것처럼 A1-A18와 C1-C2 볼 복사 할. 그러나 일단 B 또는 내 범위의 데이터를 가져 오면 복사본이 복사되는 방식으로 구성되어야합니다.

'So the range could be 5000 and it only selects the data with a value. 
With Range("A1") 
Range(.Cells(1, 1), .End(xlDown).Cells(5000, 3)).Copy 
End With 

고마워요! 진, 현재 코드


감사 :

Sub test() 

Dim i As Integer 
Sheets("Sheet1").Select 
i = 1 

With Range("A1") 
    If .Cells(1, 1).Value = "" Then 
    Else 
    Range(.Cells(1, 1), .End(xlDown)).Copy Destination:=Sheets("Sheet2").Range("A" & i) 
    x = x + 1 
    End If 
End With 

Sheets("Sheet1").Select 

x = 1 
With Range("B1") 
' Column B may be empty. If so, xlDown will return cell C65536 
' and whole empty column will be copied... prevent this. 
    If .Cells(1, 1).Value = "" Then 
     'Nothing in this column. 
     'Do nothing. 
    Else 
     Range(.Cells(1, 1), .End(xlDown)).Copy Destination:=Sheets("Sheet2").Range("B" & i) 
     x = x + 1 
    End If 
End With 

Sheets("Sheet1").Select 

x = 1 
With Range("C1") 
    If .Cells(1, 1).Value = "" Then 
    Else 
     Range(.Cells(1, 1), .End(xlDown)).Copy Destination:=Sheets("Sheet2").Range("C" & i) 
     x = x + 1 
    End If 
End With 

End Sub 

A1 - A5가 데이터를 포함는 A6는 블랑이고, A7은 데이터를 포함합니다. 그것은 A6에서 멈추고 B 열로 향하고 똑같은 방식으로 계속됩니다.

+0

NB : 귀하의 첫 번째 코드 예제는 범위 A1에서 모든 것을 복사합니다 : C67을, A1 : C50 ... –

+1

당신의 질문은 대답을 한 후에 계속 변화하고 있습니다 ... –

+0

미안 해요 :)하지만 당신은 그들 모두에게 대답했고, 그것에 대해 감사드립니다. – CustomX

답변

5

3 개의 열이 크기가 다르기 때문에 가장 안전한 방법은 하나씩 복사하는 것입니다. PasteSpecial의 바로 가기는 결국 두통의 원인이됩니다.

With Range("A1") 
    Range(.Cells(1, 1), .End(xlDown)).Copy myDestinationRangeA 
End With 

With Range("B1") 
    ' Column B may be empty. If so, xlDown will return cell C65536 
    ' and whole empty column will be copied... prevent this. 
    If .Cells(1, 1).Value = "" Then 
     'Nothing in this column. 
     'Do nothing. 
    Else 
     Range(.Cells(1, 1), .End(xlDown)).Copy myDestinationRangeB 
    EndIf 
End With 

With Range("C1") 
    Range(.Cells(1, 1), .End(xlDown)).Copy myDestinationRangeC 
End With 

지금이 추한이며, 청소기 옵션을 사용하면 많은 열이 있고 같은 순서로 인접한 컬럼에 붙여 넣기하고 특히, 칼럼을 통해 반복하는 것입니다.

Sub CopyStuff() 

    Dim iCol As Long 

    ' Loop through columns 
    For iCol = 1 To 3 ' or however many columns you have 
     With Worksheets("Sheet1").Columns(iCol) 
      ' Check that column is not empty. 
      If .Cells(1, 1).Value = "" Then 
       'Nothing in this column. 
       'Do nothing. 
      Else 
       ' Copy the column to the destination 
       Range(.Cells(1, 1), .End(xlDown)).Copy _ 
        Destination:=Worksheets("Sheet2").Columns(iCol).Cells(1, 1) 
      End If 
     End With 
    Next iCol 

End Sub 

편집 그래서 당신은 현재 셀이 비어있는 경우 확인, 개별 세포를 통해 반복 시도 ... 당신의 질문을 변경하고 복사 할 경우했습니다. 이 테스트,하지만 당신은 생각하지 적이 :이 코드는 iMaxRow가 큰 경우 정말 느려집니다

iMaxRow = 5000 ' or whatever the max is. 
    'Don't make too large because this will slow down your code. 

    ' Loop through columns and rows 
    For iCol = 1 To 3 ' or however many columns you have 
     For iRow = 1 To iMaxRow 

     With Worksheets("Sheet1").Cells(iRow,iCol) 
      ' Check that cell is not empty. 
      If .Value = "" Then 
       'Nothing in this cell. 
       'Do nothing. 
      Else 
       ' Copy the cell to the destination 
       .Copy Destination:=Worksheets("Sheet2").cells(iRow,iCol) 
      End If 
     End With 

     Next iRow 
    Next iCol 

합니다. 내 직감은 당신이 일종의 비효율적 인 방법으로 문제를 해결하려고 노력하고 있다는 것입니다 ... 문제가 계속 변할 때 최적의 전략에 정착하기는 약간 어렵습니다.

+1

이것은 거의 완벽한 진입니다.하지만 일단 빈 셀을 보면 그는 다음 열로 향합니다. 반면에이 빈 셀에는 값이 있습니다. 현재 상황과 함께 주요 질문을 수정했습니다. – CustomX

+0

나도 안다. 그러나 이것은 지금 이상으로 적당하다. 내 코드가 깨끗하지 않거나 최적 일 수는 없다는 것을 알지만, 필요한 작업을 수행하는 한 행복 할 것입니다. P 편집이 제대로 작동 할 때까지 전체 열을 반복하는 것처럼 보입니다. 미리 정의 된 값. 도와 주셔서 대단히 감사합니다 :) – CustomX

+0

빈 셀을 Sheet 2 대상에 복사하지 않으려면 else 행에서 증가하는 새 행 카운터를 만들고, 'cell (newRowCounter, column)'에게 주어진 newRowCounter 값으로 붙여 넣기 만하도록 지시하십시오. – Growler

2

붙여 넣기 특수 기능을 살펴보십시오. 당신을 도울 수있는 '건너 뜀 빈'속성이 있습니다.

+0

그래, 고마워, 내가 시도해 줄게 :) – CustomX

+1

조심해 : PasteSpecial 내 이전 경고에 따라, 모든 위험과 함께, 클립 보드를 사용하도록 강요 ... http://stackoverflow.com/questions/ 5327265/엑셀 - 매크로 - 복사 전까지 - 마지막 데이터 -/5336542 # 5336542 –

+0

좋은 지적, Jean! 그래도 범위 크기 (특히 거대한 것)에 따라 범위 내의 모든 셀을 스캔하는 대신 PasteSpecial을 사용하는 것이 더 좋을 것이라고 생각합니다. –

관련 문제