アプリ版:「スタンプのみでお礼する」機能のリリースについて

表データの中身を次のように整形したいと思っています。

-----------
整形前の状態
------------

   A  B  C  D
1 太郎 次郎 花子 三郎
2 次郎 花子
3 太郎 三郎
4 花子

この状態のデータでも使えなくはないのですが、「太郎」はA列にまとめ、「次郎」はB列にまとめ、「花子」はC列にまとめ、「三郎」はD列にまとめておきたいと思います。
具体的には、下記のような形です。

-----------
整形後の状態
------------

   A  B  C  D
1 太郎 次郎 花子 三郎
2    次郎 花子
3 太郎       三郎
4       花子


この整形作業をなるべく簡単に行いたいのですが、どのような方法が考えられるでしょうか。
countif関数などで、強引にやるような非効率なやり方なら思いついたのですが、もうちょっと簡単な方法がありそうなので、質問させていただきました。
ツールとしては、基本的にはExcelを使うことを想定していますが、簡単に使えるツールが他になにかあればExcelにこだわるという意志はないです。

基本的な質問で恐縮ですが、よろしくお願いいたします。

A 回答 (3件)

》 非効率なやり方なら思いついたのですが…


それの効率化を考えてみるので、その「やり方」をご紹介ください。
    • good
    • 1

・1行目のデータは空白はないのですか?


・1行に同じデータが重複することはないのですか?
    • good
    • 0

こんにちは



>countif関数などで、強引にやるような非効率なやり方なら思いついたのですが~~
関数で行う方法は、私には思いつけませんでした。
関数でできるのなら、その方が修正も可能でしょうからそちらの方が良さそうに思います。
多分、一度だけの作業でしょうから、効率はあまり関係ないのではないでしょうか。


私に思いつけるのは、マクロを利用する方法ですが、以下はご参考までに。
値は右詰めで入力されているものと仮定をして、A列の最終行までを対象に処理をします。
(処理の都合上で、一旦、列を挿入し、処理終了後にその列を削除しています)

※ 元のデータにそのまま上書きしますので、もし試す場合は、コピーしてから試してください。

Sub Sample()
Dim dic As Object, ary
Dim rw As Long, col As Long
Dim i As Long, v As String

Set dic = CreateObject("Scripting.Dictionary")
Columns(1).Insert

For rw = 1 To Cells(Rows.Count, 2).End(xlUp).Row
 col = Cells(rw, Columns.Count).End(xlToLeft).Column

 If col > 1 Then
  ary = Cells(rw, 1).Resize(1, col).Value
  Rows(rw).ClearContents
  For i = 2 To UBound(ary, 2)
   v = Trim(ary(1, i))
   If v <> "" Then
    If Not dic.exists(v) Then dic.Add v, dic.Count + 2
    Cells(rw, dic.Item(v)).Value = v
   End If
  Next i
 End If
Next rw

Columns(1).Delete
End Sub
    • good
    • 0

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