
VBA初心者です。
自分なりに色々考えてみたり職場の人に相談してみたのですがどうしても解決することができなかったため、こちらで相談させていただきます。
条件①と条件②の各項目に番号が付与されているので、各項目に合致した番号を全て抜き出したいです。(添付画像参照)
またこの時に、連続する番号はハイフンでつなげる。番号が飛び飛びな場合は間に「、」や「 」を入れて繋げる。ということも実現したいです・・・。
数値をハイフンでまとめる方法は下記の方法で実現できそうな気がするのですが、番号をうまく抜き出すことができずお手上げ状態です。
VBAでカンマ区切り数値をハイフンでまとめたい
https://oshiete.goo.ne.jp/qa/8299917.html
説明が拙く申し訳ありません。どなたかお知恵を貸していただけますと幸いです。

No.3ベストアンサー
- 回答日時:
こんばんは
セル位置もわからないし、内容もよくわかりませんけれど、勝手に想像をたくましゅうして、こんなことでしょうか?
※ 添付図のF列の書式は文字列にしておかないと、「1-2」などの値が日付として解釈されてしまいますのでご注意。
Sub Sample_12225223()
Dim dic As Object, outRng As Range
Dim maxRw As Long, rw As Long, col As Long
Dim keys(), k, s As String
Set dic = CreateObject("Scripting.Dictionary")
Set outRng = Range("E1")
maxRw = Cells(Rows.Count, 1).End(xlUp).Row
For col = 2 To 3
dic.RemoveAll
rw = 2
While rw <= maxRw
k = Cells(rw, col).Value
s = Cells(rw, 1).Value
For rw = rw + 1 To maxRw
If Cells(rw, col).Value <> k Then Exit For
Next rw
If s <> Cells(rw - 1, 1).Value Then s = s & "-" & Cells(rw - 1, 1).Value
If dic.exists(k) Then dic(k) = dic(k) & "," & s Else dic.Add k, s
Wend
outRng.Value = Cells(1, col).Value
keys = dic.keys
For Each k In keys
Set outRng = outRng.Offset(1)
outRng.Value = k
outRng.Offset(, 1).Value = dic(k)
Next k
Set outRng = outRng.Offset(2)
Next col
End Sub

おおお!まさに!!これがやりたかったです!!ありがとうございます!
質問が分かりづらかったにも関わらず、私がやりたかったことを逞しい想像力で読み解き、理想通りのプログラムを組んでくださりありがとうございます。
数年間、どうにかできないものかとずっと悩んでいた作業だったので解決してくださりとても嬉しかったです。
No.7
- 回答日時:
番号は1,2,3,4というように1からの連番で昇順に並んでますが、
番号が戻るとか、重複するとかのケースもありありますか。
ケース① 番号が10,9,8
ケース② 番号が1,2,3,10,15
ケース③ 番号が1,2,3,4,3,3,4,5,6
tatsumaru77さん、ご回答いただきましてありがとうございます!
こちらで質問するのが初めてで勝手が分からなかったのですが、(当たり前ですが…)エクセル上の画面を貼り付けたほうが分かりやすかったこと。複数ケースが存在する場合は記載すること。など質問するにあたり基本的なことが抜けていたなと痛感しました。fujillinさんのコードで理想の動きができましたのでこれにて回答は締め切りますが、tatsumaru77さんからも色々なことを学ばせていただきました。私のために色々考えてくださりありがとうございました!
No.6
- 回答日時:
1.画面のレイアウトですが、添付図のように
①1行目は見出し
②A列が番号
③B列が項目名
④H列へ2行目から出力
でよろしいでしょうか。
2.出力時の文字ですが
:は、全角のコロン
-は、半角のハイフン
、は全角のカンマ
で間違いないでしょうか。

No.5
- 回答日時:
補足に対して。
上級者なんてとんでもありません。
そうであれば最初の回答でコードが作れてました。
提示されてるベテラン様のコードはその動きとしては頭にモヤモヤ浮かんでましたが、具体的に作成も出来なかったですし。
私は永遠の初級者です。
上級者様って私が今まで回答してきた物とは比べ物にもならないコードを書かれますよ。
20年前に思い知りました。(当時は無論ちんぷんかんぷんでした)
めぐみんさん、回答ありがとうございます!
私にとってはめぐみんさんも立派な上級者様です!
20年もコードを書き続け、こうして私含む色んな人に教えられる立場にいられることは本当に素晴らしいと思います。ありがとうございました!
No.4
- 回答日時:
こんばんは、
取り敢えず、べたアルゴリズムが先に浮かんだので少し違うと思いますが、
(条件名が繰り返し出て来ますが、直せると思います)こんな感じかな?
番号はA列です。条件②も同じかな?
DictionaryのItemでもう少しわかり易く出来ると思います。
Sub Sample()
Dim i As Long, j As Long, n As Long
Dim Ary, tmp As String
Dim flag As Boolean
Dim Dic, msg
Set Dic = CreateObject("Scripting.Dictionary")
With ActiveSheet
For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row
If Not Dic.Exists(Cells(i, "B").Value) Then
Dic.Add Cells(i, "B").Value, Cells(i, "B").Value
End If
Next i
Ary = Dic.Keys
For i = 0 To UBound(Ary)
flag = False
For j = 1 To .Cells(Rows.Count, "B").End(xlUp).Row + 1
If Ary(i) = .Cells(j, "B").Value Then
If flag = False Then
tmp = Ary(i) & " :" & .Cells(j, "B").Offset(, -1).Value
End If
flag = True
Else
If flag = True Then
n = n + 1
msg = msg & tmp & "-" & .Cells(j - 1, "B").Offset(, -1).Value & vbCrLf
' .Cells(n, "G") = tmp & "-" & .Cells(j - 1, "B").Offset(, -1).Value
tmp = ""
flag = False
End If
End If
Next
Next
End With
MsgBox (msg)
End Sub
出来れば同じシートに出力
コメントアウトを解除してください。(G列に出力)
Qchan1962さん、ありがとうございます!
マクロを動かしたときにやりたかった動作ができて感動しました!
今回はfujillinさんのプログラムを業務に生かすことにしましたが、Qchan1962さんのプログラムも読み解いて他の業務に活用できないか考えてみようと思います。回答いただきましてありがとうございました!
No.2
- 回答日時:
結果の方のアルファベット(条件①、②の値)って背景色も必要なのでしょうか?
それともただ質問用の仕様なのでしょうか?
ArrayList とかが使えるのなら初級者でもいけそうなのですが、最近のWIN10だと『.NET Framework 3.5 の有効化』が上手くいかないみたいですしね。
こちらで出来ても質問者さんの方でダメなら意味ないですし。
昭和ジジィのせいなのか画像とリンク先の内容で『なさりたい事』はわかるのですが、それを『現実に可能とさせる方法』で頭のお味噌が発酵中です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- Yahoo!メール Yahooメールにログインできません 2 2022/12/12 07:46
- Excel(エクセル) 【Excel】住所に郵便番号を付記する方法 3 2022/05/07 17:15
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Visual Basic(VBA) VBA シート間の転記で、条件の追加コードの書き方について教えて下さい。 13 2023/02/26 09:31
- Visual Basic(VBA) エクセルVBA 4 2022/05/14 00:51
- その他(データベース) Excel VBA 転記について 1 2022/04/20 16:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
マクロを教えてください。
-
4Kの外部モニターに出力すると...
-
【UWSC】WEBページ中の特定文字...
-
プログラムについての質問です...
-
PD充電器について
-
スマホ充電器購入にあたり
-
ニューラルネットワークによる...
-
csv出力した内容を配列で取得で...
-
AVアンプのHDMI出力をdisplaypo...
-
この記号はどうやって出力しま...
-
PIC18系のコンペアモードについて
-
PCでPCのゲームを録画する
-
リストボックスの内容を テキ...
-
C言語のプログラミング【文字列】
-
Joyetech eGo AIOの出力は?
-
重複データの表示方法
-
MMDでavi出力が出来ない
-
マイピクチャが開けなくなりました
-
Windows Formアプリからコンソ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
PD充電器について
-
cout と cerrの違い
-
スマホ充電器購入にあたり
-
Accessのテーブルからcsv出力す...
-
MMDでavi出力が出来ない
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
TV出力ポートをOFFにすれば良い...
-
COBOLのMOVEで桁数が異なる場合
-
VBAでテキスト出力時のスペース...
-
ACCESS クエリ→フォーム...
-
coutで出力した文字を消去する...
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
Windows Formアプリからコンソ...
-
コンセントの電力は入力と出力...
-
C#でアクセス権限の取得方法が...
-
【VBA】PDFを2in1で出力したいです
おすすめ情報
説明が分かりにくく混乱させてしまい申し訳ありません!
色はリンクさせる必要はありません。
表をシンプルにしてみました。
例えば、
条件①、りんごの項目は1、2、3、4、5、6の番号が付与されているので、
他のセルに【りんご:番号1-6】と抽出したいです。
条件①、バナナの項目は7、8、11、12の番号が付与されているので、
他のセルに【B:7-8、11-12】と抽出させたいです。。。
めぐみんさん、コメントくださいましてありがとうございます!
背景色は必要ではありません!説明が分かりにくいかなと思って色を塗ったのですが、余計に分かりにくくしてしまったようで大変失礼しました。
ArrayListは初めて聞きました。職場のPCはwin10なのでもしかしたらうまくいかないかもしれません。
初心者の私は手も足もでない状態になってしまっているのですが、上級者様でも難しいことをしようとしていたのですね。。。
tatsumaru77さん、回答ありがとうございます!
質問が分かりにくくて大変申し訳ありませんでした。
補足にて表を簡素化して例を挙げてみました。ご確認いただけますと幸いです。