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


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

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

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

回答の条件
  • 1人3回まで
  • 登録:2007/04/01 19:22:13
  • 終了:2007/04/02 20:24:13

ベストアンサー

id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982007/04/01 20:07:03

ポイント50pt

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

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

||<

id:taisin0212

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)

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

2007/04/01 20:25:17

その他の回答(4件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692007/04/01 19:46:40

ポイント50pt

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

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

id:taisin0212

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

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

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

2007/04/01 20:14:06
id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982007/04/01 20:07:03ここでベストアンサー

ポイント50pt

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

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

||<

id:taisin0212

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)

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

2007/04/01 20:25:17
id:taknt No.3

きゃづみぃ回答回数13539ベストアンサー獲得回数11982007/04/01 20:34:23

ポイント50pt

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

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

元のを消してます。

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

あとは

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

として

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

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

とすればいいですね。

id:taisin0212

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

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


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

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

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

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

ご了承くださいませ。

2007/04/01 20:40:03
id:Mook No.4

Mook回答回数1312ベストアンサー獲得回数3912007/04/01 22:50:20

ポイント50pt

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


質問では位置を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 を押せば簡単に実行できます。

id:taisin0212

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

明日一番に教えていただいたマクロを試してみます。

[']があっても、Keyboard Shortcut:と記入しておけば、ショートカットが有効になるのですか?

2007/04/01 23:13:15
id:nandedarou No.5

nandedarou回答回数230ベストアンサー獲得回数342007/04/02 01:34:10

ポイント50pt

私も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]

id:taisin0212

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

offset()も、便利なことがわかっていながら、

使いこなせていない一つです。

(A)(B)(C)の何れも、今回勉強しておけば、

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

2007/04/02 10:03:56
  • id:SALINGER
    表3ってかBook1:1か
  • id:taknt
    おかしいな
    ホントは
    http://d.hatena.ne.jp/taknt/20070401
    みたいになるはずなんだけどなぁ・・・
  • id:taisin0212
    taknt様、ご自分のDiary迄使っていただいて、
    ありがとうございます。
    頂いたお返事と、Diaryでのソースとが、
    同じものに見えるのですが、
    厳密には違っている場所があるのでしょうか?
  • id:taknt
    色がつくはずなんですよね。

    シンタックス ハイライトってやつかな。
  • id:Mook
    ' Keyboard Shortcut: Ctrl+q
    の部分はマクロの自動記録が、勝手に作成するコメントなので、ここの記入自体は動作上の意味を持ちません。

    マクロの記録で、ショートカットキーの欄に q を入力して記録を実行、
    何もせずに終了で良いです。

    そこで出来たマクロに該当のコードを貼り付ければ、ショートカットキーが利用できます。

    内部的な仕組みは、
    http://arrow3.way-nifty.com/shige/2005/07/__fa5b.html
    などが参考になるかと思います。
  • id:SALINGER
    ショートカットはマクロの実行→オプションで設定できます。
  • id:Mook
    マクロのオプションは勉強になりました。
  • id:SALINGER
    補足。ショートカットは必須ですね。
    (3)でメニューからマクロを実行するとエラーになるので。
    VBAの方から実行してもいけるけど。
  • id:Mook
    補足ありがとうございました。

    こちらで試したときは、ショートカットかVBE で実行と、問題なかったので気にしていませんでしたが、確かにマクロから実行するとエラーになりますね。
  • id:taisin0212
    SALINGER様、taknt様、Mook様、nandedarou様、
    この度はありがとうございます。

    回答をオープンにしたままである理由をお汲み取りいただきましたこと、
    重ねてお礼申し上げます。

    何でもそうなのでしょうが、そこに便利なツールがあるとき、
    ツールに対して、少しでも多くのアプローチがあると、
    より便利に使えるのではないかと思います。

    また何かの折には質問をさせていただきます。
    その際にはよろしくお願いいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません