【イライラ解消】エクセル方眼紙でも超簡単に入力できるVBAマクロ

入力フォームがエクセル方眼紙でできていると、1セルに1文字ずつ文字を入力しないといけなくて、イライラしますよね?
そこで、今回は、そのイライラを解消するための【エクセルVBAのマクロ】をご紹介します。

このマクロを使えば、エクセル方眼紙への入力の手間が、大幅に減ります。

※下記を再生しても音は出ませんので、音が出せない環境でもご安心ください。


ダウンロードして、試しに使ってみる

(a)エクセルブックのダウンロード

マクロが入ったファイルをダウンロードします。
houganshiinputhelper.xlsm

そして、そのファイルを開いてください。

(b)入力したい文字を1つのセルに入力

エクセル方眼紙に入力したいデータを、1つのセルにまとめて入力します。

たとえば、下記のサンプルであれば、F11セル(エクセル方眼紙の一番左のセル)に、「123-4567」と入力します。

(c)入力欄全体を選択

エクセル方眼紙の入力欄全体(F11~M11セル)をマウスで選択した状態にします。

(d)Ctrl+Shift+Zを押す

その状態で、Ctrl+Shift+Zを押すと、あらかじめコピーされたデータが1セルに1文字ずつ転記されます。

他の入力欄もまったく同じように入力ができます。

たとえば、F13セルに「山田 花子」と入力した後に、F16~O16セルを選択してCtrl+Shift+Zを押せば氏名が記入できます。

また、エクセル方眼の入力フォームが複数行にわたっていても問題ありません。

たとえば、F15セルに「CD、DVD等、音楽・映像等の複製物の企画、制作、販売に関する業務 」と入力した後に、F15~O18セルを選択してCtrl+Shift+Zを押せば事業内容を記入することもできます。

実際に入力するブックに、マクロを組み込む必要はありません

先ほどの例では、マクロが入っているエクセルブックに、エクセル方眼紙フォームが入っていました。

でも、実際に使うときには、エクセル方眼紙フォームは、マクロのファイルとは別ファイルでも構いません。

マクロが入っているエクセルブック(paste2hougan.xlsm)を開いている状態で、さらに、入力したいエクセル方眼紙フォームを開けば、先ほどと同じように使うことができます

たとえば、下記URLからエクセル方眼紙の入力フォームをダウンロードしてみてください。
エクセル方眼紙入力フォームサンプル(マクロなし)

このエクセルブックは、最初にダウンロードして頂いたものと見た目はまったく同じですが、拡張子「.xlsx」でもわかるように、このエクセルブックにはマクロは含まれていません

でも、別途「paste2hougan.xlsm」を開いていれば、先ほどと同じように操作できることがわかると思います。

このように、入力したいブックに、マクロを付け加える必要はありません。

VBAソースコード

今回のプログラムのソースコードです。

Sub 選択したセル範囲に1文字ずつ貼り付け()
    
'選択した「セル範囲」に入力されているすべてのデータを「結合」して、入力文字列とする
  Dim iText As String
  Dim iCell As Range
  
  For Each iCell In Selection
    iText = iText & iCell.Value
  Next

'選択した「セル範囲」に入力データを1文字ずつ貼り付け
  Dim Pos As Long       '入力データの何文字目を処理しているか?
  Pos = 0
  
  Dim maxPos As Long    '入力データの文字数
  maxPos = Len(iText)
  
  Dim oCell As Range
  For Each oCell In Selection
'結合セルの場合で、結合セルの一番左上のセルでない場合には、そのセルには入力せず次のセルに進む
    If oCell.MergeCells Then
      If oCell.MergeArea.Cells(1, 1).Address <> oCell.Address Then
        GoTo Continue
      End If
    End If
    
'1セルに1文字ずつ入力していく
    Pos = Pos + 1
    
    If Pos > maxPos Then
      oCell.Value = ""
    Else
      oCell.Value = Mid$(iText, Pos, 1)
    End If

Continue:
  Next

End Sub

VBAソースコードの解説

以下、簡単に解説をしていきます。

入力すべきデータの取得

'選択した「セル範囲」に入力されているすべてのデータを「結合」して、入力文字列とする
  Dim iText As String
  Dim iCell As Range
  
  For Each iCell In Selection
    iText = iText & iCell.Value
  Next

7行目の「Selection」で、現在選択しているセル範囲が得られます。

そこで、7行目~9行目で、「Selection」に含まれている「全ての」セルの値を結合して、変数iTextに代入します。

ループ処理をする前の事前準備

'選択した「セル範囲」に入力データを1文字ずつ貼り付け
  Dim Pos As Long       '入力データの何文字目を処理しているか?
  Pos = 0
  
  Dim maxPos As Long    '入力データの文字数
  maxPos = Len(iText)

ループ処理のために必要な変数を定義しています。

ループ処理で、選択した「セル範囲」に1文字ずつ貼り付け

ここからが、今回のプログラムのメインロジックです。

20行目~25行目と36行目は、いわゆる「例外処理」にあたる部分です。
見通しをよくするため、いったん記載を「省略」しておきます。

  Dim oCell As Range
  For Each oCell In Selection
'(省略)
'
'
'
'
'(省略ここまで)
    
'1セルに1文字ずつ入力していく
    Pos = Pos + 1
    
    If Pos > maxPos Then
      oCell.Value = ""
    Else
      oCell.Value = Mid$(iText, Pos, 1)
    End If

'(省略)
  Next

このロジックで行っている処理をまとめると、次のようになります。

18行目~19行目
  Dim oCell As Range
  For Each oCell In Selection

Selectionから1セルずつ取得し、変数「oCell」に格納します。

「for each」を使うと、

  • 選択したセル範囲の「上から1行目」の「左から右」
  • 選択したセル範囲の「上から2行目」の「左から右」
  • ・・・

というように、「Z」の字のような順番で選択され、「oCell」に格納されていきます。

28行目
    Pos = Pos + 1

変数「Pos」には入力データの何文字目を処理しているかが入っています。

ここでは、「Posを1増やして」いるのですが、これは「次の文字の処理に移る」という意味になります。

30行目~31行目
    If Pos > maxPos Then
      oCell.Value = ""

変数「Pos」が「Maxpos」を超えていたら、すでに全文字を転記済みなので「空欄」にします。

32行目~33行目
    Else
      oCell.Value = Mid$(iText, Pos, 1)
    End If

それ以外(=変数「Pos」が変数「Maxpos」以下のとき)の場合には、まだ、転記すべき文字があるということです。

そこでmid$関数を使って、「oCell」で表されるセルに、先頭から「Pos」番目の文字転記します。

ここまできたら、19行目に戻って次のセルについて処理を行っていきます。

セルが結合されている場合の例外処理

さて、以上が、今回のプログラムのメインロジックの部分です。

ただ、これだけでは、うまく動かないケースがあったため「例外処理」にあたるロジックを書いています。

先ほどのロジックだけで、うまく動かない例として、次のような、「複数セルを結合したセルに1文字」を入れる形式のエクセル方眼紙があります。

例:社会保険の新規適用手続き

エクセルシートを開くと、上の図のように、4つのセルが結合されたところに1つの文字を入力するような様式になっています。

ところが、先ほどのプログラムでは、このような「結合セル」には対応できません。

このような結合セルがある場合には、結合セルの「左上のセル」にだけ文字を入れればいいところを、先ほどのプログラムだと、セルを結合しているかどうか無関係に1つ1つのセルに値を入れる処理をしてしまうのです。

そこで、この問題に対応するための修正を入れます。

それが、次の20行目~25行目と36行目です。

この修正を入れることにより、
結合セルがある場合には、結合セルの一番左上のセルにのみ値を入力し、その他のセルは無視する
という動きをするようになります。

以下、実際のソースコードを見ていきます。

  Dim oCell As Range
  For Each oCell In Selection
'結合セルの場合で、結合セルの一番左上のセルでない場合には、そのセルには入力せず次のセルに進む
    If oCell.MergeCells Then
      If oCell.MergeArea.Cells(1, 1).Address <> oCell.Address Then
        GoTo Continue
      End If
    End If
    
'1セルに1文字ずつ入力していく
'(メインロジック:省略)
'
'
'
'
'
'(省略ここまで)

Continue:
  Next

※今度は、先ほどとは逆に「メインロジック」の部分を省略して記載しています。

21行目
'結合セルの場合で、結合セルの一番左上のセルでない場合には、そのセルには入力せず次のセルに進む
    If oCell.MergeCells Then

「oCell.MergeCells」で、「oCell」がセルの結合をされているかどうかを判定できます。
セルの判定ができている場合には、次の条件判定に進みます。

22行目
      If oCell.MergeArea.Cells(1, 1).Address <> oCell.Address Then
        GoTo Continue
      End If

「oCell.MergeArea.Cells(1,1)」で、「oCellが属している結合セルの一番左上のセル」を取得できます。
そこで、このセルが、今処理をしようとしている「oCell」と等しいかチェックをします。

そして、等しくない場合には、このセルの処理を無視するため、「Goto Continue」文により、メインロジックを実行せずに、ただちに36行目の「Continue:」の行に移動しています。

Continue:
  Next

エクセルブック ダウンロード

下記からダウンロードできます。
エクセル方眼紙入力ヘルパー(houganshiinputhelper.xlsm)

ご使用は自己責任でお願いいたします。
不具合などがあった場合も、損害について補償は一切できませんので、あらかじめご了承ください。

なお、不具合・ご要望についてご連絡頂ければ、可能な限り対応いたします。
お問い合わせフォームより、ご連絡ください。

エクセル基礎講座 「無料」動画マニュアル

「経理事務のためのエクセル基礎講座(初級編)」(動画マニュアル 総収録時間162分)を無料プレゼント中です!

このマニュアルで解説していることを一通り学べば、経理事務を行う上で最低限必要となる知識が得られます。

ご登録者の方には、合わせて、公認会計士が実体験を通して身に付けたエクセルを使う技をメールにてお伝えしていきます!

無料動画講座 登録フォーム

※ご登録頂いたメールアドレスに、エクセルを使いこなすための情報を配信するメールセミナー「エクセル倍速講座」も合わせて配信させていただきます。