2行n列の表を、n行2列の表に変換させたいのですが、
お薦めの手法を教えてください。
【形式を選択して貼り付け】より【行列を入れ替える】では、
表示の順序が、望む結果の逆になってしまいます。
元表は、必ずA1セルから作られているものとし、
変換先の表も、必ずA1セルから作られるものとします。
コマンド操作だけで可能なのか、マクロを組むのかが解らないでおります。
ご不明な点がございましたら、コメント欄でご指示ください。
以下のマクロで実行できます。
>|vb|
Sub Macro1()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+q
'
For a = 1 To 256
If Cells(1, a) = "" Then Exit For
Next a
For b = 1 To a - 1
c = Cells(1, b)
Cells(1, b) = ""
Cells(a - b, 1) = c
c = Cells(2, b)
Cells(2, b) = ""
Cells(a - b, 2) = c
Next b
End Sub
||<
コマンド操作だけでできます。
できた表3のC列に1・2・3と上から連番を入れてC列で逆順にソートして、C列を削除するのです。
SALINGER様、ありがとうございます。
『目から鱗』の回答をありがとうございます。
(気付けなかった私って・・)
以下のマクロで実行できます。
>|vb|
Sub Macro1()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+q
'
For a = 1 To 256
If Cells(1, a) = "" Then Exit For
Next a
For b = 1 To a - 1
c = Cells(1, b)
Cells(1, b) = ""
Cells(a - b, 1) = c
c = Cells(2, b)
Cells(2, b) = ""
Cells(a - b, 2) = c
Next b
End Sub
||<
taknt様、ありがとうございます。
a: 表の大きさ(a=n+1)
b: for文を制御する変数
c: 値の入替を行う変数
と解釈してよろしいのですよね。
仮に元表がsheet1で、新表をsheet2に作るのなら、
c = sheet1.cells(1,b)
sheet2.cells(a-b,1) = c
もしくは、
sheet2.cells(a-b,1) = sheet1.cells(1,b)
と表記すれば良いのでしょうか。
最初の回答は、同一シート内での処理を考えて作ってみました。
それが Cells(1, b) = "" ですね。
元のを消してます。
なので 別シートならば それは不要です。
あとは
If sheet1.Cells(1, a) = "" Then Exit For
として
質問のコメントにあるように
sheet2.cells(a-b,1) = sheet1.cells(1,b)
とすればいいですね。
taknt様、ありがとうございます。
セルの書式の設定も含めて、これから取り組んでみます。
SALINGER様、taknt様より回答を頂いておりますが、
私の知らない機能・手法・考え方があれば、
これを機会に知りたく思っておりますので、
もう少しの間、質問をオープンさせていただきますこと、
ご了承くださいませ。
一回の操作であれば、作業列を使用して並べ替えた方が手っ取り早いと思いますが、同じような作業を多く繰り返す場合には、マクロを利用した方が便利ですね。
質問では位置をA1に固定していますが、以下のマクロではコピー先を任意のセルとしています。
なので、コピー元の表をコピーし、コピー先のシートのA1を選択してから、マクロを実行すると、期待する結果となるかともいます。
(0)まず下記のマクロを準備します。
Sub CopyTransposeReverse() ' Keyboard Shortcut: Ctrl+q <--- マクロの自動記録でショートカットを指定して、中身を下記に書き換える Selection.PasteSpecial Paste:=xlPasteAll, Transpose:=True rStart = Selection.Row cStart = Selection.Column rNum = Selection.Rows.Count cNum = Selection.Columns.Count '--- 配列データにコピー ar = Selection For r = 1 To rNum For c = 1 To cNum '--- 上下を逆にする。 Cells(rStart + rNum - r, cStart + c - 1).Value = ar(r, c) Next Next End Sub
(1)コピー元の範囲をコピー(Ctl+c)します。
(2)コピー先の左上の位置のセルを選択します。
(3)マクロを実行します。
このとき、taknt さんのように、ショートカットを割り当てておくと(3)の操作時に(今回の例では)Ctr+q を押せば簡単に実行できます。
Mook様、ありがとうございます。
明日一番に教えていただいたマクロを試してみます。
[']があっても、Keyboard Shortcut:と記入しておけば、ショートカットが有効になるのですか?
私もSALINGERさんの方法を真っ先に思いつきましたが、別の方法も考えて見ました。
●元の表がSheet1にあり、新表を別のシートにつくる場合の例です。下記、3つの式のいずれかを、別のシートのA1セルに入力し、得たい表の大きさの範囲にコピーして下さい。
(A)
=OFFSET(Sheet1!$D$1,COLUMN()-1,1-ROW())
※Dは、元の表の右端の列名に書き換えてください。
(B)
=OFFSET(OFFSET(Sheet1!$A$1,0,4-1),COLUMN()-1,1-ROW())
※4は、元の表の列数です。ご質問の文章で言うとnに該当する数字に書き換えて下さい。
(C)
=OFFSET(OFFSET(Sheet1!$A$1,0,COUNTA(Sheet1!$1:$1)-1),COLUMN()-1,1-ROW())
※書き換え不要です。
※COUNTA(Sheet1!$1:$1)で、列数を数えていますので、元の表の一行目の右側に、表以外の値が入っている場合は、誤った値になります。
●コピーの仕方は、いろいろありますので、やり易い方法でやって下さい。念の為、一つのやり方を書きます。
A1セルを右クリック→[コピー]→コピーしたい範囲を選択→右クリック→[貼り付け]
●なお、上記いずれの場合も、式が入ったままでは、都合が悪い場合は、次のようにして値に変換して下さい。
範囲を選択→右クリック→[コピー]→右クリック→[形式を選択して貼り付け]→[値]をチェック→[OK]
nandedarou様、ありがとうございます。
offset()も、便利なことがわかっていながら、
使いこなせていない一つです。
(A)(B)(C)の何れも、今回勉強しておけば、
色々なところで為になりそうです。
taknt様、ありがとうございます。
a: 表の大きさ(a=n+1)
b: for文を制御する変数
c: 値の入替を行う変数
と解釈してよろしいのですよね。
仮に元表がsheet1で、新表をsheet2に作るのなら、
c = sheet1.cells(1,b)
sheet2.cells(a-b,1) = c
もしくは、
sheet2.cells(a-b,1) = sheet1.cells(1,b)
と表記すれば良いのでしょうか。