「これはヤバかったな」という遅刻エピソード

VBAで、空白ではないときに処理するようなマクロを組みたいのですが、空白のはずのセルにスペースが入っている場合があり、
IF cells(i,j)<>empty then
のような記述では、スペースが入力されているセルも該当してしまいます。

スペースのみのセルを消去するか、それか、数値か文字列の何かが入力されていることを判断するような方法はありますか?

よろしくお願いします。

A 回答 (6件)

こんにちは。



それでは、ちょっと、話を元に戻しまして、基本的なコード・パターンをこちらか提示します。
参考本はいくつかあるのですが、入門用のテキストと実践用のコードとは違います。

失礼ですが、個々の部分の問題でいくら質問されても、回答者側の技術的なレベルはエスカレートするか、回答者が放り出すだけで、現実的な解決とはかけ離れていくような感じがします。

上手く行かないときは、その部分だけの「スモール・サンプル」を抜き出してシュミレートしてみることがコツです。掲示板では、質問として与える情報が十分に与えられないのです。分かっていれば、それを提示できても、分からないから、そこは見えないわけです。

それから、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
「VBA スペースが入力されていても、空白」の回答画像6
    • good
    • 0

こんばんは。



ご質問の内容では、何をしているのか、空のセルを探しているのか、本来の目的が分かりません。マクロの ="" というのは、長さ0の文字列と、本当のEmpty とは区別が付きません。フィルタでも、長さ0の文字列も、Empty も区別は付きません。

マクロでは、="" と一致しないというのは、どういう現象が起きているのか、こちらが当てることは不可能だと思います。とはいえ、ClearContents を使いたくないのでしたら、空白と思えるセルに対して、ワークシートの関数の=CODE(A1) のように、文字コードを取ってみればよいのではありませんか?または、LENB(A1)で長さを取ればよいと思います。

それと、まれに、シートが壊れていると、そういう現象が現れるはずです。

この回答への補足

項目に対して、"○"とか"1"とか何かしら記入されているか、何も記入されていないかを判断したいのです。

フォーマットが決まっていない不特定の既存ファイルに対応するマクロを組みたいので、ClearContentsをどう使えばよいかわかりません。

CODEはVBAではASCを使えばよいのでしょうか?
すみません。使い方がよくわかりません。
LENBはば、スペースや改行は含まれないのですか?

初心者で申し訳ありません。

よろしくお願いします。

補足日時:2009/06/16 20:45
    • good
    • 1

こんばんは。



If Cells(i,j)<>Empty Then

という 'Empty'というのは、Variant 型の変数を使っていない状態のことで、ワークシート上では、あまり意味がないと思います。別に間違いではないけれども、もし、Empty を調べるなら、'IsEmpty'を使うほうがよいのですが、本当に、Empty(空)の状態にするなら、'ClearContents' を使うほうがよいのではないかと思います。「""(長さ0の文字列)」は、何も入っていない状態ではありません。

Trim は、文字の初めと終わりの空白値を取り去るわけですね。それには、数は関係がありません。
果たして、それだけで良いのでしょうか?例えば、文字列の間の空白値は取ることができません。

この回答への補足

ご説明ありがとうございます。

実は、今日試してみたのですが、Trimとreplaceで改行を除いただけでは、うまくいきませんでした。
フィルタをかけたときには、空白セルに該当するのに、なぜマクロでは""と一致しないのでしょうか。

補足日時:2009/06/12 20:55
    • good
    • 1

空白(半角、全角)はTrimで取り除くことができます。


(多分、セル内改行も同時に取り除いておいた方がよいのではと思いますが…)

改行もの除くなら、
 If Replace(Trim(Range("A1").Text), Chr(10), "") <> "" Then
みたいな判断を行えばよろしいかと思います。
改行は判断にいれなくてもよいのなら、Trimだけでいけるでしょう。

この回答への補足

ちなみに、Trimはスペースを全て取り除けるのでしょうか?
スペースが複数入力されている場合、Do Loopが必要ですか?

補足日時:2009/06/11 22:14
    • good
    • 0
この回答へのお礼

改行は考えていませんでした!
確かに改行も困ります。
とても助かりました。
ありがとうございます。

お礼日時:2009/06/11 22:18

If Trim(Cells(i, j)) <> Empty Then


でいけますけど。
    • good
    • 0
この回答へのお礼

なるほど!
ありがとうございます。

お礼日時:2009/06/11 22:22

>IF cells(i,j)<>empty then


の前に

Trim (Cells(i, j).Value)  '←追加
IF cells(i,j)<>empty then

では如何でしょう
    • good
    • 1
この回答へのお礼

Trimでスペースを取り除けるのですね。
ありがとうございます!

お礼日時:2009/06/11 22:20

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

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


おすすめ情報

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