web-dev-qa-db-ja.com

VBScriptにオブジェクトが存在するかどうかを確認します

私はClassic ASPで書かれたアプリをVBずっと前に外部の会社が作成したスクリプトを維持しています。

次のような画像ファイルパスの配列があります。

dim banners, arrKeys, i
set banners=CreateObject("Scripting.Dictionary")
banners.Add "banner1.jpg", "http://www.somelink.com"
banners.Add "banner2.jpg", "http://www.somelink.com"
banners.Add "banner3.jpg", "http://www.somelink.com"

これは、バナー広告があるページにのみ存在します。インクルードファイル(すべてのページに共通)でこのリストを反復処理する標準コードがいくつかあります。

If Not banners Is Nothing then 
  ' then loop through the Dictionary and make a list of image links
End if

問題は、bannersがページでインスタンス化されていない場合(すべてのページではない)、Can't find objectエラー

VBスクリプトにオブジェクトが存在するかどうかを確認する適切な方法は何ですか?

18
Armstrongest

@Atømix:置換

If Not banners Is Nothing then 

そして使用

If IsObject(banners) Then 

その後、他のコードをインクルードファイルに配置し、ページの上部で使用して、不必要な重複を回避できます。

@Cheran S:上記のスニペットをOption Explicit on/offでテストしましたが、Dim bannersが存在するかどうかに関係なく、どちらのバージョンでもエラーは発生しませんでした。 :-)

35
stealthyninja

IsObjectは機能しますが、IsEmptyの方が適切なオプションである可能性があります。特に、変数が存在するか初期化されているかどうかを確認することを目的としています。

要約する:

  • IsEmpty(var) は、変数が存在するかどうか(Object Explicitなし)、または初期化されているかどうかをテストします
  • IsNull(var) は、変数が割り当てられているかどうかをテストします Null
  • _var Is Nothing_ は、変数がSetから Nothing になったかどうかをテストしますが、オブジェクトではないもので試行するとエラーをスローします
  • IsObject(var) は、変数がオブジェクトかどうかをテストします(Falsevar の場合、明らかにEmptyを返します)。
26
Hannele

変数が宣言されているが初期化されていない場合、その値はEmptyになり、IsEmpty()関数で確認できます。

_Dim banners
If IsEmpty(banners) Then
    Response.Write "Yes"
Else
    Response.Write "No"
End If
' Should result in "Yes" being written
_

bannersは、その値を_Set banners = Nothing_で明示的に割り当てた場合にのみNothingと等しくなります。

ただし、_Option Explicit_をオンにすると、この手法で問題が発生します(これは推奨事項ですが、常にそうとは限りません)。その場合、bannersDimedになっておらず、IsEmpty(banners)をテストしようとすると、ランタイムエラーが発生します。 _Option Explicit_がオンになっていない場合、問題はないはずです。

編集:私はちょうどこれを見た 関連する質問と回答 も役立つかもしれません。

3

多少関連するのは、オプションのパラメーター(この場合はオブジェクト)が渡されたかどうかをテストするIsMissing()です:

Sub FooBar(Optional oDoc As Object)

    'if parameter is missing then simulate it
    If IsMissing(oDoc) Then Dim oDoc as Object: oDoc = something

...
0
Elliptical view

すべてのページに少なくともdim bannersが必要です。

すべてのページにhead.aspまたは何かが含まれていませんか?

0
Eduardo Molteni

IsEmpty、Is Object、IsNullはどちらも「Option Explicit」設定では機能しません。上記のstealthyninjaが誤解を招くように答えているためです。私が知っている唯一の方法は、「Option Explicit」を「On Error Resume Next」設定で「ハッキング」することです、Tristan Havelickはここでうまくやっています: VBScript関数が定義済み?

0
devplayer