ツイッター出題回答
greeenはgreenに、greeeeeNをGReeeeNに変換

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2020-09-13 最終更新日:2020-10-20

greeenはgreenに、greeeeeNをGReeeeNに変換


ツイッターで出したエクセルの入力規則のお題です。


「greeenはgreenに、greeeeeNやGReeeeeenはGReeeeNに直す」
文字列操作のVBA問題です。

問題を出したツイート

【VBA問題】
greenは緑です。GReeeeNは音楽グループです。
「greeenはgreenに、greeeeeNやGReeeeeenはGReeeeNに直す」
引数の文字列を直して返す関数を作りましょう。
3連続eは2つに、5連続以上のeは4つに。
上記文字列なら以下を返す。
「greenはgreenに、GReeeeNやGReeeeNはGReeeeNに直す」


補足します。
Debug.Print 関数("greeenはgreenに、greeeeeNやGReeeeeenはGReeeeNに直す")

'"greenはgreenに、GReeeeNやGReeeeNはGReeeeNに直す"
このような関数を作成するという事です。


VBA マクロ 文字列操作
https://twitter.com/yamaoka_ss/status/1304650741550690309


VBA マクロ 文字列操作
https://twitter.com/yamaoka_ss/status/1304681634545807361


お寄せいただいた回答ツイート

以下のモーメントにまとめました。

VBA マクロ 文字列操作
https://twitter.com/i/events/1304779848389332992

用意した解答

頂いた回答を大別すると以下の3通りに分かれます。
・正規表現を使う
・ループして文字列を見つけて置換する
・文字列長-3の"e"を最大として置換しまくる

最初の2通りについては、問題を出した直後に私の方で作成しておいたものです。
最後の方法は事前には私は考えなかったものでしたので、後で追加しました。

正規表現を使う

Sub sample()
  Debug.Print fncGreen("greeenはgreenに、greeeeeNやGReeeeeenはGReeeeNに直す")
  Debug.Print fncGreen("grEEn、GreeeN、grEEEEn、greeeeeN、GReeeeeen、GREEEEEEEN")
End Sub

Function fncGreen(ByVal argStr As String) As String
  fncGreen = argStr
  
  Dim reg As Object
  Set reg = CreateObject("VBScript.RegExp")
  reg.Global = True '文字列全体
  reg.IgnoreCase = True '大文字小文字を区別しない
  
  'gre(4以上)nをGReeeeN
  reg.Pattern = "(gre{4,}n)"
  fncGreen = reg.Replace(argStr, "GReeeeN")
  
  'gre(2,3)nをgreen
  reg.Pattern = "(gre{2,3}n)"
  fncGreen = reg.Replace(fncGreen, "green")
End Function

正規表現については以下を参照してください。
VBAで正規表現を利用する(RegExp)
正規表現は複雑なパターンマッチングとテキストの検索置換するためのツールです、マクロVBAで正規表現を使う場合はRegExpオブジェクトを使用します、RegExpは、VBScriptに正規表現として用意されているオブジェクトです。VBScript廃止に向けて、VBAプロジェクトを対応させる方法 Prepareyour…

ループして文字列を見つけて置換する

Sub sample()
  Debug.Print fncGreen("Greeenはgreenに、greeeeeNやGReeeeeenはGReeeeNに直す")
  Debug.Print fncGreen("grEEn、GreeeN、grEEEEn、greeeeeN、GReeeeeen、GREEEEEEEN")
End Sub

Function fncGreen(ByVal argStr As String) As String
  fncGreen = argStr
  Dim pos As Long
  Do
    pos = InStr(1, fncGreen, String(5, "e"), vbTextCompare)
    If pos >= 3 Then
      If LCase(Mid(fncGreen, pos - 2, 2)) = "gr" Then
        fncGreen = Replace(fncGreen, "gr" & getGreen(fncGreen, pos), "GReeeeN", 1, -1, vbTextCompare)
      End If
    End If
  Loop While pos <> 0
  
  fncGreen = Replace(fncGreen, "greeeen", "GReeeeN", 1, -1, vbTextCompare)
  fncGreen = Replace(fncGreen, "greeen", "green", 1, -1, vbTextCompare)
  fncGreen = Replace(fncGreen, "green", "green", 1, -1, vbTextCompare)
End Function

Function getGreen(ByVal argStr As String, argPos As Long) As String
  Dim i As Long
  For i = argPos To Len(argStr)
    Select Case LCase(Mid(argStr, i, 1))
      Case "e"
      Case "n"
        getGreen = Mid(argStr, argPos, i - argPos + 1)
        Exit Function
      Case Else
        getGreen = ""
        Exit Function
    End Select
  Next
  getGreen = "" 'これは"e"で終わった場合
End Function


文字列長-3の"e"を最大として置換しまくる

Sub sample()
  Debug.Print fncGreen("greeenはgreenに、greeeeeNやGReeeeeenはGReeeeNに直す")
  Debug.Print fncGreen("grEEn、GreeeN、grEEEEn、greeeeeN、GReeeeeen、GREEEEEEEN")
End Sub

Function fncGreen(ByVal argStr As String) As String
  fncGreen = argStr
  Dim i As Long, repStr As String
  For i = Len(argStr) - 3 To 2 Step -1
    If i <= 3 Then
      repStr = "green"
    Else
      repStr = "GReeeeN"
    End If
    fncGreen = Replace(fncGreen, "gr" & String(i, "e") & "n", repStr, 1, -1, vbTextCompare)
  Next
End Function




同じテーマ「ツイッター出題回答 」の記事

言語依存の関数を使用できるFormulaLocal
配列のUBoundがLBoundがより小さいことはあり得るか
コレクションの要素を削除する場合
greeenはgreenに、greeeeeNをGReeeeNに変換
数値変数の値を別の変数を使わずに入れ替える
Rangeオブジェクトを受け取り"行数,列数"で埋める
数式の関数の使用回数、関数名を配列で返す
日付型と通貨型のValueとValue2について
小文字"abc"を大文字"ABC"に変換する方法
オブジェクトのByRef、ByVal、Variant
「マクロの登録」で登録できないプロシージャーは?


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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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