

VBAを使って、出来ますでしょうか?
複数のセルに書かれている日付を
1つのセルにまとめて表示させたいと考えています。
日付は、
10/3,トマト(,で別セルとします)
4/5,トマト
5/6,レタス
3/4,レタス
1/3,レタス
のように縦に並んでいまして、
下の行(1/3)から1つのセルに入れていき
5/6,レタス,1/3・3/4・5/6と
[1/3・3/4・5/6]を1つのセルに入れ、
しかも出来れば「・」を間に入れて
1つのセルに表示させたいのです。
そして、同様にトマトにおいても
10/3,トマト,4/5・10/3と表示させ、
最終的には、
10/3,トマト,4/5・10/3
4/5,トマト
5/6,レタス,1/3・3/4・5/6
3/4,レタス
1/3,レタス
と表示させたいと思っております。
このとき、レタスとトマトの個数は数えなければ
わかりません。
大変難しいかと思いますが、
ぜひお知恵を貸して頂ければ幸いです。
No.1ベストアンサー
- 回答日時:
>大変難しいかと思いますが、
この手の同様のご質問は、多いですね。
なお、A列の日付は降順、B列の文字列は昇順に並び、並び替えは、B列を優先させたものとします。
「,」区切りは、ないものとして解釈しました。
念のために、並び替えはします。
A列の日付は降順、B列の文字列は昇順に並び、並び替えは、B列を優先させたものとします。
データの先頭は、A1 にしました。
元のデータは消すことはありません。
これで、試してみてください。
'<標準モジュール>
Sub test1()
Dim BaseArray As Variant
Dim myCol As Integer
Dim myRow As Long
Dim Dat1 As String, Dat2 As String
Dim i As Long
Application.ScreenUpdating = False
With Range("A1").CurrentRegion.Columns("A:B") '先頭の場所から二列の範囲
.Sort Key1:=Range("B1"), Order1:=xlAscending, _
Key2:=Range("A1"), Order2:=xlDescending, _
Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
'念のために並び替え
.Offset(, 2).Resize(, 1).ClearContents
.Offset(, 2).Resize(, 1).HorizontalAlignment = xlLeft
BaseArray = .Value
myCol = .Column
myRow = .Row
End With
Dat1 = BaseArray(UBound(BaseArray, 1), 2)
Dat2 = Format$(BaseArray(UBound(BaseArray, 1), 1), "mm/dd")
For i = UBound(BaseArray, 1) - 1 To LBound(BaseArray, 1) Step -1
If Dat1 = BaseArray(i, 2) Then
Dat2 = Dat2 & "・" & Format$(BaseArray(i, 1), "mm/dd")
Else
Cells(i + myRow, myCol + 2).NumberFormat = "mm/dd"
Cells(i + myRow, myCol + 2).Value = Dat2
Dat1 = BaseArray(i, 2)
Dat2 = Format(BaseArray(i, 1), "mm/dd")
End If
Next i
Cells(i + myRow, myCol + 2).NumberFormat = "mm/dd"
Cells(i + myRow, myCol + 2).Value = Format$(Dat2, "mm/dd")
Application.ScreenUpdating = True
End Sub
この回答への補足
申し訳ございません もう一点教えてください。
現在B列を基準に判断していますが、
これがD列に入っていて、D列で判断したい
場合はどこを変えればよろしいのでしょうか?
配列は勉強していないので、勉強不足で申し訳ございません。
この度は本当にありがとうございました。
いろいろと数字を打ち変えてみたら変更もうまくいきました。
また機会がありましたら宜しくお願いいたします。
No.2
- 回答日時:
もう回答がありますが、せっかく作ったので回答させて頂きます。
日付のセルをアクティブセルにしてマクロを呼び出します。
日付を連結したデータを入れるセルは、あらかじめ消去しておいてください。自動的には、消去していません。(検査中に消していけばいいですけど)
'----------------------------------------------
Public Sub dateCat() '先頭の日付のセルをアクティブセルで呼び出し
Dim name, list
Dim a(), i, x
Dim r As Range, top As Range, bottom As Range
Do While ActiveCell.Value <> ""
Set top = ActiveCell
name = ActiveCell.Offset(0, 1).Value '名前を取り出す
i = 0
Do While name = top.Offset(i, 1).Value
i = i + 1 '名前が同じ間
Loop
Set bottom = top.Offset(i - 1, 0)
Set r = Range(top, bottom)
ReDim a(r.count)
i = 0
For Each x In r
a(i) = x.Value
i = i + 1
Next
Call ArraySort(a, True)
list = ""
For Each x In a
list = list & Format(x, "m/d・")
Next
list = Left(list, Len(list) - 1) '最後の・を取る
ActiveCell.Offset(0, 2).Value = list '最初の行にリストを入力
bottom.Offset(1, 0).Activate 'アクティブセルの設定
Loop
End Sub
Private Sub ArraySort(a, Optional ascending = 0) '配列をソートする、規定値は大きいもの順
Dim wk, i As Integer, j As Integer, k As Integer
Dim n
n = UBound(a)
k = n \ 2
Do While (k > 0) 'シェルソート
For i = 0 To n - k
j = i
Do While (j >= 0)
If a(j) > a(j + k) Then
wk = a(j)
a(j) = a(j + k)
a(j + k) = wk
j = j - k
Else
Exit Do
End If
Loop
Next
k = k \ 2
Loop
If ascending = 0 Then '逆順にする
i = 0: j = n
Do Until (i >= j)
wk = a(i)
a(i) = a(j)
a(j) = wk
i = i + 1: j = j - 1
Loop
End If
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
教えて!gooグレードポイントがdポイントに変わります!
dアカウント連携を行っていただくと、グレードに応じて「dポイント」が進呈されるようになります。
-
エクセルVBAで、複数セルのデータをひとつのセルに改行してまとめたいのですか・・・
Excel(エクセル)
-
Excelの複数のセルをひとつのセルにまとめて貼り付けをするときに改行
Excel(エクセル)
-
エクセル VBA 複数のセルを一つにまとめたい
Excel(エクセル)
-
4
エクセル:複数セルの情報を1つにまとめる方法
Excel(エクセル)
-
5
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
6
Excelマクロで複数行を一つのセルにまとめる方法
Excel(エクセル)
-
7
結合のループ処理のマクロ
その他(Microsoft Office)
-
8
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
9
【VBA】条件に一致したセル値をカンマ区切りで結合したい
Excel(エクセル)
-
10
Excelで複数セルからの文字の結合
Excel(エクセル)
-
11
VBA別シートの最終行の下行へ貼り付けされるようにしたいです。
その他(Microsoft Office)
-
12
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
13
VBAでの結合セルのコピー&ペースト
Excel(エクセル)
-
14
【Excel VBA】ネットワーク上の共有フォルダにあるExcelを開く
Excel(エクセル)
-
15
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
16
エクセルVBAで、値が入っている最終行の、右隣の値をコピーして、別のセルに貼り付けるコード
Excel(エクセル)
-
17
VBAで重複データを合算したい
Excel(エクセル)
-
18
VBAで繰り返しコピーしながら下へ移動させる方法
Excel(エクセル)
-
19
Excel VBAで改行を含む文字列を1つのセルに貼り付け
Excel(エクセル)
-
20
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
サラダって前の日に作ったやつ...
-
5
2人晩御飯のみで食費2万円は...
-
6
不味~い(冷凍)ハンバーグを...
-
7
レタスは洗わなくてはいけませ...
-
8
失敗したポテトサラダのアレンジ
-
9
切り干し大根は生で食べられま...
-
10
友達が家に泊まりに来るときの...
-
11
余った照り焼きソースで何がで...
-
12
ハンバーグを生焼けで食べてし...
-
13
3〜5ヶ月前に冷凍したハンバー...
-
14
食事の品数
-
15
レタスを色よくゆでたい!
-
16
お客さんに出すメニュー(お昼...
-
17
消費期限切れ(1日目)食べれ...
-
18
250gのローストビーフって何人...
-
19
常温放置してしまったサラダに...
-
20
生焼けのハンバーグについて
おすすめ情報
公式facebook
公式twitter