VBAサンプル集
方眼紙Excel(神エクセル)に対応するVBA

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2016-11-05 最終更新日:2020-04-04

方眼紙Excel(神エクセル)に対応するVBA

もはや、「いじめ」か「いたずら」、方眼紙l(神)Exceに、1枠1文字を入れろと言われて・・・


マクロVBAで処理すれば、こんな「いじめ」も「いたずら」も、サクッと克服できます。

以下のような、セル結合の鬼と化したExcelで、
罫線で囲んだ枠内に、1枠1文字で入れるという苦行を、マクロVBAなら自動で処理することができます。

方眼紙Excel(神エクセル)のサンプル

VBA マクロ 方眼紙 神

2行2列をセル結合して、1枠にしています。
以下のVBAでは、何行何列で結合していても動作します。

方眼紙Excel(神エクセル)に対応するVBAコード

シートモジュールに、以下を全て貼り付けて下さい。

Option Explicit

'Changeイベント
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sRng As Range '開始セル
  Dim cRng As Range '処理中セル
  Dim nRng As Range '次のセル
  Dim strIn As String '入力文字
  
  '入力された先頭セルに限定
  Set sRng = Target.Item(1)
  
  '空欄なら無視
  If IsEmpty(sRng) Then Exit Sub
  
  '結合範囲を取得
  Set cRng = sRng.MergeArea
  
  '入力文字
  strIn = sRng.Value
  
  'イベント停止
  Application.EnableEvents = False
  
  '文字を全て配置したか、方眼紙の枠がなくなるまで
  Do
    '文字を全て配置が終わった
    If Len(strIn) = 0 Then
      Exit Do
    End If
    '次の方眼紙の枠を取得、無ければ残りの文字を入れる
    Set nRng = getNext(cRng)
    If nRng Is Nothing Then
      cRng.Value = strIn
      Exit Do
    End If
    
    '左の1文字を入れる
    cRng.Value = Left(strIn, 1)
    
    '未処理文字を2文字目からに
    strIn = Mid(strIn, 2)
    
    '次の方眼紙の枠のセルを次のセルに
    Set cRng = nRng
  Loop
  
  'イベント再開
  Application.EnableEvents = True
End Sub

'次の方眼紙の枠を取得
Private Function getNext(ByVal cRng As Range) As Range
  Dim rng As Range
  Dim nRng As Range
  
  '右のセルが方眼紙の枠なら、それを設定
  If isFrame(cRng.Offset(, 1).MergeArea) = True Then
    Set getNext = cRng.Offset(, 1)
    Exit Function
  End If
  
  '左に向かって先頭列の方眼紙の枠を探す
  Set rng = cRng
  Do
    'A列なら終わり
    If rng.Column = 1 Then
      Set getNext = rng
      Exit Function
    End If
    
    '左が方眼紙の枠でなければ終わり
    If isFrame(rng.Offset(, -1).MergeArea) = False Then
      Exit Do
    End If
    
    '一つ左の枠へ移動
    Set rng = rng.Offset(, -1).MergeArea
  Loop
  
  '一つ下のセルへ移動
  Set rng = rng.Offset(1).MergeArea
  
  '当該セルが方眼紙の枠でなければ終わり判定
  If isFrame(rng) = False Then
    Set getNext = Nothing
    Exit Function
  End If
  
  '見つけた次の枠を返す
  Set getNext = rng
End Function

'方眼紙の枠のセルか判定
Private Function isFrame(ByVal rng As Range) As Boolean
  '四隅に罫線が引かれている場合に、方眼紙の枠と判定
  If rng.Borders(xlEdgeTop).LineStyle <> xlNone And _
    rng.Borders(xlEdgeBottom).LineStyle <> xlNone And _
    rng.Borders(xlEdgeLeft).LineStyle <> xlNone And _
    rng.Borders(xlEdgeRight).LineStyle <> xlNone Then
    isFrame = True
  Else
    isFrame = False
  End If
End Function

VBAコードは難しい内容のものはありません。
ぜひ、VBA内のコメントを参考に読み解いてください。
気を付けるべき点は、
常に、.MergeAreaでRangeを指定することと、次のセルに進む時には、.Offsetを使うということです。

.Offsetを使えば、結合セルの次が簡単に取得できます。
Cellsで行・列指定していたら、かなり大変なコードになってしまいます。

方眼紙Excel(神エクセル)に対応するVBAの規則と使い方

方眼紙Excel(神エクセル)に対応するVBAの規則

・方眼紙の枠の判定は、上下左右に罫線が引かれていること
・順に右に進みます。
・右端まで行ったら、1段下の左端に続きます。
・最後の枠まで行って文字が残っている場合は、最後のセルに残りの文字を全て入れます。

方眼紙Excel(神エクセル)に対応するVBAの使い方

入力開始セルに文字を全部入れて下さい。
どこから書き始めても、上記の規則に従って、1枠1文字になります。
「もはや、「いじめ」か「いたずら」、方眼紙Excelに、1枠1文字を入れろと言われて、悪戦苦闘・・・」
と入れると、

VBA マクロ 方眼紙 神

VBA マクロ 方眼紙 神

最後は、入りきらないので、・・を1枠に入っています。
以下のような形の枠でも、ちゃんと枠にそって1枠1文字で入ります。

VBA マクロ 方眼紙 神

VBA マクロ 方眼紙 神

方眼紙Excel(神エクセル)に対応するVBAの最後に

ここに掲載したものは、あくまでサンプルですので、
さらに複雑な形であるとか、罫線ではなく塗りつぶし色で判定する等々、
いろいろとマクロVBAの記述を変更して対応してみてください。

要点は、次のセルを見つける部分です。
Function getNext
ここを工夫すれば、どんな複雑なパターンにもある程度は対応できるVBAを作ることが出来るはずです。

また、逆に分割された文字を、簡単にまとめたい場合もあるでしょう。
分割よりは結合する方が簡単なので、チャレンジしてみて下さい。



同じテーマ「マクロVBAサンプル集」の記事

ブックを開いた時に指定シートを表示(Workbook_Open)
ブックが閉じられる直前に保存済を確認(Workbook_BeforeClose)
シートが選択された時に指定セルに移動(Worksheet_Activate)
ダブルクリックで行高・列幅調整(Worksheet_BeforeDoubleClick)
英小文字が入力されたら大文字に変換(Worksheet_Change)
セル選択で選択行の色を変更(Worksheet_SelectionChange)
方眼紙Excel(神エクセル)に対応するVBA


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