VBA100本ノック 46本目:名前定義に使える文字
名前定義に使えない文字を変換して名前定義を設定する問題です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。
出題
1行目の見出しをそのセルの名前定義(ブック範囲)に設定してください。
・記号や空白は"_"に置換
・先頭使用不可文字の場合は先頭に"_"を補う
エラー回避できない場合はイミディエイトに出力
※見出しは重複しないように入力
※既存の名前定義は無視して良い
※シートは任意

取引先 (コード)
取引先(名称)
2020年:売上
<消費税%>
ABC123
⑳は20の丸付き
㉚は30の丸付き
𩹉と𩸽は魚です
下にデータ部をくっつけてしまったので分かりづらくしてしまいました。
1行目だけのデータで考えてください。
1行目のセル値を、1行目のそのセルの名前定義に設定するという事です。
手動で名前定義する時に自動変換されるものを自力実装するという事です。
完全に蛇足でした。

https://excel-ubara.com/vba100sample/VBA100_46.xlsm
https://excel-ubara.com/vba100sample/VBA100_46.zip
VBA作成タイム
この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。
他の人の回答および解説を見て、書いたVBAを見直してみましょう。
頂いた回答
解説
名前の先頭に使えない文字は、
・数字(全角も)
・Unicodeの一部(サロゲートペア以外にも使えないものがある)
先頭に使えない文字を限定するのは困難なので、エラーになったら先頭に"_"を付けています。
Option Explicit
Sub VBA100_46_02()
Dim ws As Worksheet: Set ws = ActiveSheet
Dim i As Long, maxCol As Long
With ws
maxCol = ws.Cells(1, .Columns.Count).End(xlToLeft).Column
.Rows(1).Insert
.Rows(1).Copy Destination:=Rows(1)
For i = 1 To maxCol
If .Cells(1, i) <> "" Then
.Range(ws.Cells(1, i), .Cells(2, i)).CreateNames Top:=True
End If
Next
.Rows(1).Delete
End With
End Sub
Sub VBA100_46_01()
Dim ws As Worksheet: Set ws = ActiveSheet
Dim i As Long, isErr As Boolean
For i = 1 To ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
If ws.Cells(1, i) <> "" Then
isErr = isErr Or addName(ws.Cells(1, i))
End If
Next
If isErr Then MsgBox "名前定義に登録できない名前がありました。"
End Sub
Function addName(ByVal aRng As Range) As Boolean
addName = False
On Error Resume Next
aRng.Name = createName(aRng)
If Err.Number = 0 Then Exit Function
Err.Clear
aRng.Name = "_" & createName(aRng)
If Err.Number = 0 Then Exit Function
Debug.Print aRng.Value & " → " & Err.Description
addName = True
End Function
Function createName(ByVal aStr As String) As String
Const cSymbol = " !""#$%&'()*+,-./:;<=>?@[\]^`{|}~"
aStr = WorksheetFunction.Clean(aStr)
Dim i As Long
For i = 1 To Len(aStr)
If InStr(cSymbol, Mid(aStr, i, 1)) > 0 Or _
InStr(StrConv(cSymbol, vbWide), Mid(aStr, i, 1)) > 0 Then
Mid(aStr, i, 1) = "_"
End If
Next
If IsNumeric(Left(aStr, 1)) Then aStr = "_" & aStr
createName = aStr
End Function
Clean関数で見えない文字を消しています。
今回の主題は、記号とは何か文字コードはどんなものがあるかという事になります。
名前定義を使ってこれらを認識してみましょうという問題でした。
記事補足にはエクセル機能の「選択範囲から作成」を使ったコードを掲載しました。
補足
| 文字コーザ | 文字 |
| 0 | Null |
| 1 | 制御文字 印字されない |
| 31 | |
| 32 | スペース |
| 33 | ! |
| 34 | " |
| 35 | # |
| 36 | $ |
| 37 | % |
| 38 | & |
| 39 | ' |
| 40 | ( |
| 41 | ) |
| 42 | * |
| 43 | + |
| 44 | , |
| 45 | - |
| 46 | . |
| 47 | / |
| 48 | 0~9 |
| 57 | |
| 58 | : |
| 59 | ; |
| 60 | < |
| 61 | = |
| 62 | > |
| 63 | ? |
| 64 | @ |
| 65 | A~Z |
| 90 | |
| 91 | [ |
| 92 | \ |
| 93 | ] |
| 94 | ^ |
| 95 | _ |
| 96 | ` |
| 97 | a~z |
| 122 | |
| 123 | { |
| 124 | | |
| 125 | } |
| 126 | ~ |
また、セルアドレスと同じ名前になってしまうものも名前定義に使えません。
別途判定しても良いのですが、先のVBAではどうせエラー判定が必要なので、そこで一緒にやれば良いという事にしました。

この機能は複数範囲を選択して、範囲内の上下左右のいずれかのセル値を名前定義にするものです。

Sub VBA100_46_02()
Dim ws As Worksheet
Set ws = ActiveSheet
With ws
.Rows(1).Insert
.Rows(2).Copy Destination:=Rows(1)
.Range("A1").CurrentRegion.Resize(2).CreateNames Top:=True,
Left:=False, Bottom:=False, Right:=False
.Rows(1).Delete
End With
End Sub
サイト内関連ページ
同じテーマ「VBA100本ノック」の記事
43本目:CSV出力
44本目:全テーブル一覧作成
45本目:テーブルに列追加
46本目:名前定義に使える文字
47本目:Window操作
48本目:配列と数値型
49本目:条件付き書式の判定
50本目:トリボナッチ数列
51本目:シート一覧と印刷ページ数
52本目:複数シートの一括印刷
53本目:テーブルの扱いと年齢計算
新着記事NEW ・・・新着記事一覧を見る
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA入門編
- VBA100本ノック
- 46本目:名前定義に使える文字
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
