Excel VBA 質問スレッド №2012 (解決済)
ばらばらな写真番号を連番に変更する
投稿者 : 蓬 投稿日時 : 2024/09/11(Wed) 17:03:51 OS : Windows 10 EXCEL : Excel 2019
撮影時についている写真番号が入っている列の隣の列に上から昇順で連番を入れたいと考えています。
写真番号が重複している場合は同じ番号を付けたいと考えています。
いろいろと試してみたのですが、重複が1,2個であればうまくできたのですがそれ以上になるとうまく番号を振り返れなくて…
皆様の知識を貸していただけないでしょうか。
【仕様】
・A列に元の写真番号,B列に変更後の写真番号を入力
・元の写真番号が同じものは変更後の写真番号も同じ番号になる
・元の写真番号が1つのセルに2つ入っているものは、変更後の写真番号も1つのセルに2つ入れる
・元写真番号が"-"のものは変更後の写真番号は空白
【イメージ】
| A |B |
|1000 |1 |
|1010 |2 |
|1010 |2 |
|100,101|3,4|
|512 |5 |
| - | |
|560 |6 |
|512 |5 |
|600 |7 |
一応作成中のコードを載せておきます。
撮影時についている写真番号が入っている列の隣の列に上から昇順で連番を入れたいと考えています。
写真番号が重複している場合は同じ番号を付けたいと考えています。
いろいろと試してみたのですが、重複が1,2個であればうまくできたのですがそれ以上になるとうまく番号を振り返れなくて…
皆様の知識を貸していただけないでしょうか。
【仕様】
・A列に元の写真番号,B列に変更後の写真番号を入力
・元の写真番号が同じものは変更後の写真番号も同じ番号になる
・元の写真番号が1つのセルに2つ入っているものは、変更後の写真番号も1つのセルに2つ入れる
・元写真番号が"-"のものは変更後の写真番号は空白
【イメージ】
| A |B |
|1000 |1 |
|1010 |2 |
|1010 |2 |
|100,101|3,4|
|512 |5 |
| - | |
|560 |6 |
|512 |5 |
|600 |7 |
一応作成中のコードを載せておきます。
Sub 写真番号() Dim no, noa, i, j, k As Integer Dim tmp As Variant Dim tmp2 As Variant no = 1 k = Range("B" & Rows.Count).End(xlUp).Row 'データ最終行番号取得 Range(Cells(3, 8), Cells(k, 8)).ClearContents For i = 3 To k tmp = Split(Cells(i, 7), ",") tmp2 = Split(Cells(i + 1, 7), ",") noa = UBound(tmp) If noa = 0 Then If Cells(i, 7) = "-" Then Cells(i, 8).ClearContents no = no + 1 Else Cells(i, 8) = no no = no + 1 End If ElseIf noa > 0 Then For j = 0 To noa Cells(i, 8) = Cells(i, 8) & no & "," no = no + 1 Next j Cells(i, 8) = Left(Cells(i, 8), Len(Cells(i, 8)) - 1) End If Next i For i = 3 To k For j = i + 1 To k If Cells(i, 7) = Cells(j, 7) Then Cells(j, 8) = Cells(i, 8) x = j + 1 If Cells(x, 8) = "" Then x = x + 1 End If Cells(x, 8) = Cells(j, 8) + 1 End If Next j Next i End Sub
スポンサーリンク
[返信 1] Re : ばらばらな写真番号を連番に変更する
投稿者 : てらてら 投稿日時 : 2024/09/11(Wed) 19:09:47
こんにちは。
重複がいくつあるか不明なので、総当たりしないとだめでしょう。
考え方としては、1行目のA列の写真番号を取得したら、B列に値を振り、
そのまま1行目の番号を末尾まで検索し、見つかればB列に値を記録します。
末尾まで行ったら、2行目のB列に値が無い事を確認して、B列に値を振り、末尾まで検索していきます。
これを繰返していけば良いと思います。
こんにちは。
重複がいくつあるか不明なので、総当たりしないとだめでしょう。
考え方としては、1行目のA列の写真番号を取得したら、B列に値を振り、
そのまま1行目の番号を末尾まで検索し、見つかればB列に値を記録します。
末尾まで行ったら、2行目のB列に値が無い事を確認して、B列に値を振り、末尾まで検索していきます。
これを繰返していけば良いと思います。
[返信 2] Re : ばらばらな写真番号を連番に変更する
投稿者 : ピロリ 投稿日時 : 2024/09/11(Wed) 21:36:29
やり方は色々あるかと思いますが、
・このシートの 21列目以降を処理用に使用させてもらう。 ・・・ 下のコードでは 定数:Col
・1つのセルに入力される「,」区切りの番号は最大10個。 ・・・ 下のコードでは 定数:Max
の前提で一例です。
やり方は色々あるかと思いますが、
・このシートの 21列目以降を処理用に使用させてもらう。 ・・・ 下のコードでは 定数:Col
・1つのセルに入力される「,」区切りの番号は最大10個。 ・・・ 下のコードでは 定数:Max
の前提で一例です。
Sub Sample() Const Col As Long = 21 'この列以降を処理用に使用します Const Max As Long = 10 '1セルに入力される最大の番号数 Dim i As Long, j As Long, cnt As Long Dim buf As String, tmp As Variant Dim r As Range Range(Cells(1, Col), Cells(1, Col + Max * 2 - 1)).EntireColumn.ClearContents '処理範囲消去 cnt = 1 For i = 3 To Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行までループ If Cells(i, "A") = "-" Then Cells(i, "B") = "" '「-」ならば、B列は空白 Else buf = "" tmp = Split(Cells(i, "A").Text, ",") 'A列の旧番号を分解 For j = 0 To UBound(tmp) '1セルの番号分のループ Set r = Range(Cells(1, Col), Cells(1, Col + Max - 1)).EntireColumn. _ Find(what:=tmp(j), LookAt:=xlWhole) '処理範囲を旧番号で検索 If r Is Nothing Then '無かったら、 Cells(i, Col + Max).Offset(0, j) = cnt '新しい番号を採番 cnt = cnt + 1 Else '有ったら、 Cells(i, Col + Max).Offset(0, j) = r.Offset(0, Max) '採番済みの番号を取得 End If Cells(i, Col).Offset(0, j) = tmp(j) '旧番号を格納 buf = buf & "," & Cells(i, Col + Max).Offset(0, j) '新しい番号を合成 Next j Cells(i, "B") = Mid(buf, 2) '新しい番号をB列へ出力 End If Next i End Sub
[返信 3] Re : ばらばらな写真番号を連番に変更する
投稿者 : anonymous 投稿日時 : 2024/09/13(Fri) 07:45:41
こんな書き方もあるでしょう。
こんな書き方もあるでしょう。
Sub test() Dim dic As Object Dim k&, p& Dim s$, ss$ Dim e Set dic = CreateObject("Scripting.Dictionary") For k = 1 To Cells(Rows.Count, "A").End(xlUp).Row s = Cells(k, "A").Value If s <> "" And s <> "-" Then ss = "" For Each e In Split(s, ",") If Not dic.exists(e) Then p = p + 1 dic(e) = p ss = ss & "," & p Else ss = ss & "," & dic(e) End If Next Cells(k, "B").Value = Mid(ss, 2) End If Next End Sub
[返信 4] Re : ばらばらな写真番号を連番に変更する
投稿者 : 蓬 投稿日時 : 2024/09/13(Fri) 18:07:27
■[返信 1] てらてらさん(2024-09-11 19:09:47)の記事
> こんにちは。
>
> 重複がいくつあるか不明なので、総当たりしないとだめでしょう。
>
> 考え方としては、1行目のA列の写真番号を取得したら、B列に値を振り、
> そのまま1行目の番号を末尾まで検索し、見つかればB列に値を記録します。
>
> 末尾まで行ったら、2行目のB列に値が無い事を確認して、B列に値を振り、末尾まで検索していきます。
>
> これを繰返していけば良いと思います。
>
ご教示いただきありがとうございます。
重複をチェックとB列の入力を同時に行うという発想がなかったです。
この方法で再度組みなおしてみます。
■[返信 1] てらてらさん(2024-09-11 19:09:47)の記事
> こんにちは。
>
> 重複がいくつあるか不明なので、総当たりしないとだめでしょう。
>
> 考え方としては、1行目のA列の写真番号を取得したら、B列に値を振り、
> そのまま1行目の番号を末尾まで検索し、見つかればB列に値を記録します。
>
> 末尾まで行ったら、2行目のB列に値が無い事を確認して、B列に値を振り、末尾まで検索していきます。
>
> これを繰返していけば良いと思います。
>
ご教示いただきありがとうございます。
重複をチェックとB列の入力を同時に行うという発想がなかったです。
この方法で再度組みなおしてみます。
[返信 5] Re : ばらばらな写真番号を連番に変更する
投稿者 : 蓬 投稿日時 : 2024/09/13(Fri) 18:10:06
■[返信 2] ピロリさん(2024-09-11 21:36:29)の記事
> やり方は色々あるかと思いますが、
> ・このシートの 21列目以降を処理用に使用させてもらう。 ・・・ 下のコードでは 定数:Col
> ・1つのセルに入力される「,」区切りの番号は最大10個。 ・・・ 下のコードでは 定数:Max
> の前提で一例です。
>
>
>
ご教示いただきありがとうございます。
詳しい説明やプログラム例も教えていただきありがとうございます。
早速試してみたいと思います。
■[返信 2] ピロリさん(2024-09-11 21:36:29)の記事
> やり方は色々あるかと思いますが、
> ・このシートの 21列目以降を処理用に使用させてもらう。 ・・・ 下のコードでは 定数:Col
> ・1つのセルに入力される「,」区切りの番号は最大10個。 ・・・ 下のコードでは 定数:Max
> の前提で一例です。
>
>
>
ご教示いただきありがとうございます。
詳しい説明やプログラム例も教えていただきありがとうございます。
早速試してみたいと思います。
[返信 6] Re : ばらばらな写真番号を連番に変更する
投稿者 : 蓬 投稿日時 : 2024/09/13(Fri) 18:11:14
■[返信 3] anonymousさん(2024-09-13 07:45:41)の記事
> こんな書き方もあるでしょう。
>
ご教示いただきありがとうございます。
プログラム例も教えていただきありがとうございます。
早速試してみたいと思います。
■[返信 3] anonymousさん(2024-09-13 07:45:41)の記事
> こんな書き方もあるでしょう。
>
ご教示いただきありがとうございます。
プログラム例も教えていただきありがとうございます。
早速試してみたいと思います。
[返信 7] Re : ばらばらな写真番号を連番に変更する
投稿者 : 蓬 投稿日時 : 2024/09/17(Tue) 16:43:01
ご連絡が遅くなってしまいすみません。
無事に問題は解決いたしました。
皆様、様々な解決方法を教えていただきありがとうございました。
ご連絡が遅くなってしまいすみません。
無事に問題は解決いたしました。
皆様、様々な解決方法を教えていただきありがとうございました。
当掲示板について
- Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
- 記事内ではHTMLのタグは使用できません。
- 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
- Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
- Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
( 処理日時 : 2025-07-05 01:33:33 )