今までで大抵の場合、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列データのコピー・貼り付け作業が続く。
単純な作業の繰り返しですが、私の能力不足での問い合わせ事です。
よろしくお願いします。
> 今までで大抵の場合、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
の部分を削除しても、問題ないと思います。
ありがとうございます。
私のお願いの狙い目通りの出来栄えで感心しております。
私のレベルは 関数は 一部の分野であれば何とかできる程度。マクロはかじり掛けて間がない感じのレベルです。
時間をかけて 各々の詳細を理解できるよう頑張りたいと思います。
簡単ではありますが 謝辞まで・・
"T. Sugita" からの元のメッセージ:
> .
>
> > 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