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

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日: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 ・・・新着記事一覧を見る

VBA100本ノック 37本目:グラフの色設定|VBA練習問題(12月1日)
VBA100本ノック 36本目:列の並べ替え|VBA練習問題(12月1日)
VBA100本ノック 35本目:条件付き書式|VBA練習問題(11月29日)
VBA100本ノック 34本目:配列の左右回転|VBA練習問題(11月28日)
VBA100本ノック 33本目:マクロ記録の改修|VBA練習問題(11月26日)
VBA100本ノック 32本目:Excel終了とテキストファイル出力|VBA練習問題(11月25日)
VBA100本ノック 31本目:入力規則|VBA練習問題(11月24日)
将棋とプログラミングについて~そこには型がある~|エクセル雑感(11月22日)
VBA100本ノック 30本目:名札作成(段組み)|VBA練習問題(11月22日)
VBA100本ノック 29本目:画像の挿入|VBA練習問題(11月21日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


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



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