プロが教えるわが家の防犯対策術!

マクロでコードを書く時に
セルが空白なのか確認することがよくあります。

私はいつもセルの中の文字数を取得して判断してます。
※以下コードのように判断してます。

これでも問題ないのですが、
ワークシート関数の場合「” ”」=「空白」
という考え方があります。

そのため、みんなどうしているのか
ちょっと気になって質問してみました。

文字数をカウントする以外に、
VBAでマクロのコードを書く時にセルの「空白」を判断する
お勧めの方法があれば教えて下さい。

※シンプルな方法が希望です

Sub Macro1()
If [LenB(A1)] > 0 Then
MsgBox ("文字ある")
Else
MsgBox ("空白です")
End If
End Sub

急いでないです。
↑ 返答、お礼が遅くなるかもしれないです。

A 回答 (3件)

いろいろ、以下に至るまでには、考えたことがあります。


シンプル自体よりも、ベストを選びたいですね。

通常は、
If Range("A1").Value ="" Then
 または、
If Trim(Range("A1").Value) ="" Then

でよいと思います。「""」 は、長さ0の文字列と言いますから、Trim でないと感知しません。
複数のセルの選択で、
(Rng.)SpecialCells(xlCellTypeBlanks)
という方法もあります。(Rng は、Range型の範囲を示す変数)
空白がないと、エラーが発生してしまいます。

また、IsEmpty(Range("A1")) というのもありますが、
IsEmpty/Empty は、VBA由来ですから、少し増長です。
また、Range("A1").Value = Empty
のEmpty は、いきていませんので、="" と等価になってしまいます。

[Len("A1")] という意味は、
VBA関数を使った Len(Range("A1")) とは違い、Evaluate 関数を使って、セルの中での使われているものと等価になります。[Len("A1")]これを使うと、純粋にVBAとは違った、イレギュラーなスタイルで、そのワザは、私は使わないです。使うなら、Evaluateを使って明示的に書きます。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

ためしてみましたが、
>If Range("A1").Value ="" Then

が良かったです。

>If Trim(Range("A1").Value) ="" Then

は以下のマクロでA1に関数が入っていた時に、
関数を感知しませんでした。

おまけに
A1の関数が「=B1」の場合、
B1の値が「半角スペース」の場合、
「文字ない」という結果を返してきますし、

B1の値が「半角スペース」以外の場合は
「ある」という結果を返してきます。

Sub Macro2()
If Trim(Range("A1").Value) = "" Then
MsgBox ("文字ない")
Else
MsgBox ("ある")
End If
End Sub

以下のサイトを見たのですが、文字列の前後の空白を削除する関数なので、
If Trim(Range("A1").Value) ="" Then は使いどころがないように思います。
↓ 
http://officetanaka.net/excel/vba/function/Trim. …

何か意味があるのでしょうか?

もし何か意味があるのでしたら、教えて頂ければうれしいです。

ご面倒でしたらスルーでOKです。

いつも教えて頂きありがとうございます。
機会がありましたらまたお願いします。

お礼日時:2018/06/22 18:25

実験:


「単独の場合=A1の中に半角スペースが1個だけ入力されている」ということで良いでしょうか?
いえ、そうではありませんでしたね。

頭では理解していても、今まで、実際には試したことがありませんでしたから、実に興味深い結果です。

'セルA1 に任意の数5でも10個でも空白文字(JISに限る・全角・半角)を入れてためしてみてください。
Sub TestBlank2()
Dim buf As String
Dim myCell As Variant
Dim cnt As Long
myCell = Range("A1").Value
Do
 buf = Replace(buf, Space(1), "", , , 1) 'テキストコンペア
Loop Until InStr(1, buf, Space(1), 1) = 0
cnt = Len(myCell) - Len(buf)
MsgBox cnt & "個の空白文字(半角・全角)があります。"
'空白判定の実行
If Trim(myCell) = "" Then
 MsgBox "Blank"
Else
 MsgBox "Not Blank", vbExclamation
End If
End Sub
'//

このコードで、どういう反応になるかはやってみてください。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます
あいだがあいてしまいすいません。

>
Sub TestBlank2()

の方でわかりました。

単なる空白判定でも、
いろいろあるのですね。
勉強になりました。

>
Trim関数を使う場合てすが、それは、ネットからのコピー&ペーストで、半角・全角スペースが紛れ込んでいることがある場合に、念の為に使います

こういう使い方があるとは知らなかったので、
機会がありましたら、教えて頂いたことを思い出して、
Trim関数を使ってみたいと思います。

今回はいろいろ教えて頂きありがとうございます。
機会がありましたら、またお願いします。

お礼日時:2018/06/24 17:29

こんばんは。


早速の返事ありがとうございます。

自分の書いた内容を読み直してみましたが、一部内容にミスがありました。

Trim関数を使う場合てすが、それは、ネットからのコピー&ペーストで、半角・全角スペースが紛れ込んでいることがある場合に、念の為に使います。

半角・全角の空白に対して、->「" "」\x0020 or 「" "」\u3000
>If Trim(Range("A1").Value) ="" Then
これで、みなし空白の判定は、「空白」と出ます。
目でみたのと同じ判定になるはずです。

SpecialCells(xlCellTypeBlanks) では、判定できません。
(実際は、ネットからのコピーの場合は、Unicode 空白を含めた、もう少し複雑な除去するコードが必要です。)

>文字列の前後の空白を削除する関数なので、
いいえ、単独の場合は、空白自体を削除して判定します。

おまけです。
[__は、全角または半角の空白]
また、、A____B のような空白は、両側は削除できても、中は、除去できませんので、
A____B とABの比較をする場合などは、

Sub TestBlank3()
Dim i As Long
Dim buf As String
buf = Range("A1").Value
Do
 buf = Replace(buf, Space(1), "", , , 1) '1は、TextCompareMode です。
Loop Until InStr(1, buf, Space(1), 1) = 0
If buf Like "AB" Then
 MsgBox "Same"
Else
 MsgBox "Different"
End If
End Sub

これも、空白にまつわる、特別なワザのひとつです。
これは、見た目よりも、かなり複雑な考え方になっています。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

>文字列の前後の空白を削除する関数なので、
いいえ、単独の場合は、空白自体を削除して判定します。

せっかく説明していただいたのですが、これがわからないです。

「単独の場合」というのは、どういう状況なのでしょうか?

「単独の場合=A1の中に半角スペースが1個だけ入力されている」ということで良いでしょうか?

こちらの知識不足ですいません。
ご面倒でしたらスルーでOKです。

いつも教えて頂きありがとうございます。
機会がありましたらまたお願いします。

お礼日時:2018/06/23 00:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!