過去ログ

                                Page      60
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼InStrとLeftの変な違い  dew 02/10/9(水) 10:25
   ┗Re:InStrとInStrRevの変な違い  dew 02/10/9(水) 10:29
      ┗Re:InStrとInStrRevの変な違い  こうちゃん 02/10/9(水) 14:32
         ┗Re:InStrとInStrRevの変な違い  dew 02/10/9(水) 17:18

 ───────────────────────────────────────
 ■題名 : InStrとLeftの変な違い
 ■名前 : dew
 ■日付 : 02/10/9(水) 10:25
 -------------------------------------------------------------------------
   はじめまして。早速質問です。
Access2000 で、新規にデータベースを作成し、
新規作成したフォームに、VBAを起動するボタンと、
(表題ではなく)名前が「InStr」というラベルと、
(表題ではなく)名前が「InStrRev」というラベルを置きました。
そして、そのフォーム上のボタンで起動するVBAのコード内に、
a = InStr("12345", "3")
b = InStrRev("12345","3")
というメソッド呼び出しを書きました。
すると、InStrは実行されて、InStrRevは
「実行時エラー'438' オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
と出ました。上記のエラーは、InStrRevという名前のラベルがフォームにあって、それを先に
参照しているから(現にInStrRevという名前を変更すると動く)という説明ができますが、逆に
「なぜInStrは動いてしまうのか」という疑問があがりました。

参照設定などは全く変更しておりません(Access2000をインストールして、最初に新規作成
したものとお考えください)し、通常そのようなコードを書かない(予約語を安易に使用しない)ことも承知しております。

どなたか的確な回答をよろしくお願いします。

 ───────────────────────────────────────  ■題名 : Re:InStrとInStrRevの変な違い  ■名前 : dew  ■日付 : 02/10/9(水) 10:29  -------------------------------------------------------------------------
   ▼dew さん:
ごめんなさい。題名が「InStrとLeft-」となっていました。
現にLeftでも同現象が発生しますが、InStrとInStrRevのほうが
さらに説明がつかないと思い、内容を変更しましたが題名の変更を忘れていました。

 ───────────────────────────────────────  ■題名 : Re:InStrとInStrRevの変な違い  ■名前 : こうちゃん <nakajima19@hotmail.com>  ■日付 : 02/10/9(水) 14:32  -------------------------------------------------------------------------
   dewさん、こんにちは

基本的にコントロール名はVBAやAccessの予約語と同じにするのは避けるべきだとおものですが、それを承知の上で挙動の規則性を知りたい、ってことなのでしょうか?
どうも「要素とその名前が重複していないことを確認してください。名前が重複すると、データベースが予期しない動作を示す場合があります。」ってことになっているようです。
MSに聞けば「仕様」ってことになると思います。
以下はHELP(「フィールド、コントロール、およびオブジェクトの名前について」)からの抜粋を示します。

AccessのHELPの抜粋
--------------------------------------------------------------------------
フィールド、コントロール、およびオブジェクトの名前を決める際は、Access が使用するプロパティまたはその他の要素とその名前が重複していないことを確認してください。名前が重複すると、データベースが予期しない動作を示す場合があります。たとえば、NameInfo テーブルの Name フィールドを NameInfo.Name という構文で参照しようとすると、Name フィールドの値ではなく、"Name/名前" プロパティの値が取得されます。

予期しない結果を避けるもう 1 つの方法は、フィールド、コントロール、およびオブジェクトを参照するときに、常にドット (.) 演算子の代わりに ! 演算子を使用することです。たとえば、次の式は、"Name/名前" プロパティの値ではなく、Name フィールドの値を明示的に参照します。

[NameInfo]![Name]
--------------------------------------------------------------------------

禁止はされていませんから、使用する場合は「親」を明示的に示す必要があるでしょうね。

EX:
フォームのコントロールの場合
b = Me!InStrRev

関数の場合
b = VBA.Strings.InStrRev("12345", "3")

 ───────────────────────────────────────  ■題名 : Re:InStrとInStrRevの変な違い  ■名前 : dew  ■日付 : 02/10/9(水) 17:18  -------------------------------------------------------------------------
   こうちゃん さま、回答ありがとうございます。
>基本的にコントロール名はVBAやAccessの予約語と同じにするのは避けるべきだとおものですが、それを承知の上で挙動の規則性を知りたい、ってことなのでしょうか?

そうですね。
ある利用者から質問をされて、「これだから悪い」と納得のいく説明ができるようにと、質問をさせていただきました。

>どうも「要素とその名前が重複していないことを確認してください。名前が重複すると、データベースが予期しない動作を示す場合があります。」ってことになっているようです。
>MSに聞けば「仕様」ってことになると思います。

やはり「仕様」ですか・・・私は実はJava利用者なのですが、このあたりがきっちり説明でき
ないと気持ち悪いですね。

>以下はHELP(「フィールド、コントロール、およびオブジェクトの名前について」)からの抜粋を示します。
>(略)
>禁止はされていませんから、使用する場合は「親」を明示的に示す必要があるでしょうね。

そうですね。そのとおりだと思います。
でも動くなら動く、動かないなら絶対動かないという
振る舞いをしてほしいものです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 60