2012-02-22 5 views
6

아래 코드는 워크 시트의 끝에 선택한 범위 (rng 전달)를 붙여 넣으려는 것입니다. 이미 2 행 (A1, A2)이 이미 있으면 작동합니다.Excel vba - xlDown

따라서 A1과 A2가있는 경우이 메서드를 100 번 호출하면 100 개의 행이 삽입됩니다. 그러나 행이 없거나 A1 만 있으면 A2를 덮어 씁니다. 나는 동일한 행 (덮어 쓰기)에 쓰기를 능가하는 것을 볼 수 있었다. (덮어 쓰기)

그것이 2 행 미만인지 모를 경우 xlDown이 계산하는 것과 관련이있다.

도움을 주시면 감사하겠습니다.

답변

29

미안하지만 나는 Michael의 답변에 동의하지 않습니다.

End (xlDown)은 Ctrl + Down의 VBA에 해당합니다.

  • 와 빈 컬럼 Ctrl + Down 사용해
  • 1 행, 2 행 1 값이지만 1 행에서 다른
  • 값 2
  • 값 열의 , 3, 7, 8, 9, 13, 14 및 15

이렇게하면 모든 다른 행에 대한 아이디어를 얻을 수 있습니다. Ctrl + Down로 연결됩니다.

Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0)

반드시 마지막으로 사용 된 행을 고려하지 않습니다에 1을 더한

나는 Set newRange = ws.Range("A1").End(xlDown).Offset(1, 0) 빈 열이 일 놀란다. Range("A1").End(xlDown)는 시트의 맨 아래 줄로 이동합니다. .Offset(1, 0)은 시트에서 내려 주려고합니다.

고려 : 열 A가 비어

Dim RowLast As Long 

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
  • 경우 RowLast은 A1이 값을 가지면 1
  • 으로 설정되지만, 다른 셀의 값이되지 않으며 RowLast 1로 설정한다.
  • A 열의 셀 수가 많은 경우 RowLast는 값이있는 맨 아래 행으로 설정됩니다.
  • 마지막 행에 값이 있으면 무시됩니다.
  • 마지막 두 행에 값이 있으면 RowLast는 Rows.Count - 1로 설정됩니다.

나는 당신이 borrom 행에 값이 없다고 가정합니다. 행 1에 빈 열이 비어있는 경우 상관하지 않으면 다음을 수행하십시오.

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
Set NewRange = ws.Cells(RowLast + 1, "A") 

은 시트 ws의 현재 내용에 관계없이 원하는 결과를 제공해야합니다.

당신이 1 행에 관심 않으면

는 당신에게 값의 다른 조합의 효과에 대한 이해를 줄 것이다 Ctrl + Down와 + Up Ctrl 실험, 공백된다.

+5

+1 잘 설명해주세요. 그것이 그렇듯이, 나는 "ws.Range ("A1 ") End (xlDown)"를 사용하여 범위를 설정하는 것에 결코 찬성하지 않았습니다. 이유는, 중간에 빈 셀이 있으면 정확한 범위를주지 않습니다. :) –

+0

토니, 도와 줘서 고마워. 그것은 나를 위해 일했습니다. 첫 번째 부분에 대해서는 왜 그런 식으로했는지, 나는 항목 18 http://support.microsoft.com/kb/291308을 따르고있었습니다. 이것을하는 쉬운 방법을보기 위하여 놀랬다. 감사합니다. – bsr

+0

@SiddharthRout .. 행이 비어있는 경우 마지막 셀이 나빠집니다. 찾는 것이 훨씬 낫지 만 관심 대상 데이터 범위가 비어 있지 않은지 확인하기위한 테스트가 필요합니다. 필요에 따라 [찾기가 쉽습니다] (http://stackoverflow.com/q/4872512/641067) – brettdj

1

오프셋 (offset) 행은 범위의 일부가 아닌 행을 가리키는 것이 문제입니다. 그러나 오프셋이 없으면 값의 실제 마지막 행이됩니다. 따라서 위로부터 아래로 내려 가기보다는 맨 아래에서 위로 올라가십시오.

Go End (Down) 두 번 :이 범위의 끝 부분에 한 번,이 범위에서 벗어나려면 한 번 더. 그런 다음 끝까지 (위로) 이동 한 다음 1을 오프셋합니다.

Sub copyRow(rng As Range, ws As Worksheet) 
    Dim newRange As Range 
    Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0) 
    rng.Copy 
    newRange.PasteSpecial (xlPasteAll) 
End Sub 
+0

나를 위해 작동하지 않는 것 같아요, 그냥 A2, A3에 대한 항목을 만듭니다 (및 A3 이상의 나머지 시간을 씁니다). 나는 테스트 파일을 만들고이 질문에 붙일 것이다. 당신의 도움을 주셔서 감사합니다. – bsr