2011-12-06 22 views
-1

特定の列の一意の値に基づいて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 

...のコピーがあるようです。

いいえ。 ...これまでのところ良い。

問題は、プロセスにステップを追加する必要があることです。これは説明するのが難しいでしょう。

で、colA:識別子

COLB-COLD私と一緒にご負担ください...

タイトル行は行1

データは、各行は9列を持つ行に2

を開始しています。 (項目の上部のために)X、Y、Z値

COLE-colG:(アイテムの底用)X、Y、Z値

colHおよびcolI:無視することができます

これらのx、y、z値は、3Dモデリングプログラムの線をプロットするためのポイントを定義するために使用されます。ワークシートの各行は、実際には線を定義します(開始点と終了点 - 「上」と「下」)。残念ながら、私たちが受け取ったデータ(ワークシート)は、各行に対して2つのデータセット同じ開始点を有するが、異なる終点を有する。言い換えると、行3と4から始めて、列B〜Dのデータは両方の行で同じです。これは、行5 & 6,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

はい、レイチェル、ヘッダー行の後にデータ行を挿入する必要があります。行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