重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

VBA初心者です。
自分なりに色々考えてみたり職場の人に相談してみたのですがどうしても解決することができなかったため、こちらで相談させていただきます。

条件①と条件②の各項目に番号が付与されているので、各項目に合致した番号を全て抜き出したいです。(添付画像参照)
またこの時に、連続する番号はハイフンでつなげる。番号が飛び飛びな場合は間に「、」や「 」を入れて繋げる。ということも実現したいです・・・。

数値をハイフンでまとめる方法は下記の方法で実現できそうな気がするのですが、番号をうまく抜き出すことができずお手上げ状態です。 
VBAでカンマ区切り数値をハイフンでまとめたい
https://oshiete.goo.ne.jp/qa/8299917.html

説明が拙く申し訳ありません。どなたかお知恵を貸していただけますと幸いです。

「VBAで各項目に合致する番号を全て抜き出」の質問画像

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

  • 説明が分かりにくく混乱させてしまい申し訳ありません!
    色はリンクさせる必要はありません。
    表をシンプルにしてみました。

    例えば、
    条件①、りんごの項目は1、2、3、4、5、6の番号が付与されているので、
    他のセルに【りんご:番号1-6】と抽出したいです。
    条件①、バナナの項目は7、8、11、12の番号が付与されているので、
    他のセルに【B:7-8、11-12】と抽出させたいです。。。

    「VBAで各項目に合致する番号を全て抜き出」の補足画像1
      補足日時:2021/02/24 22:10
  • めぐみんさん、コメントくださいましてありがとうございます!
    背景色は必要ではありません!説明が分かりにくいかなと思って色を塗ったのですが、余計に分かりにくくしてしまったようで大変失礼しました。
    ArrayListは初めて聞きました。職場のPCはwin10なのでもしかしたらうまくいかないかもしれません。
    初心者の私は手も足もでない状態になってしまっているのですが、上級者様でも難しいことをしようとしていたのですね。。。

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/02/24 22:23
  • tatsumaru77さん、回答ありがとうございます!
    質問が分かりにくくて大変申し訳ありませんでした。
    補足にて表を簡素化して例を挙げてみました。ご確認いただけますと幸いです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/02/24 22:26

A 回答 (7件)

こんばんは



セル位置もわからないし、内容もよくわかりませんけれど、勝手に想像をたくましゅうして、こんなことでしょうか?
※ 添付図の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
「VBAで各項目に合致する番号を全て抜き出」の回答画像3
    • good
    • 3
この回答へのお礼

ありがとう

おおお!まさに!!これがやりたかったです!!ありがとうございます!
質問が分かりづらかったにも関わらず、私がやりたかったことを逞しい想像力で読み解き、理想通りのプログラムを組んでくださりありがとうございます。
数年間、どうにかできないものかとずっと悩んでいた作業だったので解決してくださりとても嬉しかったです。

お礼日時:2021/02/25 18:09

番号は1,2,3,4というように1からの連番で昇順に並んでますが、


番号が戻るとか、重複するとかのケースもありありますか。
ケース① 番号が10,9,8
ケース② 番号が1,2,3,10,15
ケース③ 番号が1,2,3,4,3,3,4,5,6
    • good
    • 0
この回答へのお礼

助かりました

tatsumaru77さん、ご回答いただきましてありがとうございます!
こちらで質問するのが初めてで勝手が分からなかったのですが、(当たり前ですが…)エクセル上の画面を貼り付けたほうが分かりやすかったこと。複数ケースが存在する場合は記載すること。など質問するにあたり基本的なことが抜けていたなと痛感しました。fujillinさんのコードで理想の動きができましたのでこれにて回答は締め切りますが、tatsumaru77さんからも色々なことを学ばせていただきました。私のために色々考えてくださりありがとうございました!

お礼日時:2021/02/25 18:20

1.画面のレイアウトですが、添付図のように


①1行目は見出し
②A列が番号
③B列が項目名
④H列へ2行目から出力
でよろしいでしょうか。

2.出力時の文字ですが
:は、全角のコロン
-は、半角のハイフン
、は全角のカンマ
で間違いないでしょうか。
「VBAで各項目に合致する番号を全て抜き出」の回答画像6
    • good
    • 1

補足に対して。



上級者なんてとんでもありません。
そうであれば最初の回答でコードが作れてました。
提示されてるベテラン様のコードはその動きとしては頭にモヤモヤ浮かんでましたが、具体的に作成も出来なかったですし。
私は永遠の初級者です。

上級者様って私が今まで回答してきた物とは比べ物にもならないコードを書かれますよ。
20年前に思い知りました。(当時は無論ちんぷんかんぷんでした)
    • good
    • 1
この回答へのお礼

助かりました

めぐみんさん、回答ありがとうございます!
私にとってはめぐみんさんも立派な上級者様です!
20年もコードを書き続け、こうして私含む色んな人に教えられる立場にいられることは本当に素晴らしいと思います。ありがとうございました!

お礼日時:2021/02/25 18:16

こんばんは、


取り敢えず、べたアルゴリズムが先に浮かんだので少し違うと思いますが、
(条件名が繰り返し出て来ますが、直せると思います)こんな感じかな?
番号は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列に出力)
    • good
    • 2
この回答へのお礼

ありがとう

Qchan1962さん、ありがとうございます!
マクロを動かしたときにやりたかった動作ができて感動しました!
今回はfujillinさんのプログラムを業務に生かすことにしましたが、Qchan1962さんのプログラムも読み解いて他の業務に活用できないか考えてみようと思います。回答いただきましてありがとうございました!

お礼日時:2021/02/25 18:12

結果の方のアルファベット(条件①、②の値)って背景色も必要なのでしょうか?


それともただ質問用の仕様なのでしょうか?

ArrayList とかが使えるのなら初級者でもいけそうなのですが、最近のWIN10だと『.NET Framework 3.5 の有効化』が上手くいかないみたいですしね。
こちらで出来ても質問者さんの方でダメなら意味ないですし。

昭和ジジィのせいなのか画像とリンク先の内容で『なさりたい事』はわかるのですが、それを『現実に可能とさせる方法』で頭のお味噌が発酵中です。
この回答への補足あり
    • good
    • 1

すみません。

なにをなさりたいのか上記の画像だけではよくわかりません。
もっと、具体的に例を挙げて説明していただけませんでしょうか。
この回答への補足あり
    • good
    • 2

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