• ベストアンサー
  • 困ってます

整数の引数に列挙を使ったとき

 下記のサンプルコードでVB2003のときは警告が出なかったのですが、VB2008では警告が出ます。(注!インデントに全角スペース使用) Private aryNames(5) As String Private Enum enmItem As Integer  eName1 = 0  eName2  eName3 End Enum Private Sub Form1_Load(…  Dim i As Integer  Dim en As enmItem  '列挙を使って代入する  Item(en.eName2) = "DATA2"  Item(en.eName3) = "DATA3"  Item(en.eName1) = "DATA1"  'リストボックスで確認  For i = 0 To 2   ListBox1.Items.Add(aryNames(i))  Next End Sub Private Property Item(ByVal idx As Integer) As String  Get   Return aryNames(idx)  End Get  Set(ByVal Value As String)   aryNames(idx) = Value  End Set End Property 警告 使用されないローカル変数'en'です。 インスタンスを経由する共有メンバ、定数メンバ、列挙型メンバ、または入れ子にされた型へのアクセスです。正規の式は評価されません。  いちおう警告だけで期待通りの動きはするのですが、そんなに不正なコーディングでもないのに警告がでるのはうっとうしいです。  かといて警告オプション・・・  未使用のローカル変数 なし  共有メンバにアクセスするインスタンス変数 なし ・・・とするのも何だかなあ~ て感じです。  これは、安全なコーディングのため仕様が変わったせいなのでしょうか。 警告オプションをそのままに、上記の警告が出ないようにできないものでしょうか。 以上、よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1884
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

根本的な話として、変数 en は不要です。 列挙体の内容を使用する際に、そのインスタンスは不要です。 列挙体は、ある意味 定数みたいなものなので。 プロパティ定義の引数とかで使用する場合は、変数としての定義は 必要ですが。 > Dim en As enmItem の行を消して、 > Item(en.eName2) = "DATA2" > Item(en.eName3) = "DATA3" > Item(en.eName1) = "DATA1" を、  Item(enmItem.eName2) = "DATA2"  Item(enmItem.eName3) = "DATA3"  Item(enmItem.eName1) = "DATA1" に変更してみてください。 少なくともVS2005では、これで警告が出なくなります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

すばやい回答ありがとうございます。 >そのインスタンスは不要です。 さっそくソースを変更したら、警告はでなくなりました。 ところで、列挙をインスタンス化した目的は長い名前を短くしたかったこともありました。 実際にはこんな感じになりました。 mSpec.Item(enmMySpecItemDat.eDataName) = Me.tbxDataName.Text mSpec.Item(enmMySpecItemDat.eWorkName) = Me.tbxWorkName.Text ... まあ、「コピペ」するのでそんな手間でもないんですが~。

関連するQ&A

  • プロパティを通さなければアクセスできない変数を設定したい(VB2005)

    下記はメンバ変数とプロパティのコードです。 -------------------------------------- 'メンバ変数 Private _hoge As Integer = 1 'プロパティ Private ReadOnly Property phoge()   Get     Return _hoge   End Get End Property -------------------------------------- 上記の構造だと、同じクラス内であれば、下記のようにメンバ変数へプロパティを通さずアクセスが可能です。 Private Sub aaa()   MessageBox.Show(_hoge)   ' 1 と表示される(ここでエラーを出したい) End Sub 質問内容は、変数_hogeに対してアクセスするには、(同じクラス内からのアクセスであっても)プロパティを通さなければならない形にしたい、というものです。 つまり、下記のような形でないとエラーが発生するようにしたいと考えています。 Private Sub aaa()   Dim foo As Integer = phoge()   MessageBox.Show(foo) End Sub どうぞよろしくお願い致します。

  • プロパティのアクセス修飾子

    オート・インプリメント・プロパティで、 Property Prop2 As String = "Empty" と書いた場合の、Propertyのアクセス修飾子はPublicになるのでしょうか? あるVBの記述で、 Private CurrentValue As Integer Private Property Current As Integer Get Return CurrentValue End Get Set(ByVal value As Integer) CurrentValue = value    その他諸々の記述   End Set End Property というのがあるのですが、外部から、 Current += 1 などのようにアクセスしています。 この場合、Property Current As Integer のアクセス修飾子がPrivateになっているのですが、 Public とした場合と何が違うのでしょうか? ちなみに両方でやってみましたが、動作は変わりませんでした。 御経験のある方、御教示願えたらと思います。

  • オブジェクトモジュールにメンバーの追加(エクセルVBA)

    エクセルのVBAで、オブジェクトモジュールに(クラスの?)メンバーを追加したいと考えています。(そんな使い方すべきでないとの意見もありそうな問題ですが・・?) Thisworkbookのモジュールに次のコードを書いてみたのですが、test_bookを動かすと(1)~(3)は問題ないのですが、(4)がエラーになります。(自動メンバー表示もされません。且つ、???に何を入れればいいのか?判りません) で、質問ですが、オブジェクトモジュールに、プロパティ、メゾッドは追加できるのでしょうか?追加したプロパティ、メゾッドは、自動メンバー表示に加えることが出来るのでしょうか?その時は、やはり、Enum を使うのでしょうか?ご指導のほどよろしくお願い致します。 Private enum ?? ???? End Enum dim ??? as ??? Sub test_book()   MsgBox Name & FullName & FolderName  '(1) MsgBox ThisWorkbook.Name & _      TisWorkbook.FullName       '(2) MsgBox Me.Name & Me.FullName      '(3) MsgBox Name & FullName & _      ThisWorkbook.FolderName      '(4) End Sub Private Property Get FolderName() As String FolderName = "test"   '所属するフォルダー名を返すプロパティーを借りに想定して単に"test"を返して実験してみました。実際にやりたいことは、別にあります。 End Property 具体的に何をやりたいのかを明示できなくてすみません。宜しくお願い致します。

  • 配列を引数で渡したりするには?

    初心者なので困っています。配列をほかのサブルーチンへ渡して、その中で配列の値を書き換えて、上層のルーチンへ渡すにはどうしたらよいのでしょうか? 初心者なので、みなまさまのお知恵を拝借させてください。よろしくお願いします。 Private Sub Print() Dim C_ALL(3) As Integer Dim D_ALL(3) As Integer Data_Set(C_ALL(), D_ALL()) MsgBox(C_ALL() & " " & D_ALL()) '配列内容すべて表示 End Sub Private Sub Data_set(ByRef C_ALL As Integer, ByRef D_ALL As Integer) Dim i As Integer For i = 0 To 4 C_ALL(i) += i D_ALL(i) += i i += 1 Next End Sub

  • VBのfunctionの引数について

    2の Double型と 3の Single型のように送る側と受け取る側の変数の型が 違ってもよいのでしょうか?プログラムはそのまま実行できたのですが・・・・。 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim koku As Integer Dim san As Integer Dim rika As Integer Dim ave As Double------------------------------------1 koku = Val(TextBox1.Text) san = Val(TextBox2.Text) rika = Val(TextBox3.Text) ave = (koku + san + rika) / 3 Label5.Text = Round(ave)-------------------------------2 End Sub Private Function Round(ByVal sngvalue As Single-----3) As Integer Dim intvalue As Integer intvalue = Int(sngvalue + 0.5) Return intvalue End Function End Class

  • VB.NETで出来てC#で出来ない???

    VB.NETでは出来るのにC#で同じようにするやり方がわからなくて困っています。 VSのバージョンは2008です。 やりたいことは 『param.Item("AAA") = "111"』 このように書けるクラスを作りたいのですが、 VBで出来てC#では出来ないのでしょうか? イメージとしてはプロパティにメソッドをくっつけたようなクラス? C#ではこのように書くとエラーになります。 どのようにしたらいいでしょうか? public string Item(string Key) {  set { _param[Key] = value; } } VB Dim param As New Param() param.Item("AAA") = "111" ----Paramクラス---- Imports System.Text Public Class Param Private _Hash As New Hashtable Default Public Property Item(ByVal Key As String) As String Get Return _Hash(Key) End Get Set(ByVal value As String) _Hash(Key) = value End Set End Property End Class ---------

  • 整数→文字列の置換

    VB6の質問です。 ↓例で、REC変数を文字列の扱い(整数→文字列)にする方法はございますか? 宣言時の変数タイプは、変更したくありません。 宜しくお願いいたします。 Dim REC As Integer Private Sub test() As Integer  ・  ・  ・  ・ REC = '←処理結果をRECに入れる。RECには、文字列が挿入されます。 End Sub

  • VBAでクラス設定

    (標準モジュール) Option Explicit Sub test() Dim Class As Class1 Set Class = New Class1 Class.Obj = 1000 Set Class = Nothing Set Class = New Class1 Range("a1").Value = Class.Obj Set Class = Nothing End Sub (クラスモジュールClass1) Option Explicit Private a As Integer Public Property Get Obj() As Integer Obj = 2000 End Property Public Property Let Obj(ByVal NewNumber As Integer) a = NewNumber End Property 上のマクロではやり取り1変数になってますがこれを配列に変えたいのですがどうすればいいでしょうか?

  • 関数の引数に複数のユーザ定義型変数を使いたい

    一つの関数の一つのパラメータが異なるユーザ定義型を受けられるようにしたいのですが、どのようにすればいいのでしょうか? Public Type TypeA strCodeA As String intNumA As Integer End Type Public Type TypeB strCodeB As String intNumB As Integer End Type Public Function funcTest(arg1 As Variant) As Integer (略) End Function と記述して関数を Dim datA As TypeA iResult = funcTest(datA) と呼び出そうとすると、次のようなエラーメッセージが表示されて進みません。 コンパイルエラー: パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。

  • プロパティについて

    長年他の言語をやってきまして、VB.NETでピンと来ていない点があります。どなたかご教授ください。 あるクラスのプロパティとセッターゲッターについて2通りの 書き方ができると思っています。 以下の1、2の違いはありますでしょうか?入門書やネット上を検索 すると1の例で記述されますが、経験上2のような書き方をしてしまうため気になっております。 1. Private _hoge As Integer = 0 Public Property Hoge() As Integer  Get   Return _hoge  End Get  Set(ByVal Value)   _hoge = Value  End Set End Property 2. Private _hoge As Integer = 0 Public Function getHoge() As Integer  Return _hoge End Function Public Sub setHoge(ByVal val As Integr)  _hoge = val End Sub