2011-12-06 3 views
-1

주어진 열의 고유 값을 기반으로 한 워크 시트를 여러 개로 분할하는 매크로 (Jerry Beaucaire 제공)를 발견했습니다. 이것은 잘 작동합니다. 그러나 ...VBA 배열 조작

클라이언트는 우리가 필요로하는 형식으로 들어가기 위해 약간의 부드러운 마사지가 필요한 형식이 다른 워크 시트를 제공했습니다.

첫째, 내가 당신에게 JB의 코드 조각 보여주지 : 내가 무엇을 말할 수에서

MyArr = Application.WorksheetFunction.Transpose _ 
    (ws.Columns(iCol).SpecialCells(xlCellTypeConstants)) 

을 (그리고 내가 아는 그래서 뭐, 총 VB 초보자 해요 .. ??),이 선택한 행에 배열

그리고이 값 웁니다

For Itm = 2 To UBound(MyArr) 

    ...(code removed) 

    ws.Range("A" & TitleRow & ":A" & LR).EntireRow.Copy _ 
     Sheets(MyArr(Itm) & "").Range("A1") 


    ...(code removed) 

Next Itm 

...이 복사를 할 것으로 보인다.

괜찮습니다. ... 지금까지 괜찮아.

문제는 프로세스에 단계를 추가해야한다는 것입니다. 설명하기가 까다 롭습니다.

제목 행은 행 1 ... 나와 함께 곰하시기 바랍니다

데이터 행의 시작이

각 행 9 열이 있습니다

콜라 : 식별자

COLB - 감기 : X, Y,

콜 - colG (항목의 상단에 대한), Z 값 (아이템의 밑바닥), X, Y, Z 값

,

colH 및 colI : 무시할 수 있습니다.

이 x, y 및 z 값은 3D 모델링 프로그램에서 선을 그리는 데 사용되는 점을 정의하는 데 사용됩니다. 워크 시트의 각 행은 실제로 선을 정의합니다 (시작 지점과 끝 지점 - "상단"과 "하단"). 아쉽게도 우리가받은 데이터 (워크 시트)는 각 행에 대해 두 세트의 데이터를 정의합니다 동일한 시작점을 가지지 만 끝 점이 다릅니다. 다시 말하면 행 3과 4에서 시작하여 열 B-D의 데이터는 두 행에서 동일합니다. 이 행은 5 & 6, 7 & 8 등의 행에 적용됩니다.

데이터 포인터가 필요하기 때문에 E-G 열에서 값을 안전하게 사용할 수 있습니다.
... 그리고 여기가 내가 도움이 필요한 곳입니다. 행 2, 열 B-D의 값으로 시작하려면 새로 만든 워크 시트의 첫 번째 행이 필요합니다. (즉, 끝점을 좌표로 사용할 수 있지만 첫 번째 시작점이 필요합니다.) 나머지는 모두 괜찮습니다. 예를 들어

:

소스 데이터 :

 
    | A | B | C | D |  E |  F |  G | 
1 | id | x-top | y-top | z-top | x-bottom | y-bottom | z-bottom | 
2 | H1 | 101.2 | 0.525 | 54.25 | 110.25 | 0.625 | 56.75 | 
3 | H1 | 110.25| 0.625 | 56.75 | 121.35 | 2.125 | 62.65 | 
4 | H1 | 110.25| 0.625 | 56.75 | 134.85 | 3.725 | 64.125 | B,C,D same as row 3 
5 | H1 | 134.85| 3.725 | 64.125| 141.25 | 4.225 | 66.75 | 
6 | H1 | 134.85| 3.725 | 64.125| 148.85 | 5.355 | 69.85 | B,C,D same as row 5 

내가 필요한 것 :

 
    | A | B | C | D |  E |  F |  G | 
1 | id | x-top | y-top | z-top | x-bottom | y-bottom | z-bottom | 
2 | H1 |  |  |  | 101.2 | 0.525 | 54.25 | 
3 | H1 | 101.2 | 0.525 | 54.25 | 110.25 | 0.625 | 56.75 | 
4 | H1 | 110.25| 0.625 | 56.75 | 121.35 | 2.125 | 62.65 | 
5 | H1 | 110.25| 0.625 | 56.75 | 134.85 | 3.725 | 64.125 | 
6 | H1 | 134.85| 3.725 | 64.125| 141.25 | 4.225 | 66.75 | 
7 | H1 | 134.85| 3.725 | 64.125| 148.85 | 5.355 | 69.85 | 

그래서 ... 이렇게하는 가장 좋은 방법은 무엇입니까? 이 작업을 수행하기 위해 기존 매크로를 추가 할 수 있습니까? 그렇다면 배열을 수정하는 것이 더 좋습니까? 복사 루틴을 수정하는 것이 더 낫습니까? ...그리고 어떻게??

미리 도움 주셔서 감사 드리며 수동으로 제안하지 마시기 바랍니다. 구문 분석 할 70,000 개 이상의 행이 있습니다!

자세한 정보가 필요하면 알려주세요.

+0

당신은 당신이 필요로하는 모든이 후 행을 삽입하는 것을 확인 할 수 헤더 행을 선택하고 BD에서 EG로 값을 이동 하시겠습니까? –

+1

"내가 알 수있는 것부터 (그리고 나는 전체 VB 초보자이다. 그래서 나는 무엇을 알 수 있느냐?))"그 줄에 중단 점을 설정하고, 그 배열에 감시를 설정하고, 디버그 모드에서 코드를 단계별로 실행한다. . 그럼 알게 될거야. –

+0

예, Rachel, 헤더 행 다음에 데이터 행을 삽입해야합니다. 그런 다음 행 3 (삽입으로 인해 행 2에서 이동 한 값이있는 첫 번째 데이터 행) 열 B-D는 행 2 (새로운 빈 행) 열 E-G에 복사해야합니다. VB는 여전히 나에게 그리스어이기 때문에 배열을 만들 때, 빌드 한 후 (그러나 새 워크 시트를 만들기 전에) 또는 데이터를 추가 한 후에이 작업을 수행하는 것이 더 쉬운 것인지 확실하지 않습니다. 새 워크 시트에 추가하십시오. ... 오, 맞아 ... 어떻게하는지. ;) –

답변

0

전체 매크로 당신의 연결 포인트를 달성하기 위해 this location

모든 무료로 사용할 수 있습니다, 이러한 추가 그것을 수행해야합니다

For Itm = 2 To UBound(MyArr) 

    ...(code removed) 

    ws.Range("A" & TitleRow & ":A" & LR).EntireRow.Copy _ 
     Sheets(MyArr(Itm) & "").Range("A1") 
    Sheets(MyArr(Itm) & "").Rows(2).Insert xlShiftDown 
    Sheets(MyArr(Itm) & "").Range("E2").Resize(, 3).Value = Sheets(MyArr(Itm) & "").Range("B3").Resize(, 3).Value 

    ...(code removed) 

Next Itm