生成AI活用研究
Geminiと100本ノック 13本目:文字列の部分フォント

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

Geminiと100本ノック 13本目:文字列の部分フォント


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


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

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


VBA100本ノックの出題と解答

VBA100本ノック 13本目:文字列の部分フォント
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ


Geminiへの出題とGeminiの回答

Geminiの回答 Geminiへの出題
VBA マクロ Gemini 100本ノック AI神髄VBA

VBA問題
選択セル(Selection:複数範囲あり)の文字列に「注意」という文字があった場合は、その「注意」の文字だけを"赤の太字"に設定してください。
セル以外(図形等)が選択されている場合は何もせずに正常終了するようにしてください。
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA

はい、承知いたしました。選択セルに「注意」という文字が含まれている場合に、その「注意」の部分だけを赤の太字にするVBAコードを記述します。選択されているのがセル以外の場合は何も処理を行いません。

VBA
Sub HighlightChui()

 ' 選択されているオブジェクトがセル(Range)であるか確認
 If TypeName(Selection) = "Range" Then

  Dim r As Range
  Dim findText As String
  Dim foundPos As Long
  Dim textLength As Long

  findText = "注意"

  ' 選択範囲の各セルをループ
  For Each r In Selection

   ' セルに値が入っているか確認
   If r.Value <> "" Then

    ' セル内の文字列から「注意」を検索
    foundPos = InStr(r.Value, findText)

    ' 「注意」が見つかった場合
    If foundPos > 0 Then

     ' 「注意」の文字数
     textLength = Len(findText)

     ' 見つかった「注意」の文字だけを赤色、太字に設定
     ' Characters(開始位置, 文字数) で対象の文字列を指定
     With r.Characters(Start:=foundPos, Length:=textLength).Font
      .Bold = True
      .Color = RGB(255, 0, 0) ' 赤色
     End With

    End If

   End If

  Next r

 End If

 ' 選択がセル以外の場合は何もせずプロシージャ終了

End Sub

コードの説明:
  1. TypeName(Selection) = "Range" で、現在選択されているものがセル範囲(Rangeオブジェクト)であるかを確認します。セル範囲以外(図形など)が選択されている場合は、この条件が偽となり、Ifブロック内の処理はスキップされ、プロシージャが終了します。
  2. 選択がセル範囲の場合、For Each r In Selection で選択されている各セルを順番に処理します。
  3. If r.Value <> "" で、セルが空白でないかを確認します。
  4. InStr(r.Value, findText) で、セルの値の中に文字列 "注意" が含まれているかを探し、見つかった場合はその開始位置 (foundPos) を取得します。見つからなかった場合は 0 が返されます。
  5. If foundPos > 0 Then で、「注意」が見つかった場合の処理を行います。
  6. textLength = Len(findText) で、「注意」という文字列の長さを取得します。
  7. r.Characters(Start:=foundPos, Length:=textLength) で、セルの文字列の中から「注意」の部分を指定します。
  8. .Font プロパティを使って、指定した部分のフォント設定を変更します。
  9. .Bold = True で太字に設定します。
  10. .Color = RGB(255, 0, 0) で色を赤色に設定します。RGB(255, 0, 0) は赤色のRBG値です。
このコードをVBAエディタに貼り付けて実行することで、選択したセル範囲に含まれる「注意」という文字列だけが赤色の太字になります。セル以外のオブジェクトを選択している場合は、何も変化はありません。

この実行結果は・・・
サンプルの先頭セルには複数の「注意」がありますが、これが最初の「注意」しか赤くなりません。
この問題の出題時に、VBA作成で見落とす人が多いだろうなとデータを入れたものです。
人間の間違えやすい見落としやすい分部と同じ過ちをおかすとは、なんとも人間っぽい感じで親しみを覚えます(笑)


Geminiへの改善提案とGeminiの回答

Geminiの回答 Geminiへの改善提案
VBA マクロ Gemini 100本ノック AI神髄VBA

1セルに複数の「注意」がある場合、先頭しか赤くならない。
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA

はい、1つのセル内に複数の「注意」がある場合に、全てを赤の太字にするようにコードを修正します。

前回のコードでは InStr で最初に見つかった位置しか取得していなかったため、一度の検索で終了していました。今回は Do While ループを使って、「注意」が見つかるたびにその次の位置から再度検索を行うようにします。

VBA
Sub HighlightAllChui()

 ' 選択されているオブジェクトがセル(Range)であるか確認
 If TypeName(Selection) = "Range" Then

  Dim r As Range
  Dim findText As String
  Dim foundPos As Long
  Dim textLength As Long
  Dim startSearchPos As Long

  findText = "注意"
  textLength = Len(findText)

  ' 選択範囲の各セルをループ
  For Each r In Selection

   ' セルに値が入っているか確認
   If r.Value <> "" Then

    startSearchPos = 1 ' 検索開始位置をセルの先頭に初期化

    ' セル内の文字列から「注意」を繰り返し検索
    ' 見つからなくなるまでループ
    Do While InStr(startSearchPos, r.Value, findText) > 0

     ' 見つかった「注意」の開始位置を取得
     foundPos = InStr(startSearchPos, r.Value, findText)

     ' 見つかった「注意」の文字だけを赤色、太字に設定
     ' Characters(開始位置, 文字数) で対象の文字列を指定
     With r.Characters(Start:=foundPos, Length:=textLength).Font
      .Bold = True
      .Color = RGB(255, 0, 0) ' 赤色
     End With

     ' 次の検索開始位置を、現在見つかった「注意」の直後に設定
     startSearchPos = foundPos + textLength

    Loop ' 「注意」が見つからなくなるまでループを続ける

   End If

  Next r

 End If

 ' 選択がセル以外の場合は何もせずプロシージャ終了

End Sub

修正点のポイント:
  • startSearchPos という変数を追加しました。これは、セル内で「注意」を探し始める位置を記録します。最初は 1 (セルの先頭) から始めます。
  • Do While InStr(startSearchPos, r.Value, findText) > 0 というループを使います。これは、startSearchPos の位置から検索を開始して「注意」が見つかる限り(InStr の結果が 0 より大きい限り)ループを続けます。
  • ループの中で foundPos = InStr(startSearchPos, r.Value, findText) で現在見つかった「注意」の正確な位置を取得します。
  • 文字の装飾を行った後、startSearchPos = foundPos + textLength とすることで、次の検索を現在見つかった「注意」のすぐ後ろから開始するように更新します。これにより、同じ「注意」を繰り返し見つけることを防ぎ、セル内の全ての「注意」を見つけることができます。
この修正されたコードで、1つのセル内に複数の「注意」があっても、全てが赤色の太字で表示されるようになります。

意味をしっかり理解して、きちんと対応してきました。


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

AI神髄VBAとは、GeminiのGems機能を使って作ったVBAに特化したカスタムAIです。
前回の10本目で使用したGemを今回は少し改良しました。
AI神髄VBAの回答 AI神髄VBAへの出題
VBA マクロ Gemini 100本ノック AI神髄VBA

VBA問題
選択セル(Selection:複数範囲あり)の文字列に「注意」という文字があった場合は、その「注意」の文字だけを"赤の太字"に設定してください。
セル以外(図形等)が選択されている場合は何もせずに正常終了するようにしてください。
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA
VBA マクロ Gemini 100本ノック AI神髄VBA

はい、承知いたしました。「AI神髄VBA改」として、ご要望に沿ったVBAコードを作成し、解説を記述します。

指定された複数の範囲を含む選択セルの中から、「注意」という文字列を探し、その部分だけを赤色の太字に設定するVBAコードです。セル以外のオブジェクトが選択されている場合は何も処理せずに終了します。

VBA
Sub HighlightAttentionInSelection()
  ' 概要: 選択セル内の「注意」という文字を赤の太字に設定する

  ' 選択されているオブジェクトがRange型でない場合はここで処理を終了(アーリーリターン)
  If TypeName(Selection) <> "Range" Then
    Exit Sub
  End If

  ' 処理を高速化するための設定(必要に応じてコメントアウトを外してください)
  'Application.ScreenUpdating = False  ' 画面描画を停止
  'Application.Calculation = xlCalculationManual ' 自動計算を停止
  'Application.EnableEvents = False   ' イベントを停止

  Dim targetRange As Range
  Dim cell As Range
  Dim findText As String
  Dim foundPos As Long

  ' 検索対象の文字列を設定
  findText = "注意"

  ' 選択範囲全体を対象とする
  Set targetRange = Selection

  ' 選択範囲が複数のエリアに分かれている場合でも対応するため、Areasコレクションをループ
  Dim area As Range
  For Each area In targetRange.Areas

    ' 各エリア内のセルをループ処理
    For Each cell In area.Cells

      ' セルが空でなく、かつ文字列型の場合のみ処理
      If Not IsEmpty(cell.Value) And VarType(cell.Value) = vbString Then

        ' セル内の文字列から検索文字列の位置を取得
        ' 最初の検索は文字列の先頭から開始
        foundPos = InStr(cell.Value, findText)

        ' 検索文字列が見つかった場合、全てに書式設定を適用
        Do While foundPos > 0
          ' Charactersオブジェクトを使用して、検索文字列の部分に書式設定を適用
          With cell.Characters(Start:=foundPos, Length:=Len(findText)).Font
            .Color = vbRed  ' フォントの色を赤に設定
            .Bold = True   ' フォントを太字に設定
          End With

          ' 次の検索文字列を見つけるために、今回の発見位置の次から検索を再開
          foundPos = InStr(foundPos + 1, cell.Value, findText)
        Loop
      End If
    Next cell
  Next area

'  エラー発生時のジャンプ先ラベル(エラー処理が必要な場合に追加)
'  On Error GoTo CleanExit

'CleanExit:
  ' 高速化のために変更した設定を元に戻す(処理が終わったら必ず元に戻す)
'  Application.ScreenUpdating = True
'  Application.Calculation = xlCalculationAutomatic ' または xlCalculationAutomatic
'  Application.EnableEvents = True

End Sub

VBAコードの解説
  1. Sub HighlightAttentionInSelection():
    • このプロシージャの開始を示します。HighlightAttentionInSelection はプロシージャの名前です。
  2. ' 概要: 選択セル内の「注意」という文字を赤の太字に設定する:
    • プロシージャの簡単な説明をコメントとして記述しています。
  3. If TypeName(Selection) <> "Range" Then Exit Sub:
    • 現在選択されているオブジェクトの種類を TypeName 関数で判定します。
    • もし選択されているのが Range オブジェクト(セル範囲)でない場合(図形やグラフなどが選択されている場合)、Exit Sub でプロシージャを即座に終了します。これにより、セル以外の選択に対するエラーを防ぎ、無駄な処理を行いません(アーリーリターン)。
  4. ' 処理を高速化するための設定...:
    • 画面描画、自動計算、イベントを一時的に停止することで、処理速度を向上させることが期待できます。大量のセルを処理する場合に特に有効です。処理の最後に必ず元に戻す必要があります。今回はコメントアウトしていますので、必要に応じて #If ディレクティブなどで制御するか、手動でコメントアウトを外してください。
  5. Dim targetRange As Range, cell As Range, area As Range:
    • 処理対象となる選択範囲全体 (targetRange)、ループで取り出す個々のセル (cell)、および複数範囲選択時の各範囲 (area) を格納するための変数を宣言しています。
    • findText は検索する文字列「注意」を、foundPos は検索文字列が見つかった位置(開始文字目のインデックス)を格納する変数です。
  6. findText = "注意":
    • 検索対象の文字列を変数に設定します。
  7. Set targetRange = Selection:
    • 現在選択されているオブジェクトを targetRange 変数にセットします。TypeName でRange型であることは確認済みです。
  8. For Each area In targetRange.Areas ... Next area:
    • Selection が単一のセル範囲だけでなく、複数の離れた範囲を選択している場合があります。Areas コレクションは、そのように選択された個々の連続したセル範囲の集まりです。このループによって、選択されている全てのエリアに対して処理を行います。
  9. For Each cell In area.Cells ... Next cell:
    • Areas コレクションで取得した各エリア (area) 内の全てのセル (Cells) を順番にループ処理します。For Each を使うことで、より直感的かつ簡潔に記述できます。
  10. If Not IsEmpty(cell.Value) And VarType(cell.Value) = vbString Then ... End If:
    • 処理対象のセルが空でないこと、かつその値が文字列型であることを確認します。これにより、数値やエラー値などに対して InStr 関数を使う際のエラーを防ぎます。
  11. foundPos = InStr(cell.Value, findText):
    • InStr 関数を使って、セルの値 (cell.Value) の中に findText("注意")が含まれているかどうかを検索します。
    • 見つかった場合は、その文字列の開始位置(1から始まるインデックス)を foundPos に格納します。見つからなかった場合は 0 が返されます。
  12. Do While foundPos > 0 ... Loop:
    • foundPos が 0 より大きい間(つまり、「注意」が見つかっている間)このループを繰り返します。これにより、1つのセル内に「注意」が複数回出現する場合でも、全てに書式設定を適用できます。
  13. With cell.Characters(Start:=foundPos, Length:=Len(findText)).Font ... End With:
    • Characters オブジェクトは、セル内の文字列の一部を指定して書式を設定するために使用します。
      • Start:=foundPos: 書式設定を開始する文字位置を指定します。
      • Length:=Len(findText): 書式設定を適用する文字数(ここでは"注意"の文字数)を指定します。
    • .Font プロパティで、その部分のフォントの設定を変更します。
      • .Color = vbRed: フォントの色を赤色(VBAの組み込み定数)に設定します。
      • Bold = True: フォントを太字に設定します。
  14. foundPos = InStr(foundPos + 1, cell.Value, findText):
    • 次の「注意」を検索するために、再度 InStr 関数を使用します。
    • 今回の foundPos + 1 から検索を開始することで、直前に見つけた「注意」の次から検索を行います。これにより、同じ「注意」を繰り返し見つけることを防ぎます。
  15. ' エラー発生時のジャンプ先ラベル...:
    • エラー処理を追加する場合に記述します。今回は指示に含まれていないため、コメントアウトしています。
  16. ' 高速化のために変更した設定を元に戻す...:
    • プロシージャの終了前に、高速化のために変更した設定(画面描画、計算、イベント)を元の状態に戻す必要があります。エラー発生時にも確実に実行されるように、On Error GoTo と組み合わせて使用することが多いです。今回はコメントアウトしています。
このコードは、選択範囲が単一か複数かに関わらず、「注意」という文字列が完全に一致する部分だけを効率的に検索し、指定された書式を適用します。For Each ループと InStr 関数の組み合わせにより、簡潔かつパフォーマンスに配慮した実装となっています。

今回の場合はAreasを使った2重ループにしなくても良さそうですが、、、
でもきっちり記述しているので文句をつけるところはないですね。
いやー、これを一発で回答するとは、すごすぎませんか。




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

Geminiと100本ノック 10本目:行の削除
Geminiと100本ノック 11本目:セル結合の警告
Geminiと100本ノック 12本目:セル結合の解除
Geminiと100本ノック 13本目:文字列の部分フォント
Geminiと100本ノック 14本目:社外秘シート削除
Geminiと100本ノック 15本目:シートの並べ替え
Geminiと100本ノック 16本目:無駄な改行を削除
Geminiと100本ノック 17本目:重複削除(ユニーク化)
Geminiと100本ノック 18本目:名前定義の削除
Geminiと100本ノック 19本目:図形のコピー
Geminiと100本ノック 18本目:名前定義の削除


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

第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)


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

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」をお願いいたします。
本文下部へ