![見出し画像](https://assets.st-note.com/production/uploads/images/174095091/rectangle_large_type_2_18a7c04affd91f157df667b6576bce88.png?width=1200)
マスタに登録した市区町村コードを隣列にだすよ
この説明は、ChatGPTで作成しています。
このマクロの概要
このVBAマクロは、Excelの「CDマスタ」シートに登録されている市区町村の情報を使って、現在アクティブなシートのA列(都道府県名+市区町村名)に対応するコード(CD1, CD2)をB列・C列に自動で入力するプログラムです。
また、マスタのデータも更新し、「検出回数(何回その市区町村が見つかったか)」と「最新検出日」も更新します。
マクロの処理の流れ
画面更新を停止
→ マクロの実行速度を上げるために、画面の更新を一時停止します。「CDマスタ」シートのデータを取得
「CDマスタ」シートを取得し、そのデータを**配列(Master)**に保存します。
配列のデータ構成は以下のようになっています。
A列: 都道府県名
B列: 市区町村名
C列: CD1(市区町村コード1)
D列: CD2(市区町村コード2)
E列: 検出回数(何回データとして使われたか)
F列: 最新検出日
アクティブシートの検索範囲を設定
A2セル以降のデータを検索範囲(SearchRange)として設定します。
ここには「都道府県名+市区町村名」が入っている前提です。
「CDマスタ」のデータをアクティブシートで検索
「CDマスタ」のデータ(都道府県名+市区町村名)が、アクティブシートのA列に存在するかを検索します。
Find関数を使って、該当するセルを見つけます。
見つかった場合、B列とC列にCD1とCD2を入力します。
もし同じ市区町村が複数回出てきた場合は、「,(カンマ)」で区切ってCD1・CD2を追加していきます。
「CDマスタ」の検出回数と最新検出日を更新
マスタの「検出回数」を+1します。
「最新検出日」を今日の日付に更新します。
更新データを「CDマスタ」に一括反映
E列(検出回数)とF列(最新検出日)だけを一括更新することで、処理を高速化します。
処理完了のメッセージを表示
「チェック完了!」というメッセージを表示し、画面更新を再開します。
このマクロのポイント
✅ 配列を使ってデータを一括処理
Excelのセルを直接操作すると動作が遅くなりますが、一度配列にデータを取り込んで処理し、最後にまとめて書き戻すことで高速化しています。
✅ Find関数を使ってデータを検索
Find を使うことで、A列にある「都道府県名+市区町村名」と「CDマスタ」のデータを素早く照合できます。
✅ 複数の一致を考慮
もし同じ市区町村が複数回出てきた場合、カンマ区切りでCD1・CD2を追加する仕組みになっています。
✅ マスタデータの更新
ただ検索するだけでなく、「検出回数」や「最新検出日」も自動で更新されるので、データの管理がしやすくなります。
活用できる場面
🔹 市区町村コードの自動入力
都道府県名+市区町村名から、対応するコードを自動入力したいとき。
🔹 データ分析の補助
どの市区町村がどれくらい使われたか、検出回数を記録して分析するのに役立ちます。
🔹 データ整備の効率化
いちいち手入力しなくても、市区町村名が入力されると自動でCD1・CD2が入るので、データ整備が楽になります。
関連リンク
Sub マスタに登録した市区町村コードを隣列にだすよ()
Application.ScreenUpdating = False
'マスターを配列に保存する
Dim wsm As Worksheet
Set wsm = Worksheets("CDマスタ")
Dim lastRow As Long, lastCol As Long
lastRow = wsm.Cells(wsm.Rows.count, 1).End(xlUp).Row
lastCol = wsm.Cells(1, wsm.Columns.count).End(xlToLeft).Column
Dim Master As Variant
'マスターのテーブル範囲を設定(見出し含まず)
' マスターテーブルA列「都道府県名」B列「市区町村名」C列「CD1」D列「CD2」
' マスターテーブルE列「検出回数」F列「最新検出日」
Master = wsm.Range(wsm.Cells(2, 1), wsm.Cells(lastRow, lastCol)).Value
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Activate
'検索範囲を制限(列1、行2以降)
Dim SearchRange As Range
Set SearchRange = ws.Range("A2:A" & ws.Cells(ws.Rows.count, 1).End(xlUp).Row)
Dim FoundCell As Range, FirstCell As Range
Dim i As Long
For i = LBound(Master) To UBound(Master)
Dim i2 As Long
Dim myStr As String
Set FoundCell = SearchRange.Find(What:=Master(i, 1) & Master(i, 2))
If FoundCell Is Nothing Then
GoTo L1
Else
Set FirstCell = FoundCell
End If
' セルの書式を文字列に変更
FoundCell.Offset(0, 1).NumberFormat = "@"
FoundCell.Offset(0, 2).NumberFormat = "@"
If FoundCell.Offset(0, 1) = "" Then
FoundCell.Offset(0, 1) = Master(i, 3)
Else
FoundCell.Offset(0, 1) = FoundCell.Offset(0, 1).Value & "," & Master(i, 3)
End If
If FoundCell.Offset(0, 2) = "" Then
FoundCell.Offset(0, 2) = Master(i, 4)
Else
FoundCell.Offset(0, 2) = FoundCell.Offset(0, 2).Value & "," & Master(i, 4)
End If
Master(i, 5) = Master(i, 5) + 1
Master(i, 6) = Date
Do
Set FoundCell = SearchRange.FindNext(FoundCell)
If FoundCell Is Nothing Then
GoTo L1
ElseIf FoundCell.Address = FirstCell.Address Then
GoTo L1
End If
If FoundCell.Offset(0, 1) = "" Then
FoundCell.Offset(0, 1) = Master(i, 3)
Else
FoundCell.Offset(0, 1) = FoundCell.Offset(0, 1).Value & "," & Master(i, 3)
End If
If FoundCell.Offset(0, 2) = "" Then
FoundCell.Offset(0, 2) = Master(i, 4)
Else
FoundCell.Offset(0, 2) = FoundCell.Offset(0, 2).Value & "," & Master(i, 4)
End If
Master(i, 5) = Master(i, 5) + 1
Master(i, 6) = Date
Loop
L1:
Next i
' マスタの5列目と6列目のみを配列で一括更新
Dim UpdateData As Variant
Dim rowCount As Long
rowCount = UBound(Master) - LBound(Master) + 1
' 5列目と6列目のデータのみを抽出
ReDim UpdateData(1 To rowCount, 1 To 2)
Dim j As Long
For j = 1 To rowCount
UpdateData(j, 1) = Master(j, 5) ' 5列目(検出回数)
UpdateData(j, 2) = Master(j, 6) ' 6列目(最新検出日)
Next j
' シートへ一括反映
wsm.Range(wsm.Cells(2, 5), wsm.Cells(lastRow, 6)).Value = UpdateData
MsgBox "チェック完了!"
Application.ScreenUpdating = True
End Sub
ハッシュタグ
#excel #できること #vba #マクロ #データ整理 #市区町村 #コード自動入力 #Find関数 #配列処理 #データ管理 #Excel活用 #カンマ区切り #一括更新 #データ検索 #自動入力 #プログラミング #業務効率化 #データベース #エクセル #仕事効率化
English Translation
Retrieve Municipality Code Registered in Master List
This explanation is created using ChatGPT.
Overview of this Macro
This VBA macro retrieves municipality information registered in the "CD Master" sheet and automatically enters the corresponding codes (CD1, CD2) into columns B and C of the active sheet based on the data in column A (Prefecture + Municipality Name).
Additionally, it updates the master data by recording the detection count and latest detection date.
How the Macro Works
Disable Screen Updating
→ Temporarily stops screen updates to speed up the macro execution.Retrieve Data from "CD Master" Sheet
The "CD Master" sheet is retrieved, and its data is stored in an array (Master).
Data structure:
Column A: Prefecture Name
Column B: Municipality Name
Column C: CD1 (Municipality Code 1)
Column D: CD2 (Municipality Code 2)
Column E: Detection Count
Column F: Latest Detection Date
Set Search Range in Active Sheet
Defines column A from row 2 onward as the search range (SearchRange).
Search for Matches in Active Sheet
Uses the Find function to locate the matching Prefecture + Municipality Name in column A.
If a match is found, CD1 and CD2 are entered into columns B and C.
If multiple matches exist, they are appended with commas.
Update Detection Count and Latest Detection Date in Master Data
Increments the detection count.
Updates the latest detection date to today’s date.
Batch Update Data in "CD Master"
Updates only columns E and F to improve efficiency.
Display Completion Message
Displays “Check Complete!” and resumes screen updates.
Use Cases
Automating municipality code input
Analyzing detection frequency of municipalities
Improving efficiency in data management
Related Links