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

タイトルだけで、質問が終わってしまいました。
宜しくお願い致します。

A 回答 (3件)

こんにちは。

vba_minaraiさん。

もし、ご存知でしたら、お見捨てください。私自身も、1年目ぐらいに、掲示板で教わりました。

VBAで、Empty を使う時に、#2さんのお書きになったように、変数は、Variant型のみに用いられる、変数が空の状態です。いくつかの型の戻り値が発生し、数値の「0」が入れられたか、それとも「空」なのかを、「0」 か「Empty」 かで区分けする必要がある時に使います。ただ、一般的には、文字型でしたら、="" ですし、数値型でしたら、=0 で良いわけです。

私は、しばらくの間、
If ActiveCell.Value = Empty Then

こういうことは良いのだと思っていましたが、間違っていました。
この場合、セルが 0 で、True になりますね。

セル上が、="" の場合は、

If ActiveCell.Value = "" Then

で、Trueになります。

だから、これでは、Empty や ="" では取れません。以下のようにすべきはずなのです。

If IsEmpty(ActiveCell.Value) Then

では、VBA上で、Empty 値でなければならない場合はなにかというと、私自身、何かわかりません。前回の話の続きのような気もしますが、Variant型では、エラーが発生した時に使われるとは、ヘルプで書かれているかとは思いますし、今まで、私もそう信じていましたが、それは、受ける側の変数の型の問題であって、戻り値の期待される型に、文字型か数値型か曖昧な例にめぐり合ったことは、ないといっても過言ではありません。Array関数の配列の格納でも、Emptyは直接関係がありません。VBA上では、特殊な値だと考えてよいかもしれませんね。


見本:

Sub testMatchFunction()
Dim rng As Range
Dim i As Long
Dim rtn As Variant '戻り値
 Set rng = Range("A1", Range("A65536").End(xlUp))
  On Error Resume Next
  rtn = Empty '戻り値を空にする。
  rtn = WorksheetFunction.Match(Range("B1").Value, rng, 0)
  On Error GoTo 0
 If Not IsEmpty(rtn) Then
  MsgBox Cells(rtn, 1).Address
 End If
 Set rng = Nothing
End Sub

改良型
このようにすれば、大きなメモリを使うVariant 型でなくてもよいわけです。戻り値がエラーであるかは関係がありません。時々、掲示板で、Cellsの中で、エラーを発生させて、トラップを取ろうとしている方がいますが、これは好手だとは思えません。なお、なぜ、Match関数を使うのかの意義は、また考えてみてください。

Sub testMatchFunctionR()
Dim rng As Range
Dim i As Long
Dim rtn As Long '戻り値
 Set rng = Range("A1", Range("A65536").End(xlUp))
  On Error Resume Next
  rtn = 0 戻り値を0にする。
  rtn = WorksheetFunction.Match(Range("B1").Value, rng, 0)
  On Error GoTo 0
 If rtn > 0 Then
  MsgBox Cells(rtn, 1).Address
 End If
 Set rng = Nothing
End Sub

なお、単独のプロシージャでは、rtn 変数をEmptyや0にする必要はありませんが、ループやサブルーチンで、変数で、On Error トラップを使う前に、rtnに何も入れられていない状態に戻す必要があります。

この回答への補足

いつも、いつも有難うございます。
>もし、ご存知でしたら、お見捨てください。
勿体無い、お言葉有難うございます。
変数の型って時に厄介に思います。(変数の基本を理解した上での発言でない無謀な意見であることは既にご承知のことと思いますが!)直接、メモリーを操作すれば変数の型なんて概念は自己責任の範囲ですが、それでは、効率があまりにも悪すぎ、ある程度の制約を加えることにより総合的な効率を追求すべきだということも、またそれが効率的であうることは明白だと思います。アスキー文字で単純に比較することは簡単ですが、Emptyのような抽象的な表現では、いったい何を比較すれば良いのかとの疑問から質問しました。いつもながら的確なご指導感服いたします。有難うございます。
私も、= Empty でエラーが引っかかったので質問したのがきっかけでした。その場合の、エラーの原因は、帰り値が配列だったためのエラーでしたが、物事の本質は= Empty とは何か?に変わりありません。
今回ご指導頂いた内容は、まだ理解するに至っておりませんが、もう少しお時間を頂いてじっくり考えていただきたいと思います(すみません、今酔っ払っています!!爆笑)
メモリーがある値で初期化せず単に空間を割り振った状態で取り扱う必要がある場合、予期せぬトラブルが発生すると思います。特に、文字列などで、アドレスと、EOFのみを割り振った場合など顕著だと思います。重箱の隅をつつくような質問をすると思いますが今後ともよろしくお願いいたします。
尚、本件とはズレますが、以前にご指導頂いた、Extensibilityの件ですが、なんとか、"ThisWorkbook"同士の移動は出来るようになりました。(オブジェクト思考って凄いですね?)有難うございました。本当に、本当に助かっております。有難うございました。(前回、同様、お礼の部分は残しておきます。ご了承ください。)

補足日時:2005/11/23 23:52
    • good
    • 0

ヘルプから



キーワード Empty はバリアント型 (Variant) の 1 つで、変数に格納されている値が初期化されていないことを示します。
    • good
    • 0

値が入っていない状態を表す値です。



ある変数が、ByteでもBooleanでもIntegerでもLongでもCurrencyでもShortでもSingleでもDoubleでもStringでもArrayでもObjectでもNothingでも無い場合にこの値になります。
    • good
    • 0

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

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


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