人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【EXCELについて教えてください】

2行n列の表を、n行2列の表に変換させたいのですが、
お薦めの手法を教えてください。
【形式を選択して貼り付け】より【行列を入れ替える】では、
表示の順序が、望む結果の逆になってしまいます。

元表は、必ずA1セルから作られているものとし、
変換先の表も、必ずA1セルから作られるものとします。

コマンド操作だけで可能なのか、マクロを組むのかが解らないでおります。
ご不明な点がございましたら、コメント欄でご指示ください。

1175422931
●拡大する

●質問者: タイシン@我孫子
●カテゴリ:コンピュータ 学習・教育
✍キーワード:A1 Excel お薦め コマンド コメント欄
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● SALINGER
●50ポイント

コマンド操作だけでできます。

できた表3のC列に1・2・3と上から連番を入れてC列で逆順にソートして、C列を削除するのです。

◎質問者からの返答

SALINGER様、ありがとうございます。

『目から鱗』の回答をありがとうございます。

(気付けなかった私って・・)


2 ● きゃづみぃ
●50ポイント ベストアンサー

以下のマクロで実行できます。

>|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)

と表記すれば良いのでしょうか。


3 ● きゃづみぃ
●50ポイント

最初の回答は、同一シート内での処理を考えて作ってみました。

それが Cells(1, b) = "" ですね。

元のを消してます。

なので 別シートならば それは不要です。

あとは

If sheet1.Cells(1, a) = "" Then Exit For

として

質問のコメントにあるように

sheet2.cells(a-b,1) = sheet1.cells(1,b)

とすればいいですね。

◎質問者からの返答

taknt様、ありがとうございます。

セルの書式の設定も含めて、これから取り組んでみます。


SALINGER様、taknt様より回答を頂いておりますが、

私の知らない機能・手法・考え方があれば、

これを機会に知りたく思っておりますので、

もう少しの間、質問をオープンさせていただきますこと、

ご了承くださいませ。


4 ● Mook
●50ポイント

一回の操作であれば、作業列を使用して並べ替えた方が手っ取り早いと思いますが、同じような作業を多く繰り返す場合には、マクロを利用した方が便利ですね。


質問では位置を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:と記入しておけば、ショートカットが有効になるのですか?


5 ● nandedarou
●50ポイント

私も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)の何れも、今回勉強しておけば、

色々なところで為になりそうです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ