目次
今回の業務内容と改善テーマ
前回は
・列番号の動的管理
・壊れにくい構造
ここまで完成しました。
正直、この時点で「実務で使えるレベル」には入っています。
ただし、ここからが“現場で差が出る部分”です。
今回の改善テーマはこの2つです。
・並び順の統一
・UI改善(選択してください表示)
一見地味ですが、ここをやるかどうかで
使いやすさが別物になります。
なぜこの2つが重要なのか
まず並び順。
前回の状態は
Dictionaryでユニーク化しただけ なので
表示順がバラバラ になります。
これ、実務だとかなりストレスです。
・探しにくい
・ミスが増える
・操作が遅くなる
次にUI。
初期状態で何も表示されていないと
・どこから触ればいいか分からない
・未選択状態が分かりにくい
になります。
つまり今回の改善は「使う人のための修正」です。

今回取り扱うデータも経済産業省の公開データ「生産動態統計年報(2024年)」です。
実際のCopilotとのやり取り
利用者 → Copilot
既存の階層連動コンボボックスのコードを改善してください。 ■修正内容
・各コンボボックスのリストを昇順で並び替える
・初期状態で「選択してください」を表示する
・各Changeイベント時にも未選択状態を分かりやすくする
・既存のロジック(列番号の動的取得・階層連動・ユニーク化)は維持 ■その他
・可読性重視でコメント付き
・コードは省略せず全文提示してください
Copilot → 利用者
Option Explicit
'---------------------------------------------
' フォーム初期化:調査票名のみロード
'---------------------------------------------
Private Sub UserForm_Initialize()
Load調査票名
End Sub
'---------------------------------------------
' 調査票名変更 → 項目名を再ロード
'---------------------------------------------
Private Sub cmb調査票名_Change()
'下位をクリアし、未選択状態を明示
ResetCombo cmb項目名
ResetCombo cmb品目名
ResetCombo cmbアイテム名
If cmb調査票名.ListIndex > 0 Then '※0 は「選択してください」
Load項目名 cmb調査票名.value
End If
End Sub
'---------------------------------------------
' 項目名変更 → 品目名を再ロード
'---------------------------------------------
Private Sub cmb項目名_Change()
ResetCombo cmb品目名
ResetCombo cmbアイテム名
If cmb調査票名.ListIndex > 0 And cmb項目名.ListIndex > 0 Then
Load品目名 cmb調査票名.value, cmb項目名.value
End If
End Sub
'---------------------------------------------
' 品目名変更 → アイテム名を再ロード
'---------------------------------------------
Private Sub cmb品目名_Change()
ResetCombo cmbアイテム名
If cmb調査票名.ListIndex > 0 _
And cmb項目名.ListIndex > 0 _
And cmb品目名.ListIndex > 0 Then
Loadアイテム名 cmb調査票名.value, cmb項目名.value, cmb品目名.value
End If
End Sub
'===========================================================
' 共通:コンボボックスを初期状態に戻す
'===========================================================
Private Sub ResetCombo(cmb As MSForms.ComboBox)
cmb.Clear
cmb.AddItem "選択してください"
cmb.ListIndex = 0
End Sub
'===========================================================
' 共通:Dictionary → 昇順ソートした配列を返す
'===========================================================
Private Function SortedKeys(dic As Object) As Variant
Dim arr As Variant
arr = dic.Keys
'単純なバブルソート(高速化不要のため可読性優先)
Dim i As Long, j As Long
Dim tmp As String
For i = LBound(arr) To UBound(arr) - 1
For j = i + 1 To UBound(arr)
If arr(i) > arr(j) Then
tmp = arr(i)
arr(i) = arr(j)
arr(j) = tmp
End If
Next j
Next i
SortedKeys = arr
End Function
'===========================================================
' 調査票名のロード(最上位)
'===========================================================
Private Sub Load調査票名()
Dim ws As Worksheet
Dim lastRow As Long
Dim dic As Object
Dim i As Long
Dim val As String
Set ws = ThisWorkbook.Worksheets("data")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set dic = CreateObject("Scripting.Dictionary")
'D列(調査票名)をユニーク化
For i = 2 To lastRow
val = Trim(ws.Cells(i, "D").value)
If val <> "" Then
If Not dic.Exists(val) Then dic.Add val, True
End If
Next i
'初期化
ResetCombo cmb調査票名
'昇順ソートしてセット
Dim arr As Variant
arr = SortedKeys(dic)
Dim v As Variant
For Each v In arr
cmb調査票名.AddItem v
Next v
End Sub
'===========================================================
' 項目名のロード(調査票名 → 項目名)
'===========================================================
Private Sub Load項目名(ByVal 調査票 As String)
Dim ws As Worksheet
Dim lastRow As Long
Dim dic As Object
Dim i As Long
Dim val As String
Set ws = ThisWorkbook.Worksheets("data")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To lastRow
If Trim(ws.Cells(i, "D").value) = 調査票 Then
val = Trim(ws.Cells(i, "E").value)
If val <> "" Then
If Not dic.Exists(val) Then dic.Add val, True
End If
End If
Next i
ResetCombo cmb項目名
Dim arr As Variant
arr = SortedKeys(dic)
Dim v As Variant
For Each v In arr
cmb項目名.AddItem v
Next v
End Sub
'===========================================================
' 品目名のロード(調査票名 × 項目名 → 品目名)
'===========================================================
Private Sub Load品目名(ByVal 調査票 As String, ByVal 項目 As String)
Dim ws As Worksheet
Dim lastRow As Long
Dim dic As Object
Dim i As Long
Dim val As String
Dim condition As String
Set ws = ThisWorkbook.Worksheets("data")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set dic = CreateObject("Scripting.Dictionary")
condition = 調査票 & "|" & 項目
For i = 2 To lastRow
If ws.Cells(i, "D").value & "|" & ws.Cells(i, "E").value = condition Then
val = Trim(ws.Cells(i, "F").value)
If val <> "" Then
If Not dic.Exists(val) Then dic.Add val, True
End If
End If
Next i
ResetCombo cmb品目名
Dim arr As Variant
arr = SortedKeys(dic)
Dim v As Variant
For Each v In arr
cmb品目名.AddItem v
Next v
End Sub
'===========================================================
' アイテム名のロード(調査票名 × 項目名 × 品目名 → アイテム名)
'===========================================================
Private Sub Loadアイテム名(ByVal 調査票 As String, _
ByVal 項目 As String, _
ByVal 品目 As String)
Dim ws As Worksheet
Dim lastRow As Long
Dim dic As Object
Dim i As Long
Dim val As String
Dim condition As String
Set ws = ThisWorkbook.Worksheets("data")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set dic = CreateObject("Scripting.Dictionary")
condition = 調査票 & "|" & 項目 & "|" & 品目
For i = 2 To lastRow
If ws.Cells(i, "D").value & "|" & ws.Cells(i, "E").value & "|" & ws.Cells(i, "F").value = condition Then
val = Trim(ws.Cells(i, "G").value)
If val <> "" Then
If Not dic.Exists(val) Then dic.Add val, True
End If
End If
Next i
ResetCombo cmbアイテム名
Dim arr As Variant
arr = SortedKeys(dic)
Dim v As Variant
For Each v In arr
cmbアイテム名.AddItem v
Next v
End Sub
この修正の本質
ここがかなり重要です。
今回やっていることは「データを整える」ではなく「表示を整える」です。
並び順が揃うだけで
・探す時間が減る
・誤選択が減る
・ストレスが減る
UI改善も同じです。
「選択してください」
これを入れるだけで
・状態が明確になる
・操作に迷わない
つまり
「ミスさせない設計」
になっています。
実務での変化
この2つを入れるだけで、別物になります。
・新人でも使える
・説明がいらない
・入力ミスが減る
現場では、速さより「ミスらないこと」の方が重要です。
次回やること
まだ終わりではありません。次はここをやります。
・高速化(配列化)
今は毎回ループしています。
データ量が増えると、確実に遅くなります。
ここを改善して、完全に業務ツールに仕上げます。
まとめ
今回は
・並び順の統一
・UI改善
この2つを追加しました。
やっていることはシンプルですが、実務ではかなり効きます。
特に重要なのは「使う人の視点」ここです。
動くコードは作れるようになります。
でも、使われるコードにするには、この改善が必要です。
そして今回も同じです。
コードは自分で書いていない
・やったのは整理
・やったのは指示
ここだけです。
ここまで来るとAIは「作るツール」ではなく「仕上げる相棒」になります。
リンク
ChatGPTでExcel VBAマクロを自動生成してみた|初心者でも使える実践手順
Excel VBAのエラー修正をChatGPTに頼んだら原因が一発で分かった話
仕様が曖昧でもOK?ChatGPTにExcel VBAを作らせてみた結果
ChatGPTに作らせたExcel VBAコードは安全?使う前に確認すべきポイント
Excel VBA初心者がChatGPTを使うと挫折しにくくなる理由
CopilotでExcel作業はどこまで効率化できる?実務で使ってみた結果
Copilotに仕事を任せてみた|メール・資料作成はここまで楽になる
Copilotが向いている人・向いていない人を実体験から整理してみた
ChatGPT・Copilot・Geminiに同じ仕事を頼んだら結果が全然違った
結局どれを使えばいい?目的別に生成AIを整理してみた【初心者向け】
初心者が最初にやるべき生成AI活用① ChatGPTで「長文を理解・整理する」読むのがしんどい人ほど効果が出る使い方
初心者が最初にやるべき生成AI活用②ChatGPTに「分からないことをそのまま相談する」使い方・聞き方を気にしない安心感
初心者が最初にやるべき生成AI活用③AIを「自分専用の調べ物係」にする使い方|検索に疲れた人ほど効果が出る
ChatGPTにブログ記事を“赤ペン先生”してもらったら修正力がすごかった話―書くのが苦手な人ほど使ってほしい文章改善―
CopilotでExcel作業手順書を一瞬で作る|引き継ぎ資料が秒で完成した話
Geminiでアイデアが枯れたときの発想復活法|何も思いつかないを脱出する使い方
ChatGPT・Copilot・Geminiをブレスト役で使い分ける実例|発想が加速した方法
CopilotでExcel集計→Word報告書を一気に作る実務フロー― 月次報告が“考えずに終わる”ようになった話 ―
Copilotで会議議事録からToDo管理まで一気にやってみた実務フロー
Geminiで社内資料の画像を作ってみた|伝わらない資料が一瞬で変わった話
ChatGPTに流行りの「今まで私があなたをどう扱ってきたかを画像にして」を頼んでみた
ChatGPTのプロンプトを“自分用”に進化させる方法|頼み方で結果が激変する理由
初心者が最初にやりがちなプロンプトの失敗例と直し方
ChatGPTが急に賢くなる「前提条件」の渡し方-同じ質問なのに答えが変わるのはなぜ?-
プロンプトを毎回書かなくてよくなる“会話の残し方”
ChatGPTに「察してもらえない」と感じた時の原因と対処法|噛み合わない理由を実例で解説
AIに雑に投げても失敗しにくくなる頼み方のコツ|考えずに使っても噛み合う方法
プロンプトが思いつかない人のための“最初の一文”テンプレ集
ChatGPTを“相棒化”する人と、うまく使えない人の決定的な差
生成AIはどこまで使っていい?初心者が最初に知るべき法律の話
AI画像生成は違法?著作権で“やってはいけないこと”実例集
商用利用OK?NG?生成AIの利用規約を初心者向けに噛み砕く
AIで作った文章は誰のもの?著作権の考え方をやさしく解説
「知らなかった」では済まない?生成AIトラブル事例と回避法
ブログ・SNSでAI生成物を使うときの最低限の注意点まとめ
AIに頼りすぎて思考力が落ちた話|便利さの裏で起きたリアル失敗
AIの回答を信じて怒られた話|正しいはずが通用しなかった理由
ChatGPTにExcelマクロを直してもらったらコメントが消えた話|親切の落とし穴
Copilotの差分コードが分からなかった話|全コード出してもらう選択
ChatGPTにきれいな文章はいらなかった話|ぐちゃぐちゃでも伝わる
ChatGPTは仕事に使うだけじゃない|高校生の恋愛LINEをChatGPTに相談したら既読スルーが減った話
ChatGPTは仕事に使うだけじゃない|バツイチ48歳のマッチングアプリ不安を解消した相談実例
ChatGPTは仕事に使うだけじゃない|社内不倫の相談を法と気持ちで整理した話
ChatGPTは仕事に使うだけじゃない|離婚前に確認すべきことを全部整理してくれた話
ChatGPTは仕事に使うだけじゃない|夫が不倫しているかも…調べ方を相談してみた話
ChatGPTは仕事に使うだけじゃない|高校生の反抗期の息子への声かけを相談してみた話
ChatGPTは仕事に使うだけじゃない|大阪のマンションごみトラブルを理事会で相談した話
ChatGPTは仕事に使うだけじゃない|社内報の“ビックリマン風・ジブリ風”画像を作った話
ChatGPTは仕事に使うだけじゃない|ママ友ランチ角が立たず断れた話
ChatGPTは仕事に使うだけじゃない|会話ゼロ夫婦が再出発できた話
ChatGPTは仕事に使うだけじゃない|派遣切り50代女性の次の仕事を相談した話
ChatGPTは仕事に使うだけじゃない|これから役立つ資格をAIに本気で相談してみた話
ChatGPTは仕事に使うだけじゃない|親の介護が不安で今から準備を聞いた話
ChatGPTは仕事に使うだけじゃない|PTA役員を角が立たず断れた話
ChatGPTは仕事に使うだけじゃない|義母との距離感がしんどい悩みを整理してもらった話
ChatGPTは仕事に使うだけじゃない|家計が苦しい時に大阪市で使える制度を年齢別に聞いた話
ChatGPTは仕事に使うだけじゃない|子どものスマホルールを一緒に作ってみた話
ChatGPTは仕事に使うだけじゃない|推し活にお金を使いすぎる悩みを整理してもらった話
ChatGPTは仕事に使うだけじゃない|人間関係がしんどくて距離を置きたい時の相談実例
ChatGPTは仕事に使うだけじゃない|将来が不安で眠れない50歳手前女性の相談を整理してもらった話
Copilotでクロス表を縦持ちデータに変換|実務VBA作成の流れ
Copilotでクロス表を縦持ちデータに変換|実務仕上げ編
Copilotでクロス表を縦持ちデータに変換|配列で高速化する
Copilotでクロス表を縦持ちデータに変換|項目変更に強い構造へ
Copilotでリストボックスにユニーク値を設定|実務VBA
Copilotでリストボックス並び替え対応|実務VBA
Copilotでリストボックス表示制御を追加|実務VBA
Copilotで階層連動コンボボックス作成|実務VBA
Copilotで列番号を動的管理|階層連動VBAの実務改善
Copilotで並び順統一とUI改善|階層連動VBA仕上げ