【イライラ解消】エクセル方眼紙でも超簡単に入力できる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)
ご使用は自己責任でお願いいたします。
不具合などがあった場合も、損害について補償は一切できませんので、あらかじめご了承ください。
なお、不具合・ご要望についてご連絡頂ければ、可能な限り対応いたします。
お問い合わせフォームより、ご連絡ください。