ツイッター出題回答
「VBAによる解析シリーズその2 カッコ」をやってみた

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2019-05-21 最終更新日:2019-05-21

「VBAによる解析シリーズその2 カッコ」をやってみた


ツイッターで出たVBAのお題をやってみました。


もとネタはこちら、
VBAによる解析シリーズその2 カッコ
関連ツイート

なかなか楽しかったので、VBAコードを掲載しておきます。

まず最初にお題から受ける印象は、再帰処理を行うという事になると思います。
再帰処理について
再帰呼出しについて(再帰プロシージャー)
再帰プロシージャとは、自分自身を呼び出すプロシージャです。プロシージャが、そのプロシージャ内で自分自身を呼び出すような処理を再帰呼び出しと呼びます。自分自身を呼び出し、終了条件を満たすまで、意図的に無限ループさせます。
練習問題24(再帰呼出し)
マクロVBA練習問題 ・以下の表の全組み合わせを作成して下さい。サンプルデータでは、組み合わせの数は、8*3*6*5=720通りです。・各項目はカンマ(,)で区切って下さい。・出力先は、新規シートを追加し、1行目に見出しとして"組み合わせ文字"と入れ、2行目より出力して下さい。
エクセルでファイル一覧を作成
VBAでサブフォルダ以下も含めて全てのファイル一覧を取得します。最初はサブフォルダは無視して、VBAにある関数とステートメントだけで作成します、その後に、FileSystemObjectで再帰処理をすることで、全てのサブフォルダも取得するようにしていきます。
数独(ナンプレ)を解くVBAに挑戦
数独は、一般に「ナンバープレース(ナンプレ)」と呼ばれ、外国では「sudoku」と呼ばれているようです、この数独をExcelマクロVBAで解いてみようと言う事です。解き方は、とにかく片っ端から数字を当てはめていくという、なんとも芸の無い方法です。
ナンバーリンク(パズル)を解くVBAに挑戦
ナンバーリンクというパズルがあります、これをエクセルVBAで解いてみようと思います、数独(ナンプレ)に続くパズルVBA解法の第二弾です。ナンバーリンクをご存じない方は、、ウィキペディア ナンバーリンクのおためし問題 このあたりをお読みください。

再帰を使った模範解答は、先のツイートにありますので、そちらを参考にしてください。
以下では、再帰処理をせずに、Do~Loopで処理しています。
ロジック・アルゴリズムは無限にありますので、いろいろな方法でVBAを書いてみるのも良い勉強になると思います。


シート

マクロ アルゴリズム

VBAコード

Option Explicit

Sub test()
  Dim i As Long
  Intersect(Range("A1").CurrentRegion.Offset(1), Columns(2)).ClearContents
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(i, 2) = parse_kakko(Cells(i, 1))
  Next
End Sub

Function parse_kakko(ByVal sIn As String) As String
  Dim i As Long, j As Long
  Dim isOk As Boolean
  Do
    For i = 1 To Len(sIn)
      If Mid(sIn, i, 1) = "(" Then
        j = InStr(sIn, ")")
        If Not Mid(sIn, i + 1, j - i - 1) Like "*(*" Then
          If Not inKakko(sIn, i, j) Then Exit Do
          isOk = True
        End If
        i = i + 1
      End If
    Next
    If Not sIn Like "*(*)*" Then
      Exit Do
    End If
  Loop
  parse_kakko = IIf(isOk, sIn, "(ERROR)")
End Function

Private Function inKakko(ByRef sIn As String, _
              ByRef i As Long, _
              ByRef j As Long) As Boolean
  Dim sNum As String, sStr As String, N_S As String
  sNum = "": sStr = "": N_S = ""
  Dim i2 As Long, i3 As Long
  sStr = Mid(sIn, i + 1, j - i - 1)
  If sStr Like "*[0-9]*" Then Exit Function
  For i2 = i - 1 To 1 Step -1
    If IsNumeric(Mid(sIn, i2, 1)) Then
      sNum = Mid(sIn, i2, 1) & sNum
    Else
      Exit For
    End If
  Next
  For i3 = 1 To IIf(sNum = "", 1, sNum)
    N_S = N_S & sStr
  Next
  sIn = Replace(sIn, Mid(sIn, i2 + 1, j - i2), N_S)
  inKakko = True
End Function


これはVBAでのアルゴリズム勉強です。




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

「VBAによる解析シリーズその2 カッコ」をやってみた
ツイッターで出されたVBAのお題(悪魔のCSV)をやってみた
「VBAで導関数を求めよ」ツイッターのお題をやってみた
ツイッターのお題「君の名は?」
ツイッターのお題「CSV編集」
アルファベットの26進(ツイッターお題)
ナンバープレート数字遊び:ツイッターお題
サロゲートペアに対応した自作関数(Len,Left,Mid,Right)
迷路にネコが挑戦したら、どうなるかな…
迷路ネコが影分身の術を体得したら…


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