アプリ版:「スタンプのみでお礼する」機能のリリースについて

A5からZ100までが範囲となっている表において、A列が空白(関数で空白を入れている行があります)になっている行を非表示にするマクロについてですが、以下のマクロを実行しようとすると空白行が非表示にはなるものの「型が一致しません」というメッセージが出てしまいます。

どこがおかしいのか、ご教示願います。


Sub Sample1()
Dim LastRow As Long
Dim i As Long

LastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To LastRow
If Cells(i, 1) = "" Then Rows(i).Hidden = True
Next i
End Sub

A 回答 (3件)

検証してみましたが、


そのコード自体では、「型が一致しません」というエラーは発生しないように思います。セルにエラー値が存在した場合のみのようです。

VBAでは、エラー値と文字列の比較は、データ型が違うので比較できません。#1さんのように、最初にエラーを排除して検査するのが常套手段だと思います。

もちろん、VBAで、ワークシート上にエラー値を置いたまま、検査させるかどうかは、また状況によって変わりますが。

あえて、厳密に文字列を比較をさせるなら、本来は、以下のようにするのですが、VBAでは、そこまでは要求していません。

If CStr(Cells(i, 1).Value) = "" Then Rows(i).Hidden = False

なお、Cells や Rangeのプロパティに.Value を入れたほうがよいのは、環境によって暗黙のプロパティのValue が決定されないことがあるからです。
    • good
    • 3
この回答へのお礼

ありがとうございます。
おっしゃるとおりエラー値が存在しており、それをなくすとうまく動くようになりました。

お礼日時:2016/06/22 16:07

Cells(i, 1) = ""


これでも良さそうですけど、最近のエクセルは厳密になったのかな?
    • good
    • 0
この回答へのお礼

ありがとうございます。
おっしゃるとおり、Cells(i, 1) = ""でも大丈夫でした。

空白だけでなく、エラー値が入っているセルもあったので、メッセージが出ていたようです。

お礼日時:2016/06/20 13:38

If Cells(i, 1) = ""


この部分だと思います。結構厄介です、null判定は。


If Not IsError(Cells(i, 1)) Then
  If Not Cells(i, 1).HasFormula Then
    If Cells(i, 1) = "" Then
      Rows(i).Hidden = True
    End If
  End If
End If
    • good
    • 0
この回答へのお礼

ありがとうございます。
解決しました。

お礼日時:2016/06/20 13:37

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A