2017-03-14 1 views
0

4 개의 시트가있는 Excel 통합 문서가 있습니다.VBA를 사용하여 한 시트에서 다른 시트로 데이터 이동

  1. test_1
  2. test_2
  3. test_3

내가 매크로를 작성하여 수행 한 모든 다른 시트에 마스터 시트에서 데이터를 이동하려는 마스터 시트. 매일 마스터 시트 데이터가 증가하므로이 변경 사항을 매크로에 어떻게 수용 할 수 있습니까? 내가 B10에서 시작 M1628에서 끝 마스터 시트의 하드 코딩 범위 값을 언급 한 위의 코드에서

Sub sbCopyRangeToAnotherSheet() 
    Sheets("Master").Range("B10:M1628").Copy 
    Sheets("test_1").Activate 
    Range("B9").Select 
    ActiveSheet.Paste 
    Application.CutCopyMode = Flase 
End Sub 


Sub sbCopyRangeToCRP2() 
    Sheets("Master").Range("B10:M1628").Copy 
    Sheets("test_2").Activate 
    Range("B9").Select 
    ActiveSheet.Paste 
    Application.CutCopyMode = Flase 
End Sub 


Sub sbCopyRangeToCRP3() 
    Sheets("Master").Range("B10:M1628").Copy 
    Sheets("test_3").Activate 
    Range("B9").Select 
    ActiveSheet.Paste 
    Application.CutCopyMode = Flase 
End Sub 

:

내가 아래에있는 내 기존 코드를 붙여 넣은.

앞으로 행 수가 증가합니다 ** (B10 범위가 유지됩니다) ** 그리고 범위를 하드 코딩하고 싶지 않습니다. 이것을 어떻게 할 수 있습니까?

답변

1

내가 제안 매개 변수로 워크 시트를 제공하여 사용자가 다시 사용할 수있는 한 이러한 3 잠수정을 결합하는 것은 :

Sub sbCopyRangeToAnotherSheet(ToSheet As Worksheet) 
    Dim LastUsedRow As Long 

    With Sheets("Master") 
     LastUsedRow = .UsedRange.Row + .UsedRange.Rows.Count - 1 
     .Range("B10:M" & LastUsedRow).Copy ToSheet.Range("B9") 
    End With 

    Application.CutCopyMode = False 
End Sub 

은 그럼 당신은

같은 모든 시트 이름이 하위를 실행할 수 있습니다
Sub test_1() 
    sbCopyRangeToAnotherSheet Sheets("test_1") 
    'and for the second sheet 
    sbCopyRangeToAnotherSheet Sheets("test_2") 
End Sub 
+1

감사합니다. @Peh, 효과가있었습니다. – 0537

+0

'LastUsedRow = .UsedRange.Rows.Count' :'UsedRange'는 코드가 가정 할 때 항상 1 행에서 시작하지 않습니다. –

+2

LastUsedRow = .UsedRange.Rows.Count는 LastUsedRow = .UsedRange.Row + .UsedRange.Rows 여야합니다.백작 - 1 – z32a7ul

1

내가 제안 중 하나를 시트의 데이터가 같은 성장함에 따라 워크 시트 개체의 UsedRange 재산,

또는 자동으로 확장 시트에 명명 된 범위를 정의하기 위해 사용하기 : =OFFSET($A$1,0,0,COUNTA($A:$A),1)

+0

는 @ z32a7ul에서,이 방법을 확인합니다 감사 사용할 수 있습니다. – 0537

+0

'Offset'은 매번 Excel로 계산되는 [휘발성 함수] (http://chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/)입니다. 계산합니다. 따라서 이것은주의해서 사용해야합니다. –

+0

@Peh, True이지만 수식이 단일 셀에 있기 때문에 이것은 단 하나의 계산 일 뿐이며 중요한 성능 단점은 아닙니다. – z32a7ul

-1

나는 데이터를 복사하는 가장 빠른 방법은 dinamicly filld입니다 배열을 사용하는 것입니다 생각합니다.

  1. 데이터를 붙여 마스터 시트
  2. 에서, 데이터 기입 정확한 배열
  3. 을 만듭니다.

그리고이 경우 다이나믹 어레이를 사용하기 때문에 새로운 행에 대해 걱정할 필요가 없습니다. 아래 예제를 참조하십시오.

Sub sbCopyRangeToAnotherSheet() 
Sheets("Master").Select 
Dim RowNum as integer 
For i = 0 To 250000 'Count all rows 
    If IsEmpty(Cells(i + 10, 2)) = False Then 
     RowNum = RowNum + 1 'Count all rows which have data in it's second column 
    Else 
     Exit For 
    End If 
Next 
ReDim myData(RowNum - 1, 12) As String 'create array 
For i = 0 To RowNum - 1 'fill array, with data 
    For j = 0 to 12 
    myData(i, j) = Cells(i + 10, j+2) '+10 because you said B**10** 
             '+2 because you said **B**10 
    Next 
Next 

Sheets("test_1").Activate 
For i = 0 To RowNum - 1 'fill array, with data 
    For j = 0 to 12 
    Cells(i + 10, j+2) = myData(i, j) 'Fill cells with data 
    Next 
Next 
End Sub 
+0

아니요, 유감이지만 이것은 분명히 ** 가장 쉬운 방법은 아닙니다. ** 아래 코드는 좀 더 쉽게 ** 당신의 것입니다. 아마도 당신의 속도는 훨씬 느립니다. –

0

당신이 반복 매크로

Sub CopyAll() 
    Dim src As Range, dest 
    With Worksheets("Master") ' set the source range 
     Set src = .Range("B10:M" & .Cells(.Rows.Count, "B").End(xlUp).Row) 
    End With 
    For Each dest In Array("test_1", "test_2", "test_3") ' loop on destination sheets 
     src.Copy Worksheets(dest).Range("B9") 
    Next 
End Sub 
+0

B 열에 빈 셀이 있으면 B 열의 사용 된 셀 수를 계산할 수 없습니다. B 열에 마지막으로 사용한 셀이 B30이지만 C31에 데이터가 있으면 C31이 인식되지 않습니다. 마지막으로 사용한 셀을 얻으려면 여기'.UsedRange'를 사용하는 것이 더 좋습니다. –

+0

아마도 키 열이 있어야하며 대개 첫 번째 열이 있어야합니다. 반면에'UsedRange' 메소드는 훨씬 더 문제가 있습니다. @ 뻬 –

관련 문제