Excelの表の配列変更に関する質問です。


①のような表をなんらかの手段で②のような配列に変換したいと考えております。
どのような手段(関数?マクロ?)がありますでしょうか?
参考URLのご連絡でも構いません。


A A1 A2 A3 A4 A5
B B1
C C1 C2 C3
D D1 D2
E E1 E2 E3 E4


A A1
A A2
A A3
A A4
A A5
B B1
C C1
C C2
C C3
D D1
D D2
E E1
E E2
E E3
E E4

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2010/08/06 08:51:26
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:ootatmt No.1

回答回数1307ベストアンサー獲得回数65

ポイント30pt
Option Explicit

Sub hatena()

Dim i As Long
Dim r As Long
Dim c As Long
Dim y As Long
Dim wsOUT As Worksheet
Dim wsDATA As Worksheet

Set wsDATA = Worksheets("Sheet1")
Set wsOUT = Worksheets("Sheet2")

y = 1
For r = 1 To wsDATA.Cells(Rows.Count, 1).End(xlUp).Row
    c = 2
    Do While wsDATA.Cells(r, c) <> ""
        wsOUT.Cells(y, 1) = wsDATA.Cells(r, 1)
        wsOUT.Cells(y, 2) = wsDATA.Cells(r, c)
        c = c + 1
        y = y + 1
    Loop
Next

End Sub

こんな感じでどうでしょう。

①のデータ(Sheet1)を②のようにSheet2に書き出します。

http://dummy/

id:hiromiti

早速、ご回答いただきありがとうございます。目的のセル配列変更ができることを確認しました。

サンプルデータとして、不変の列データ(アルファベット1文字の箇所)は1列のみとしておりましたが、例えばこれが5列の場合は、どの値をどのように変更すれば、よいでしょうか?

2010/08/05 19:15:45

その他の回答2件)

id:ootatmt No.1

回答回数1307ベストアンサー獲得回数65ここでベストアンサー

ポイント30pt
Option Explicit

Sub hatena()

Dim i As Long
Dim r As Long
Dim c As Long
Dim y As Long
Dim wsOUT As Worksheet
Dim wsDATA As Worksheet

Set wsDATA = Worksheets("Sheet1")
Set wsOUT = Worksheets("Sheet2")

y = 1
For r = 1 To wsDATA.Cells(Rows.Count, 1).End(xlUp).Row
    c = 2
    Do While wsDATA.Cells(r, c) <> ""
        wsOUT.Cells(y, 1) = wsDATA.Cells(r, 1)
        wsOUT.Cells(y, 2) = wsDATA.Cells(r, c)
        c = c + 1
        y = y + 1
    Loop
Next

End Sub

こんな感じでどうでしょう。

①のデータ(Sheet1)を②のようにSheet2に書き出します。

http://dummy/

id:hiromiti

早速、ご回答いただきありがとうございます。目的のセル配列変更ができることを確認しました。

サンプルデータとして、不変の列データ(アルファベット1文字の箇所)は1列のみとしておりましたが、例えばこれが5列の場合は、どの値をどのように変更すれば、よいでしょうか?

2010/08/05 19:15:45
id:ootatmt No.2

回答回数1307ベストアンサー獲得回数65

ポイント25pt

> サンプルデータとして、不変の列データ(アルファベット1文字の箇所)は1列のみとしておりましたが、例えばこれが5列の場合は、どの値をどのように変更すれば、よいでしょうか?


次のように変更してもらえばいいと思います。

コメントを記入してある箇所を変更すれば不変の列の数が変わっても対応できます。

Option Explicit

Sub hatena()

Dim i As Long
Dim r As Long
Dim c As Long
Dim y As Long
Dim wsOUT As Worksheet
Dim wsDATA As Worksheet

Set wsDATA = Worksheets("Sheet1")
Set wsOUT = Worksheets("Sheet2")

y = 1
For r = 1 To wsDATA.Cells(Rows.Count, 1).End(xlUp).Row
    ' 固定列数 + 1
    c = 6
    Do While wsDATA.Cells(r, c) <> ""
        ' 固定列数
        For i = 1 To 5
            wsOUT.Cells(y, i) = wsDATA.Cells(r, i)
        Next
        wsOUT.Cells(y, 6) = wsDATA.Cells(r, c)
        c = c + 1
        y = y + 1
    Loop
Next

End Sub

http://dummy/

id:hiromiti

列数を変動させても目的の結果を得られることが分かりました。

本当にありがとうございました。

2010/08/06 08:49:03
id:taknt No.3

回答回数13539ベストアンサー獲得回数1198

ポイント25pt
Option Explicit

Sub hatena()

Dim i As Long
Dim r As Long
Dim c As Long
Dim y As Long
Dim wsOUT As Worksheet
Dim wsDATA As Worksheet

Set wsDATA = Worksheets("Sheet1")
Set wsOUT = Worksheets("Sheet2")

y = 1
For r = 1 To wsDATA.Cells(Rows.Count, 1).End(xlUp).Row
    c = 6
    Do While wsDATA.Cells(r, c) <> ""
        wsOUT.Cells(y, 1) = wsDATA.Cells(r, 1)
        wsOUT.Cells(y, 2) = wsDATA.Cells(r, 2)
        wsOUT.Cells(y, 3) = wsDATA.Cells(r, 3)
        wsOUT.Cells(y, 4) = wsDATA.Cells(r, 4)
        wsOUT.Cells(y, 5) = wsDATA.Cells(r, 5)
        wsOUT.Cells(y, 6) = wsDATA.Cells(r, c)
        c = c + 1
        y = y + 1
    Loop
Next

End Sub


まず

c = 2

は 固定行数+1なので ここでは 6をセットします。

次に 固定行数の反映箇所

変動行数の反映箇所を変更します。

wsOUT.Cells(y, 1) = wsDATA.Cells(r, 1)

wsOUT.Cells(y, 2) = wsDATA.Cells(r, c)


wsOUT.Cells(y, 1) = wsDATA.Cells(r, 1)

は 固定の分だけ

5行なら 5行にします。

wsOUT.Cells(y, 2) = wsDATA.Cells(r, c)

のy, 2は、固定+1なので y,6に変えます。

それが 上記のソースになります。

http://q.hatena.ne.jp/1280991348

id:hiromiti

詳細な解説付きでご回答ありがとうございます。

2010/08/06 08:50:10

コメントはまだありません

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

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

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

回答リクエストを送信したユーザーはいません