生成AI活用研究
Geminiと100本ノック 24本目:全角英数のみ半角

Geminiを中心に生成AIの活用と研究の記録
公開日:2025-05-26 最終更新日:2025-05-26

Geminiと100本ノック 24本目:全角英数のみ半角


AIのGeminiがVBA100本ノックに挑戦!


Googleが開発した生成AIモデルのGeminiにVBA100本ノックをやってもらいました。
AIがVBAをどこまで扱えるかの実証実験の24本目です。

2025年3月からGemsが無料で使えるようになりました。
そこで、独自に作成したGem(名前は「AI神髄VBA」改良を続けている)を使った回答も掲載しています。


VBA100本ノックの出題と解答

VBA100本ノック 24本目:全角英数のみ半角
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ


Geminiへの出題とGeminiの回答

当初はGeminiの回答は、キャプチャ画像とそのテキストにしていましたが今回からはテキストのみにします。
Geminiの回答であるというエビデンスの意味でキャプチャを掲載していましたが、さすがにもう必要ないと思うので。

Geminiの回答 Geminiへの出題
VBA問題
引数で受け取った文字列に対して、以下の処理を行い文字列で返す関数(Function)を作成してください。
・英小文字は英大文字にする
・全角の英数文字は半角にする
VBA実践講座
※英数文字とは:A-Z,a-z,0-9
"あいうABCアイウabc123"

"あいうABCアイウABC123"
承知いたしました。引数で受け取った文字列に対し、英小文字を英大文字に変換し、全角の英数字を半角に変換するVBA関数を作成します。

以下にFunctionのコードを提示します。

VBA
Function ConvertString(ByVal originalString As String) As String
  Dim tempString As String
  
  ' 全角英数字を半角に変換
  ' vbWide: 全角文字を半角文字に変換
  ' vbNarrow: 半角文字を全角文字に変換 (今回の目的とは逆)
  ' vbKatakana: ひらがなをカタカナに変換
  ' vbHiragana: カタカナをひらがなに変換
  ' vbProperCase: 先頭の文字だけを大文字にする
  ' vbUpperCase: すべての英字を大文字に変換
  ' vbLowerCase: すべての英字を小文字に変換
  
  ' 最初に全角英数字を半角に変換
  ' StrConv関数でvbNarrowを指定すると、全角英数字が半角になります。
  tempString = StrConv(originalString, vbNarrow)
  
  ' 次に英小文字を英大文字に変換
  ' UCase関数で文字列をすべて大文字に変換します。
  ConvertString = UCase(tempString)
End Function

' 使用例 (標準モジュールに記述)
' Sub TestConvertString()
'   Dim testStr As String
'   testStr = "あいうABCアイウabc123"
'   Debug.Print ConvertString(testStr) ' 結果: あいうABCアイウABC123
' End Sub

解説:
  1. Function ConvertString(ByVal originalString As String) As String
    • ConvertString という名前の関数を定義しています。
    • ByVal originalString As String で、originalString という名前の文字列型の引数を受け取ります。ByVal は、元の変数を変更しないことを意味します。
    • As String は、この関数が文字列型の値を返すことを示しています。
  2. Dim tempString As String
    • 処理途中の文字列を保持するための一時的な変数 tempString を宣言しています。
  3. tempString = StrConv(originalString, vbNarrow)
    • StrConv 関数は、文字列の形式を変換するためのVBA関数です。
    • 第一引数に変換したい文字列 (originalString) を指定します。
    • 第二引数に変換の種類を指定します。ここでは vbNarrow を使用しています。
      vbNarrow: 全角文字(ここでは全角英数字)を半角に変換します。この処理が先に行われることで、続くUCase関数が正しく半角の英字に対して作用します。
  4. ConvertString = UCase(tempString)
    • UCase 関数は、引数で与えられた文字列のすべての英字を大文字に変換します。
    • StrConv で半角に変換された tempString に対して UCase を適用することで、英小文字が英大文字に変換されます。
    • この結果を関数の名前 (ConvertString) に代入することで、この値が関数の戻り値となります。
この関数をVBAの標準モジュールに記述し、必要に応じて呼び出してください。

コメントにStrConvの引数の説明を入れているところは好感が持てます。
ただし、ちょっと不具合が・・・
問題が不親切でしたね。VBA100本ノックでもこのような回答は結構ありましたから。

Geminiの回答 Geminiへの出題
カタカナが半角になってしまいます。
ご指摘ありがとうございます。確かに、StrConv関数でvbNarrowを使うと、全角カタカナも半角カタカナに変換されてしまいますね。私の説明が不十分でした。申し訳ありません。

全角の英数字のみを半角にし、かつ英小文字を英大文字にする関数を改めて作成します。カタカナは全角のままにするように修正します。

文字列を1文字ずつチェックし、英数字かどうかの判断を行うことで、この問題を解決できます。

VBA
Function ConvertStringCorrected(ByVal originalString As String) As String
  Dim i As Long
  Dim char As String
  Dim tempString As String
  
  tempString = "" ' 結果を格納する文字列を初期化
  
  ' 文字列を1文字ずつ処理
  For i = 1 To Len(originalString)
    char = Mid(originalString, i, 1) ' 1文字ずつ取り出す
    
    ' 全角英数字 (A-Z, a-z, 0-9) かどうかを判定
    ' ChrW関数とAscW関数を使ってUnicodeコードポイントで比較します。
    If (AscW(char) >= AscW("A") And AscW(char) <= AscW("Z")) Or _
      (AscW(char) >= AscW("a") And AscW(char) <= AscW("z")) Or _
      (AscW(char) >= AscW("0") And AscW(char) <= AscW("9")) Then
      ' 全角英数字であれば半角に変換
      tempString = tempString & StrConv(char, vbNarrow)
    Else
      ' それ以外の文字(ひらがな、カタカナ、漢字など)はそのまま追加
      tempString = tempString & char
    End If
  Next i
  
  ' 最後に英小文字を英大文字に変換
  ' UCase関数は半角・全角問わず英字を大文字にしますが、
  ' ここでは既に全角英数字は半角に変換されているので、
  ' 半角の英字に対して大文字化が行われます。
  ConvertStringCorrected = UCase(tempString)
End Function

' 使用例 (標準モジュールに記述)
' Sub TestConvertStringCorrected()
'   Dim testStr As String
'  
'   ' テストケース1: 全角カタカナが含まれる場合
'   testStr = "あいうABCアイウabc123カナカな"
'   Debug.Print ConvertStringCorrected(testStr) ' 期待する結果: あいうABCアイウABC123カナカな
'  
'   ' テストケース2: 全角英数字と半角英数字、カタカナ、ひらがなの組み合わせ
'   testStr = "Hello, WORLD!こんにちは、テストです。"
'   Debug.Print ConvertStringCorrected(testStr) ' 期待する結果: HELLO, WORLD!こんにちは、テストです。
' End Sub

変更点と解説:
  1. 文字ごとの判定ロジックの導入:
    • For i = 1 To Len(originalString) ループで、入力文字列を1文字ずつ取り出します。
    • If (AscW(char) >= AscW("A") And AscW(char) <= AscW("Z")) Or ... Then の部分で、現在の文字 (char) が全角の英数字 (A-Z, a-z, 0-9) のいずれかであるかをUnicodeコードポイントを使って厳密に判定しています。
      • AscW() は文字のUnicodeコードポイントを返します。
      • これにより、全角カタカナや他の全角文字と、全角英数字を区別できます。
  2. StrConv(char, vbNarrow) の適用範囲:
    • 上記の条件に合致する「全角英数字」の場合のみ、StrConv(char, vbNarrow) を使って半角に変換しています。
    • 全角英数字ではない文字(全角カタカナ、ひらがな、漢字、記号など)は、ElseブロックでtempString = tempString & char として、そのまま結果文字列に追加されます。
  3. UCase(tempString) の適用:
    • 全ての文字に対する処理が終わった後、UCase(tempString) を最後に適用することで、最終的に残った半角英小文字がすべて大文字に変換されます。全角英字は、途中で半角に変換されているため、この段階では半角英字に対してUCaseが適用されます。
この修正により、「英小文字は英大文字にする」「全角の英数文字は半角にする」という要件を満たしつつ、全角カタカナが半角になる問題を解消できるはずです。

良いですね。


AI神髄VBAへの出題とAI神髄VBAの回答

AI神髄VBAとは、GeminiのGems機能を使って作ったVBAに特化したカスタムAIです。
AI神髄VBAの回答 AI神髄VBAへの出題
VBA問題
引数で受け取った文字列に対して、以下の処理を行い文字列で返す関数(Function)を作成してください。
・英小文字は英大文字にする
・全角の英数文字は半角にする
VBA実践講座
※英数文字とは:A-Z,a-z,0-9
"あいうABCアイウabc123"

"あいうABCアイウABC123"
はい、承知いたしました。
引数で受け取った文字列に対し、英小文字の英大文字化と全角英数字の半角化を行うFunctionプロシージャを作成します。

VBAコード
Function ConvertString(ByVal originalString As String) As String
  ' 概要:
  ' 引数で受け取った文字列に対して、以下の処理を行い文字列で返す。
  ' ・英小文字は英大文字にする
  ' ・全角の英数文字は半角にする
  ' 引数:
  '  originalString: 変換対象の文字列
  ' 戻り値:
  '  変換後の文字列

  Dim tempString As String

  ' 英小文字を英大文字に変換
  tempString = UCase$(originalString)

  ' 全角英数文字を半角に変換
  tempString = StrConv(tempString, vbNarrow)

  ' 変換後の文字列を戻り値として返す
  ConvertString = tempString

End Function

VBAコードの解説
Function ConvertString
  • 概要: この関数は、入力された文字列に対して以下の2つの変換を行います。
    1. 英小文字を英大文字に変換します。
    2. 全角の英数字(A-Z, a-z, 0-9)を半角に変換します。
  • 引数:
    • originalString As String: 変換処理の対象となる元の文字列を受け取ります。ByVal で渡すことで、関数内で引数の値が変更されても呼び出し元の変数には影響を与えません。
  • 戻り値:
    • As String: 変換が完了した文字列を返します。

コードの詳細
  1. Dim tempString As String:
    • 変換処理の中間結果を保持するための一時的な文字列変数を宣言しています。
  2. tempString = UCase$(originalString):
    • UCase$ 関数は、引数として渡された文字列に含まれるすべての英小文字を英大文字に変換します。
    • この時点では、全角英字はまだ全角のままです。
  3. tempString = StrConv(tempString, vbNarrow):
    • StrConv 関数は、文字列の文字種を変換するために使用されます。
    • 第一引数に変換対象の文字列 (tempString) を指定します。
    • 第二引数 vbNarrow は、全角文字を半角文字に変換するための定数です。これには全角英数字だけでなく、全角カナなども半角に変換されますが、今回の要件(全角の英数文字を半角にする)を満たし、かつ最も簡潔な方法です。
  4. ConvertString = tempString:
    • 最終的に変換された tempString の値を関数の戻り値として設定しています。
この関数は、VBAの組み込み関数である UCase$ と StrConv を利用することで、ループ処理を記述することなく、短く簡潔かつ高速に文字列の変換を行うことができます。

UCase$」なんと$付きの関数ですか・・・
文字列型 (String) の値を返します。
ドル記号を付けない関数とは戻り値のデータ型の違いです。
ただし、デフォルト同様にちょっと不具合が・・・

AI神髄VBAの回答 AI神髄VBAへの出題
カタカナが半角になってしまいます。
ご指摘ありがとうございます。
申し訳ございません。StrConv関数のvbNarrowは全角カタカナも半角に変換してしまいます。
ご要望の「全角の英数文字は半角にする」に限定するには、文字を一つずつチェックする必要があります。

修正したVBAコードを以下に示します。

VBAコード
Function ConvertString(ByVal originalString As String) As String
  ' 概要:
  ' 引数で受け取った文字列に対して、以下の処理を行い文字列で返す。
  ' ・英小文字は英大文字にする
  ' ・全角の英数文字は半角にする
  ' 引数:
  '  originalString: 変換対象の文字列
  ' 戻り値:
  '  変換後の文字列

  Dim i As Long
  Dim charCode As Integer
  Dim convertedString As String
  Dim tempChar As String

  ' 変換後の文字列を格納する変数を初期化
  convertedString = ""

  ' 文字列を1文字ずつ処理
  For i = 1 To Len(originalString)
    tempChar = Mid$(originalString, i, 1)
    charCode = AscW(tempChar) ' Unicodeコードを取得 (全角文字も正確に判定するため)

    ' 英小文字を英大文字に変換
    If charCode >= AscW("a") And charCode <= AscW("z") Then
      tempChar = UCase$(tempChar)
    End If

    ' 全角英数文字を半角に変換
    ' 全角の英字(A-Z, a-z)
    If (charCode >= &HFF21 And charCode <= &HFF3A) Or _
      (charCode >= &HFF41 And charCode <= &HFF5A) Then
      tempChar = ChrW(charCode - &Hfee0) ' 半角文字に変換
    ' 全角数字(0-9)
    ElseIf (charCode >= &HFF10 And charCode <= &HFF19) Then
      tempChar = ChrW(charCode - &Hfee0) ' 半角数字に変換
    End If

    convertedString = convertedString & tempChar
  Next i

  ' 変換後の文字列を戻り値として返す
  ConvertString = convertedString

End Function

VBAコードの解説(修正版)
Function ConvertString
  • 概要: この関数は、入力された文字列に対して以下の2つの変換を行います。
    1. 英小文字を英大文字に変換します。
    2. 全角の英数字(A-Z, a-z, 0-9)のみを半角に変換します。カタカナは変換されません。
  • 引数:
    • originalString As String: 変換処理の対象となる元の文字列を受け取ります。
  • 戻り値:
    • As String: 変換が完了した文字列を返します。
コードの詳細
  1. 変数宣言:
    • i As Long: 文字列をループ処理するためのカウンタ変数。
    • charCode As Integer: 各文字のUnicodeコードポイントを格納する変数。AscW関数を使用するため、Integer型で十分です。
    • convertedString As String: 変換後の文字列を構築していくための変数。
    • tempChar As String: ループ内で現在処理している1文字を一時的に格納する変数。
  2. convertedString = "":
    • convertedString変数を空文字列で初期化します。これにより、ループ内で文字を連結していくことができます。
  3. For i = 1 To Len(originalString):
    • For...Nextループを使用して、originalStringの各文字を1文字ずつ処理します。Len(originalString)で文字列の長さを取得し、1文字目から最後までループします。
  4. tempChar = Mid$(originalString, i, 1):
    • Mid$関数を使って、originalStringのi番目の文字を1文字だけ取り出し、tempCharに格納します。
  5. charCode = AscW(tempChar):
    • AscW関数は、指定された文字のUnicodeコードポイント(数値)を返します。これにより、全角文字の判定を正確に行うことができます。
  6. 英小文字を英大文字に変換:
    • If charCode >= AscW("a") And charCode <= AscW("z") Then: tempCharが英小文字であるかどうかをUnicodeコードポイントで判定します。
    • tempChar = UCase$(tempChar): 条件が真の場合、UCase$関数を使用してtempCharを英大文字に変換します。
  7. 全角英数文字を半角に変換:
    • 全角英字の判定と変換:
      • If (charCode >= &HFF21 And charCode <= &HFF3A) Or _ (charCode >= &HFF41 And charCode <= &HFF5A) Then:
        • &HFF21から&HFF3Aは全角大文字AからZのUnicodeコードポイントの範囲です。
        • &HFF41から&HFF5Aは全角小文字aからzのUnicodeコードポイントの範囲です。
        • これらの範囲に文字のコードが含まれる場合、その文字は全角英字と判定されます。
      • tempChar = ChrW(charCode - &Hfee0): 全角英数字のUnicodeコードポイントは、対応する半角英数字のコードポイントより&Hfee0(16進数表記の65248)だけ大きくなっています。そのため、&Hfee0を引くことで半角文字に変換し、ChrW関数で文字に戻します。
    • 全角数字の判定と変換:
      • ElseIf (charCode >= &HFF10 And charCode <= &HFF19) Then:
        • &HFF10から&HFF19は全角数字0から9のUnicodeコードポイントの範囲です。
      • tempChar = ChrW(charCode - &Hfee0): 全角英字と同様に、&Hfee0を引いて半角数字に変換します。
  8. convertedString = convertedString & tempChar:
    • 変換処理を終えたtempCharを、convertedStringの末尾に連結します。これをループのたびに繰り返すことで、最終的な変換済み文字列が構築されます。
  9. ConvertString = convertedString:
    • ループが完了し、すべての文字の処理が終わった後、構築されたconvertedStringを関数の戻り値として返します。
この修正により、全角カタカナが半角に変換されることなく、ご要望通りの処理が実現されます。

問題なさそうです。




同じテーマ「生成AI活用研究」の記事

Geminiと100本ノック 14本目:社外秘シート削除
Geminiと100本ノック 15本目:シートの並べ替え
Geminiと100本ノック 16本目:無駄な改行を削除
Geminiと100本ノック 17本目:重複削除(ユニーク化)
Geminiと100本ノック 18本目:名前定義の削除
Geminiと100本ノック 19本目:図形のコピー
Geminiと100本ノック 20本目:ブックのバックアップ
Geminiと100本ノック 21本目:バックアップファイルの削除
Geminiと100本ノック 22本目:FizzBuzz発展問題
Geminiと100本ノック 23本目:シート構成の一致確認
Geminiと100本ノック 24本目:全角英数のみ半角


新着記事NEW ・・・新着記事一覧を見る

AI時代の「Hello World」のすすめ:すべてはこの一歩から|生成AI活用研究(2025-05-27)
AI時代におけるITエンジニアの資質|生成AI活用研究(2025-05-26)
Geminiと100本ノック 24本目:全角英数のみ半角|生成AI活用研究(5月26日)
付録:AI×VBA実践リソース集|生成AI活用研究(2025-05-25)
おわりに:AI×VBAはあなたの未来を変える強力な武器|生成AI活用研究(2025-05-25)
第7章:さらなる高みへ!AI×VBA応用テクニックと未来への備え|生成AI活用研究(2025-05-24)
第6章:AIとVBAを学び続ける!あなたの「超効率化」を止めないヒント|生成AI活用研究(2025-05-22)
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-21)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ