プロが教えるわが家の防犯対策術!

写真のように、現在のデータは、一つの行に複数のデータが入っている(フラグ1が3種類、それに対応する形でフラグ2が3種類)になっているのを
一行一データに変えたい(写真のデータ加工後のように)です。

これをするには、VBAを使うのかと思うのですが、調べてみてもあまり良い結果は出てこなかったです。

どなたかやり方を教えてくださりますと大変助かります。

「Excelのデータ加工に関してのご質問で」の質問画像

質問者からの補足コメント

  • ご回答ありがとうございます。
    3種類って決め打ちされていない場合は、如何でしょうか?
    行によっては、1種類であったり、5種類入っていたりします…

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/04/28 22:01
  • ありがとうございます。
    今回は、セル内のデータが3つの場合だと思うのですが、3つの場合もあれば1つの場合もあれば四つの場合もある場合は、どのような関数になりますでしょうか??
    (関数だと難しいでしょうか…?)

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/04/28 22:21

A 回答 (6件)

No.1&3です。


こんなのを想定していたのですが・・・。

Sub Macro1()
Dim i As Long
Dim C As Variant
Dim D As Variant
Dim Max As Long
For i = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
C = WorksheetFunction.Transpose(Split(Cells(i, "C").Value, ","))
D = WorksheetFunction.Transpose(Split(Cells(i, "D").Value, ","))
Max = WorksheetFunction.Max(UBound(C), UBound(D))
If Max > 1 Then
Rows(i).Columns("C:D").ClearContents
Rows(i).Copy
Rows(i).Resize(Max - 1).Insert Shift:=xlDown
Cells(i, "C").Resize(UBound(C)).Value = C
Cells(i, "D").Resize(UBound(D)).Value = D
End If
Next i
End Sub
    • good
    • 3

こんにちは、


表題ご質問の解決出来る回答がありますが、
条件が増えた場合の対応にお困りのようですね。
#3様の意見に賛成ですが、#1のコードの改造だと理解しにくいかもと
横から失礼します。

下記コードは、べたな処理で3種類を処理するものです。
Sub try_sample()
Dim flag1, flag2
Dim i As Long, j As Long
Dim UB As Long, n As Long
 n = 12 '出力始まり行№
 For i = 4 To Range("A4").End(xlDown).Row
  flag1 = Split(Cells(i, "C"), ",")
  flag2 = Split(Cells(i, "D"), ",")

  For j = 0 To 2 '要素数 0to2 で3種類
   With Cells(n, "A")
    .Value = Cells(i, "A")
    .Offset(, 1).Value = Cells(i, "B")
    If UBound(flag1) >= j Then '要素数を超えている時の処理
     .Offset(, 2).Value = flag1(j)
    Else
     .Offset(, 2).ClearContents
    End If
    If UBound(flag2) >= j Then '要素数を超えている時の処理
     .Offset(, 3).Value = flag2(j)
    Else
     .Offset(, 3).ClearContents
    End If
   End With
   n = n + 1
  Next
 Next
End Sub

変数UBは宣言されていますが使用していません。

要素数(種類)に対して汎用性を持たせるために重要な個所は
'要素数 0to2 で3種類 です。ここの2を3とか6とか変えて実行してみてください。
仕組みが分かると思います。

この定数2を変数にして行ごとの要素数を設定すれば良いと思います。
(#3様がヒントを出されています)

CとDの要素数が違う時困る、要素数を超えた配列要素を呼ぶとエラーになる部分はコードに加えさせていただきました。

If UBound(flag1) >= j Then でエラー回避の為、分岐しています。

こんな書き方もあると言う事で参考になれば良いのですが

データ加工との事なのでデーター数は数万行とかあるのでしょうか?
その場合、都度書き込みたと時間を要するかと思いますが、別の話ですね。
    • good
    • 2

EXCELは、「とにかく作業領域を使って、力業でやってしまう」というような方法もあると思います。

 マクロを使わなくても、高度で複雑な関数を使わなくても、関数だけではどうにもならないのでEXCELの便利機能も駆使してしまえば、なんとかはなることが多いように思います。
下の図でも、範囲や件数が違っていても、(自動反映はしないですが)少しその都度手直しすれば、なんとかなるし、できたものの、必要部分(範囲)をコピーして、別シートに値貼り付けしてしまえば、多くの場合、それで済むと思います。
なお、同行のC列とD列の項目?件数が違っている場合にはH3が0ではなくなるので、そこをチェックしてください。
「Excelのデータ加工に関してのご質問で」の回答画像4
    • good
    • 0

フラグ1、フラグ2の値をそれぞれSPLITしてみて、配列数の多い方を基準に処理を行うようにすれば、OKです。


まずは、自分でやってみて、分からない部分があれば、再質問してください。
ただし、回答を保証するものではありませんので、あしからず!!
    • good
    • 2

こんばんは



すでに回答が出ているので、関数でやってみた例を・・・

ご提示のレイアウトで、A12セルに
=IF(COLUMN()<3,INDEX(A:A,INT(ROW()/3)),MID(INDEX(A:A,INT(ROW()/3)),MOD(ROW(),3)*2+1,1))
を入力して、必要範囲にフィルコピーとか。
この回答への補足あり
    • good
    • 0

3種類って、決め打ちで良いのであれば、こんな感じでどうでしょう。



Sub Macro1()
Dim i As Long
For i = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
Rows(i).Copy
Rows(i & ":" & i + 1).Insert Shift:=xlDown
Cells(i, "C").Resize(3).Value = WorksheetFunction.Transpose(Split(Cells(i, "C").Value, ","))
Cells(i, "D").Resize(3).Value = WorksheetFunction.Transpose(Split(Cells(i, "D").Value, ","))
Next i
End Sub
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!