2015-02-06 3 views
-1

하나의 "마스터"워크 시트에서 일련의 규칙을 기반으로 여러 다른 워크 시트까지 행을 복사하는 매크로가 있지만 모든 행이 모든 워크 시트에 복사되지는 않습니다. 그래서 다른 워크 시트의 각 행에 대해 "카운터"역할을하는 변수 집합을 사용하여 현재 행을 추적하고 주어진 워크 시트의 행을 덮어 쓸 수 있습니다. 이것은 다음과 유사한 많은 추악한 코드로 연결됩니다.VBA : 변수 이름 배열

.Rows(material.Row).Copy Destination:=Worksheets("QM").Range("A" & QMCounter) 

나는 그것을 마스터 워크 시트, 의도 된 워크 시트 다음 워크 시트의 카운터 변수에서 행 번호 통과 어디 호출 할 수있는 하나의 하위에이를 수 있도록하고 싶습니다. 나는에 변수 이름의 문자열 값을 변환 한 다음

For i = 0 to Ubound(VarNameArray) 

    Counter = VarNameArray(i)   

    Call CopyRow(Material, DestWorksheet, Counter) 

Next i 

내 문제와 유사한 일을 할 수 있도록 내가하고 싶은 무엇

는 다른 카운터 변수 이름의 배열을 만드는 것입니다 VarNameArray(i)이 문자열 "QMCounter"가 아니고 변수 QMCounter이 될 수 있도록 실제 변수 이름. "마스터"워크 시트의 모든 행이 다른 모든 워크 시트에 복사되는 것은 아니기 때문에 각 카운터 변수의 값을 독립적으로 제어 할 수 있어야합니다. VBA로 가능합니까?

편집 :이 스프레드 시트의이 목표는 그 값, 10 "종속"워크 시트의 조합으로 행 복사를 기반으로 다음 "마스터"시트에 행 특정 셀 값을보고하는 것입니다. 예를 들어, "마스터"시트의 행 1은 하위 시트 9에만 복사 될 수 있지만 마스터 시트의 행 2는 하위 시트 1, 2, 3, 6, 7, 9 및 10에 복사 될 수 있습니다. 행 3은 다른 하위 시트 세트에 복사 될 수 있습니다. 그것은 모두 특정 세포의 가치에 달려 있는데, 나는 미리 모릅니다.

10 개의 하위 시트마다 현재 행을 추적하는 카운터 변수가 있으며 모든 시트를 해당 시트의 첫 번째 행에 계속 복사하지 않도록하십시오. Sheet1에서 10까지 그리고 Counter1부터 10까지, Sheet1과 Counter1은 10을 통해 링크됩니다. 따라서 마스터 시트에서 Sheet1로 행을 복사하고, 마스터 시트에서 Sheet1로 복사하는 경우에만 카운터 1을 증가시킵니다. 그러나 앞서 언급했듯이 행이 복사되는 특정 하위 시트는 런타임에 사용자가 채우는 특정 셀의 값에 따라 결정됩니다.

그래서 나는 깨끗하고보다 일반적인 뭔가,

코드의 99 %가 동일
.Rows(material.Row).Copy Destination:=Worksheets("Sheet1").Range("A" & Counter1) 
.Rows(material.Row).Copy Destination:=Worksheets("Sheet3").Range("A" & Counter3) 
.Rows(material.Row).Copy Destination:=Worksheets("Sheet4").Range("A" & Counter4) 

같은 코드의 매우 반복적 인 비트를 먹고 싶어. 방금 직접 배열을 사용할 수있는 변수 이름의 배열에 대한 필요가 없습니다

+1

원하는 작업을 원하는대로 수행 할 수 없습니다. 나는 실제 목표에 대해 더 많이 이야기하고 인식 된 문제에 집중하지 말 것을 제안합니다. – RubberDuck

+0

@RubberDuck - 목표는 내 코드를 리팩터링하는 것입니다.처음 코드 조각과 같이 추악하고 반복적 인 (그러나 기능적 인) 코드를 가져 와서 (이상적으로) 루프 코드와 같은 것으로 바꾸십시오. 여기에 관련 정보를 전달하는 하위 코드가 있습니다 (마스터 행, 대상 시트 및 행을 대상 시트). – Aerogems

+0

짧은 대답은 VBA에서 수행 할 수 없다는 것입니다. 이제 For/Next 루핑의 개념을 이해하는 것처럼 보입니다. 문제는 단순히 구현하려는 방식이지만 코드를 더 많이 보지 않고 문제의 더 좋은 예를 보는 것입니다 (그리고 원하는 해결책 ---이 세부 사항을 포함하도록 영업 시간을 수정하십시오!) 도움이 될 것입니다. –

답변

1

...

Dim Counters 
Counters = Array(1,2,3,4,5) 

For i = LBound(Counters) to Ubound(Counters) 

    CopyRow Material, DestWorksheet, Counters(i) 

Next i 

편집 : 당신은 그냥 기존의 아래에 새 행을 추가하는 경우 :

.Rows(material.Row).Copy _ 
    Destination:=Worksheets("Sheet1").Cells(Rows.Count,1).End(xlUp).offset(1,0) 

복사 된 행에 대해 항상 ColA에 값이있는 한 작동합니다.

+0

나는 항상 같은 카운터를 사용하지는 않는다. 나는 하나의 마스터 시트에 10 개의 하위 워크 시트를 가지고 있지만 때로는 마스터 시트의 5 행만 2, 6 및 9 시트에 복사 할 수 있지만 6 행은 2, 3, 4, 5, 6 및 10 시트에 복사됩니다. 이것은 모두 특정 세포의 값에 의해 결정됩니다. 따라서 임의의 임의의 카운터가 아닌 특정 워크 시트와 관련된 카운터가 업데이트되었는지 확인해야합니다. – Aerogems

+0

그런 다음'dictRows ("Sheet1") = 10'과'dictRows ("Sheet1") = dictRows ("Sheet1") + 1 "을 할 수있는 사전을 사용하거나 끝에 행을 추가하는 경우 데이터 세트의'End (xlUp)'를 사용하고 행 번호를 전혀 추적하지 않습니다. –

+0

편집의 예는 나를 시작하기에 충분했으며 적응할 수있었습니다. 하위 시트의 값을 지우지 않고 매크로를 두 번 실행하면 중복 값이 ​​생기는 추가 버그가 있습니다.하지만 주 코드가있을 때마다 다른 시트를 지우려면 하위를 구현할 것입니다. 운영. 어쨌든 이미 그 일을 했어야했는데. – Aerogems