#742 Excelに貼り付けたNullを空白に置換するマクロ VBA

Accessでは、テーブルなどでデータを見たとき、見た目は”空白”であっても”NULL”という値が保存されています。外見は同じでも内部的なデータとしては別物として扱われます。

そのようなデータをコピーしてExcelに貼り付けたとき、やはり見た目はいずれも”空白”ですが、実際には異なる値であるため、関数式などにおいて支障が出る場合があります。たとえば、「COUNTA」関数を使って”空白でないセルの数”をカウントする場合、”NULL”は”空白でない”セルとしてカウントされてしまいます。

そのようなケースにおいて、Excelに貼り付けた一連のデータから”Null”のセルを”空白”のセルに一括置換するマクロを紹介します。
Accessのテーブルやクエリからレコードをコピー&ペーストしたあと、Excel側でそれらを範囲選択したあとにこのマクロ「Null2Space」を実行することで、範囲内のすべての”Null”が”空白”に置換されます。

【注意】下記はAccessではなくExcel用のマクロです。

Sub Null2Space()

  Dim RngAdr As String
  Dim Rng As Range

  If TypeName(Selection) <> "Range" Then Exit Sub

  RngAdr = Selection.Address(False, False)
  RngAdr = Replace(RngAdr, ":", "")
  If IsNumeric(RngAdr) Then
    Beep
    MsgBox "行全体が選択されています! セル単位で範囲選択し直してください。"
    Exit Sub
  End If

  If Selection.Address = Selection.EntireColumn.Address Then
    Beep
    MsgBox "列全体が選択されています! セル単位で範囲選択し直してください。"
    Exit Sub
  End If

  Beep
  If MsgBox("AccessからペーストしたNullのセルを空白に置換します!", vbQuestion + vbOKCancel) = vbCancel Then
    Exit Sub
  End If

  'すべてのセルをループ処理
  For Each Rng In Selection
    '長さゼロでかつEmptyでなければ""を代入
    If Len(Rng.Value) = 0 And Not IsEmpty(Rng.Value) Then
      Rng.Value = ""
    End If
  Next Rng

End Sub

※前半のコードでセル範囲の選択以外をNGにしているのは、行範囲や列範囲選択では後続の余分なセルまで検索してしまい時間が掛かってしまうためです。実質的な処理はFor Each Rng In Selectionのループの部分になります。


実行例:
  1. まずAccessからテーブルなどからレコードをコピー&ペーストします。

  2. そこに「COUNTA」で”空白でないセルの数”を計算するセルを作ります。


  3. そして、ペーストした範囲を選択して上記マクロを実行すると下図のような結果になります。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved