Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

単純作業(行列入れ替えコピー・貼り付け)の繰り返しについて

415 views
Skip to first unread message

まさmasa

unread,
May 27, 2010, 10:09:01 PM5/27/10
to
今までデータの集計を1グループ53個を1行ごとに並べて管理、編集、判定を行っておりました。
しかし、別な某所からのデータ提供がある任意(例えばV列)の列で縦一列でだらだらとした羅列しかできないとのことで悩んでおります。
マクロを作成してやるべきか(ほとんど自信なし)、関数作って 張り付けてそのセル情報を取り込むべきか(少ししか自信なし)で途方に暮れております。アドバイス及びご教授頂ければ助かります。使用しているのはExcel2007です。
下記に詳細な作業を記します。だらだらと記載しておりますが、お許しください。

 今までで大抵の場合、530個ずつのデータが1つの大グループとして縦に並んでいる。その先頭セル"V16"から下へ53個を1グループ単位として数値が並んでいる
まず この53個分の数値が入力されているセルデータ(V16:V68)をコピーし、行列を入れ替えて 例えばセル"AA1"に貼り付ける
今度は、次の53個分のセルデータ(V69:V121)をコピーし、同じように行列を入れ替えて セル"AA1"の下のセル"AA2"に張り付ける
これを順次繰り返し、まず合計10回分同じ作業をする。

その下に大抵2行の空白行(仕切り)があり、また530個の大グループのデータが並んでおり、セルV548から同じように1グループ53個単位ずつで同じことをする。行列を入れ替えて セル"AA11"(AA1~AA10の次)に張り付ける・・・
これを データが存在する分全てにわたって作業を繰り返す。

530個の大グループの塊がいくつ続くか解らない。今までは大グループが多くて5程度で強引に手作業しておりました。ところが次回最大200の大グループ(530×200=106,000データ数)がありそう。容量が大きすぎてデータが分割されて送られるかもしれない。という状況です。

先ほど 2行分の空白行が境目と記載したが、ひょっとして測定不良でデータ空白が存在するかも知りません。しかし、セルC列には 必ずデータ(文字列)があります。言いかえればC列にデータがある限りV列データのコピー・貼り付け作業が続く。
単純な作業の繰り返しですが、私の能力不足での問い合わせ事です。
よろしくお願いします。

T. Sugita

unread,
May 30, 2010, 12:13:11 AM5/30/10
to
In message news:63460BB7-28E2-4567...@microsoft.com
"まさmasa" <ma...@discussions.microsoft.com> wrote ...

>  今までで大抵の場合、530個ずつのデータが1つの大グループ
> として縦に並んでいる。その先頭セル"V16"から下へ53個を
> 1グループ単位として数値が並んでいる
> まず この53個分の数値が入力されているセルデータ(V16:V68)


> をコピーし、行列を入れ替えて 例えばセル"AA1"に貼り付ける
> 今度は、次の53個分のセルデータ(V69:V121)をコピーし、同じように
> 行列を入れ替えて セル"AA1"の下のセル"AA2"に張り付ける
> これを順次繰り返し、まず合計10回分同じ作業をする。
>
> その下に大抵2行の空白行(仕切り)があり、また530個の
> 大グループのデータが並んでおり、セルV548から同じように

> 1グループ53個単位ずつで同じことをする。


> 行列を入れ替えて セル"AA11"(AA1~AA10の次)に張り付ける・・・
> これを データが存在する分全てにわたって作業を繰り返す。

作業列として 2 列(Y,Z) を使用しますが、既存の関数で抽出する
場合、以下の式で可能です。

Y16: =IF(AND(TRIM(C15)="",TRIM(C16)<>""),ROW(),"")
Y16 をコピーして、Y17~データ数分に貼り付け

Z1: =IF(MOD(ROW()-1,10)=0,SMALL(Y:Y,INT((ROW()-1)/10)+1)-1,"")
AA1: =IF(TRIM(OFFSET($V$1,COLUMN()-COLUMN($AA1)+MOD(ROW()-1,10)*53+OFFSET($Z$1,INT((ROW()-1)/10)*10,0),0))="","",OFFSET($V$1,COLUMN()-COLUMN($AA1)+MOD(ROW()-1,10)*53+OFFSET($Z$1,INT((ROW()-1)/10)*10,0),0))
AA1 をコピーして、AB1~CA1 に貼り付け

Z1~CA1 をコピーして、Z2~必要なグループ数分、貼り付け


マクロでやる場合は、以下のようにすると可能だと思うのですが、
Excel2007 は手元に持っていないため、確認しておりません。
(Excel2000 では、動作を確認しています)

Sub 転記()
Dim s, d, c, i, j, k, l, n, tmp

tmp = Application.Calculation
Application.Calculation = xlCalculationManual

s = Range("V1").Column
d = Range("AA1").Column
c = Range("C1").Column

k = 1
l = 16
n = ActiveSheet.Rows.Count
If IsNull(Cells(n, c)) Then
n = Cells(n, c).End(xlUp).Row
End If

Do While l <= (n - 530)
For i = 1 To 10
For j = 0 To 52
Cells(k, d + j) = Cells(l, s)
l = l + 1
Next
k = k + 1
Next

If Trim(Cells(l, c)) <> "" Then
Application.Calculation = tmp
MsgBox "Invalid format."
Exit Sub
End If

Do While l <= n And Trim(Cells(l, c)) = ""
l = l + 1
Loop
Loop

Application.Calculation = tmp

MsgBox "Complete."

End Sub


マクロ内部で、再計算方法を一時的に手動に切り換えていますので、
途中でマクロを中断した場合、手動のままになってしまいます。
"Complete." が表示されるまで待ち、マクロを中断しないように
してください。

もし、計算式が一切ない場合は、再計算方法を変更している
Application.Calculation = xlCalculationManual
の部分を削除しても、問題ないと思います。

--
杉田
nws-...@bp.iij4u.or.jp

まさmasa

unread,
May 31, 2010, 1:06:01 AM5/31/10
to
杉田 様

ありがとうございます。
私のお願いの狙い目通りの出来栄えで感心しております。
私のレベルは 関数は 一部の分野であれば何とかできる程度。マクロはかじり掛けて間がない感じのレベルです。
時間をかけて 各々の詳細を理解できるよう頑張りたいと思います。
簡単ではありますが 謝辞まで・・

"T. Sugita" からの元のメッセージ:

> .
>

T. Sugita

unread,
May 31, 2010, 9:03:37 AM5/31/10
to
In message news:6C2E6076-AF1B-4777...@microsoft.com
"まさmasa" <ma...@discussions.microsoft.com> wrote ...

> > Do While l <= (n - 530)

すみません、ちょっと間違えてまして、ちょうど最終行で終わる
データがある場合は、正しく動作しませんでした。

以下のコードでは問題なく動作すると思います。

Sub 転記()
Dim s, d, c, i, j, k, l, n, tmp

tmp = Application.Calculation
Application.Calculation = xlCalculationManual

s = Range("V1").Column
d = Range("AA1").Column
c = Range("C1").Column

k = 1
l = 16
n = ActiveSheet.Rows.Count
If IsNull(Cells(n, c)) Then
n = Cells(n, c).End(xlUp).Row
End If

Do While l <= (n - 529)


For i = 1 To 10
For j = 0 To 52
Cells(k, d + j) = Cells(l, s)
l = l + 1
Next
k = k + 1
Next

If l > n Then Exit Do

If Trim(Cells(l, c)) <> "" Then
Application.Calculation = tmp
MsgBox "Invalid format."
Exit Sub
End If

Do While l <= (n - 529) And Trim(Cells(l, c)) = ""


l = l + 1
Loop
Loop

Application.Calculation = tmp

MsgBox "Complete."

End Sub

--
杉田
nws-...@bp.iij4u.or.jp

0 new messages