[[20210617164014]] 『規則性のあるデータから任意のデータを抽出して横』(か) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『規則性のあるデータから任意のデータを抽出して横に並べる方法』(か)

少々質問が長くなってしまいますがどうにも困っていてお力をお借りできたらと思います。
A1質問
A2回答
A3回答
A4回答
A5質問
A6回答
A7回答
A8質問
A9回答
A10質問

というように質問1つと回答いくつかで1セット、縦に規則的に並んでいるデータがあります。

このデータを、
A1質問 回答 回答 回答
A2質問 回答 回答

というように最終的にすべて横一列に整理したくいろいろと調べたのですが効率の良いやり方がなかなか思いつきません。
マクロや関数を調べたのですが、なかなか思うようにいかないので教えていただけると幸いです・

< 使用 Excel:Office365、使用 OS:Windows10 >


 イメージ図だけ...

 __|___A____|___B____|___C____|___D____|___E____|___F____|___G____|___H____|___I____|___J____|___K____|___L____
  1|質問    |       1|       1|    1001|        |        |        |       1|       2|       3|       4|       5
  2|回答    |       1|       2|    1002|        |        |       1|質問    |回答    |回答    |回答    |  #N/A  
  3|回答    |       1|       3|    1003|        |        |       2|質問    |回答    |回答    |  #N/A  |  #N/A  
  4|回答    |       1|       4|    1004|        |        |       3|質問    |回答    |  #N/A  |  #N/A  |  #N/A  
  5|質問    |       2|       1|    2001|        |        |       4|質問    |  #N/A  |  #N/A  |  #N/A  |  #N/A  
  6|回答    |       2|       2|    2002|        |        |        |        |        |        |        |        
  7|回答    |       2|       3|    2003|        |        |        |        |        |        |        |        
  8|質問    |       3|       1|    3001|        |        |        |        |        |        |        |        
  9|回答    |       3|       2|    3002|        |        |        |        |        |        |        |        
 10|質問    |       4|       1|    4001|        |        |        |        |        |        |        |        
             ~~~~~~~~~~~~~~~~~~~~~~~~~~この部分の情報を整備しちゃえば ↑こんな感じに数式で参照出来そうだなぁと。

(白茶) 2021/06/17(木) 17:15


白茶さん
ご返信ありがとうございます。
H〜Lのように並べたのはどういった方法で行ったのですか?
(a) 2021/06/18(金) 12:51

書いている間に↓へお引越しされたようですが、書いちゃったので投稿しておきます。
[[20210618121806]] 『規則性のない分類わけ』(a)

>規則性のあるデータ
私の認識だと、提示のものは質問とそれに対する回答の【個数が不規則】で【順番に】並んでいるという状態に見えます。

既にねむねむさんが確認しているところではありますが、例えば↓のようにA列を見れば質問か回答の判断ができ、

 【データ】シート
   ___A__________B_____________
  1  質問     質ああ
  2  回答     回ああ
  3  回答     回ああ
  4  回答     回ああ
  5  質問     質いい
  6  回答     回いい
  7  回答     回いい
  8  質問     質うう
  9  回答     回うう
 10  質問     質ええ

このうち、B列だけを

 【組換】シート
   _____A___________
  1  質ああ   回ああ   回ああ   回ああ
  2  質いい   回いい   回いい
  3  質うう   回うう
  4  質うう

のようにしたいということであれば↓のように、それぞれのグループ?が始まる行と終わる行をしらべ、行列を入れ替えて貼り付けするという考え方もあるとおもいます。

    Sub さんぷる()
        Dim i As Long, 始 As Long, 終 As Long, 出力行 As Long

        With Worksheets("データ")
            出力行 = 1
            For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row Step 1
                If 始 = 0 Then 始 = i
                If .Cells(i, "A").Offset(1).Value <> "回答" Then 終 = i

                If 終 <> 0 Then
                    .Range(.Cells(始, "B"), .Cells(終, "B")).Copy
                    Worksheets("組換").Cells(出力行, "A").PasteSpecial Paste:=xlPasteValues, Transpose:=True
                    始 = 0
                    終 = 0
                    出力行 = 出力行 + 1
                End If
            Next i
        End With
    End Sub

よって興味があれば↑を【ステップ実行】して研究してみてください。
(理解していただきたいので、丸写しして完成!というのはNGとします)

 尤も、「マクロや関数を調べた」と仰っているので、できれば数式で解決したいということかもれませんが・・・)

なお、同じ掲示板内ではニックネームは統一されたほうがよいですよ。
別人を装って同じ説明をされてもつまらないでしょう(するほうも手間ですし・・・)

(もこな2) 2021/06/18(金) 13:14


 こんばんは!
えぇっと、、これはA列に一列ですよね???

 こういう時は、配列を作っては格納、、配列を作っては、格納を繰り返します。
で、大きさがわかったら順番に取り出して整列して出力します。。。
こんな↓感じです。。。。何かの参考になれば幸いです。。。

    |[A] |[B] |[C] |[D] 
 [1]|質問|回答|回答|回答
 [2]|質問|回答|回答|    
 [3]|質問|回答|    |    

 Option Explicit
Sub てすと()
Dim v As Variant
Dim x() As Variant
Dim y() As Variant
Dim z() As Variant
Dim q As Variant
Dim i As Long
Dim j As Long
Dim n As Long
Dim k As Long
Dim 最大値 As Long
v = Sheets("Sheet1").Range("A1").CurrentRegion.Resize(, 1).Value
For i = LBound(v, 1) To UBound(v, 1)
    If v(i, 1) = "質問" Then
        ReDim Preserve x(n)
        ReDim Preserve y(n)
        x(n) = v(i, 1)
        n = n + 1
        k = 0
    ElseIf v(i, 1) = "回答" Then
        ReDim Preserve z(k)
        z(k) = v(i, 1)
        k = k + 1
        y(n - 1) = z
        If 最大値 < k Then 最大値 = k
    End If
Next
ReDim q(1 To n, 1 To 最大値 + 1)
For i = LBound(q, 1) To UBound(q, 1)
    If Not IsEmpty(y(i - 1)) Then
        z = y(i - 1)
        q(i, 1) = x(i - 1)
        For j = LBound(z) To UBound(z)
            q(i, j + 2) = z(j)
        Next
    End If
Next
With Sheets("Sheet2")
    .Cells.Clear
    .Range("A1").Resize(UBound(q, 1), UBound(q, 2)).Value = q
End With
Erase v, x, y, z, q
End Sub
(SoulMan) 2021/06/18(金) 20:20

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.