- 締切済み
VBA スペースが入力されていても、空白セルと判断する方法
VBAで、空白ではないときに処理するようなマクロを組みたいのですが、空白のはずのセルにスペースが入っている場合があり、 IF cells(i,j)<>empty then のような記述では、スペースが入力されているセルも該当してしまいます。 スペースのみのセルを消去するか、それか、数値か文字列の何かが入力されていることを判断するような方法はありますか? よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 それでは、ちょっと、話を元に戻しまして、基本的なコード・パターンをこちらか提示します。 参考本はいくつかあるのですが、入門用のテキストと実践用のコードとは違います。 失礼ですが、個々の部分の問題でいくら質問されても、回答者側の技術的なレベルはエスカレートするか、回答者が放り出すだけで、現実的な解決とはかけ離れていくような感じがします。 上手く行かないときは、その部分だけの「スモール・サンプル」を抜き出してシュミレートしてみることがコツです。掲示板では、質問として与える情報が十分に与えられないのです。分かっていれば、それを提示できても、分からないから、そこは見えないわけです。 それから、Excelは、Excel VBAのスタイルがあって、VBスタイルとは違います。Excel VBAの経験が十分でない人に教わったところで、トンチンカンになるだけだと思います。ここの掲示板では、そのような人も多いです。 私は、["○"] ["1"][Empty] この三つの判定は、慣れないと難しいと思います。 簡単だと思うのは、Excel VBAが詳しくない人です。特に、数字とは何か、Empty とは何か、ということを追求していない人がほとんどです。 Basic なら簡単な問題でも、Excelでは、["1"]は、データ型のキャスティングが起きて、おそらくは、[1]になってしまいます。 こちらで、シミュレートします。 以下のコードは、簡単だと思うかもしれませんが、なぜ、Text プロパティを使うのかとか、経験ないと出来ません。普段、私は、このようなコードは書きませんが、基本的なところは押さえているつもりです。 表は、C1からの数式 =IF(ISBLANK(A2),"Empty",CODE(A2)) となっています。 // Case " ", " ": .Cells(i, 2).Value = "なし" 半角空白, 全角空白が入っています。 ----------------------------------------------- Sub Test1() Dim i As Long With Worksheets("Sheet1") For i = 1 To .Range("A65536").End(xlUp).Row Select Case .Cells(i, 1).Text Case "1": .Cells(i, 2).Value = "いち" Case "○": .Cells(i, 2).Value = "まる" Case "": .Cells(i, 2).Value = "なし" Case " ", " ": .Cells(i, 2).Value = "なし" '半角と全角の半角が併記してある Case Else: .Cells(i, 2).Value = "その他" End Select Next i End With End Sub
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 ご質問の内容では、何をしているのか、空のセルを探しているのか、本来の目的が分かりません。マクロの ="" というのは、長さ0の文字列と、本当のEmpty とは区別が付きません。フィルタでも、長さ0の文字列も、Empty も区別は付きません。 マクロでは、="" と一致しないというのは、どういう現象が起きているのか、こちらが当てることは不可能だと思います。とはいえ、ClearContents を使いたくないのでしたら、空白と思えるセルに対して、ワークシートの関数の=CODE(A1) のように、文字コードを取ってみればよいのではありませんか?または、LENB(A1)で長さを取ればよいと思います。 それと、まれに、シートが壊れていると、そういう現象が現れるはずです。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 If Cells(i,j)<>Empty Then という 'Empty'というのは、Variant 型の変数を使っていない状態のことで、ワークシート上では、あまり意味がないと思います。別に間違いではないけれども、もし、Empty を調べるなら、'IsEmpty'を使うほうがよいのですが、本当に、Empty(空)の状態にするなら、'ClearContents' を使うほうがよいのではないかと思います。「""(長さ0の文字列)」は、何も入っていない状態ではありません。 Trim は、文字の初めと終わりの空白値を取り去るわけですね。それには、数は関係がありません。 果たして、それだけで良いのでしょうか?例えば、文字列の間の空白値は取ることができません。
補足
ご説明ありがとうございます。 実は、今日試してみたのですが、Trimとreplaceで改行を除いただけでは、うまくいきませんでした。 フィルタをかけたときには、空白セルに該当するのに、なぜマクロでは""と一致しないのでしょうか。
- fujillin
- ベストアンサー率61% (1594/2576)
空白(半角、全角)はTrimで取り除くことができます。 (多分、セル内改行も同時に取り除いておいた方がよいのではと思いますが…) 改行もの除くなら、 If Replace(Trim(Range("A1").Text), Chr(10), "") <> "" Then みたいな判断を行えばよろしいかと思います。 改行は判断にいれなくてもよいのなら、Trimだけでいけるでしょう。
お礼
改行は考えていませんでした! 確かに改行も困ります。 とても助かりました。 ありがとうございます。
補足
ちなみに、Trimはスペースを全て取り除けるのでしょうか? スペースが複数入力されている場合、Do Loopが必要ですか?
- merlionXX
- ベストアンサー率48% (1930/4007)
If Trim(Cells(i, j)) <> Empty Then でいけますけど。
お礼
なるほど! ありがとうございます。
- hige_082
- ベストアンサー率50% (379/747)
>IF cells(i,j)<>empty then の前に Trim (Cells(i, j).Value) '←追加 IF cells(i,j)<>empty then では如何でしょう
お礼
Trimでスペースを取り除けるのですね。 ありがとうございます!
補足
項目に対して、"○"とか"1"とか何かしら記入されているか、何も記入されていないかを判断したいのです。 フォーマットが決まっていない不特定の既存ファイルに対応するマクロを組みたいので、ClearContentsをどう使えばよいかわかりません。 CODEはVBAではASCを使えばよいのでしょうか? すみません。使い方がよくわかりません。 LENBはば、スペースや改行は含まれないのですか? 初心者で申し訳ありません。 よろしくお願いします。