エクセルのマクロでクラスのプロパティについて

このQ&Aのポイント
  • エクセルのマクロでセルがダブルクリックされたらフォームを表示し、リストボックスのクリック時の値をクラスのプロパティに実装できるのか?
  • 以前、仕事でそのようなクラスを呼び出して使ったことがある。
  • フォーム側のListBox1_Clickでどうすれば良いか分からず、解決方法を探している。
回答を見る
  • ベストアンサー

エクセルのマクロでクラスのプロパティについて

エクセルでセルがダブルクリックされたら フォームを表示し、フォーム内のリストボックス のクリック時の値をクラスのプロパティに実装 できるのでしょうか? 以前、仕事でそのようなクラスを呼び出して 使ったことがあるので。 エクセル側 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim cls As New Class1 ' cls.ListSet ' End Sub ↑フォームの表示まで クラスモジュール Option Explicit Public listVal As String Public Function ListSet() As Boolean ' On Error GoTo ErrFunc ' ListSet = True ' With UserForm1 With .ListBox1 .AddItem "a" .AddItem "b" .AddItem "c" End With ' .Show ' End With ' Exit Function ' ErrFunc: ListSet = False End Function Public Property Let val(ByVal data As String) listVal = data End Property Public Property Get val() As String val = listVal End Property フォーム側のListBox1_Clickで どうすればよいか分からなくなりました。 根本的に間違っているのでしょうか? ネットでさがしたのですが参考になる サイトが見つかりません。 解決方法、宜しくお願い致します。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

WithEvents宣言で コンボボックスをクラスモジュールに宣言して Private WithEvents oCombo as CobBox ListSetメソッドで Set oCombo = UserForm1.ComboBo1 を実行 このオブジェクトのChangeイベントで if oCombo.MatchFound then   ' コンボボックスのテキストとリスト項目が一致した場合   ' プロパティを変更   val = oCombo.Text end if といった具合にしてはいかがでしょう

sendaitaro
質問者

お礼

有難うございました。(_ _) 一発でできました。 大変参考になりました。

関連するQ&A

  • プロパティについて

    長年他の言語をやってきまして、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

  • VB6.0のクラスで、自分自身のインスタンスを作成するメリット

    クラスのメソッドで、自分自身のインスタンスを作成している、コードをよく見かけます。 どんなメリットがるのでしょうか? 簡単に、クラスファイルのコードを書きました。 【A.cls】 Option Explicit Dim pstrID As Long Dim pstrName As String Public Function fncCreate() As Object     Set fncCreate = New clsA  '★自分自身のインスタンスを作成する End Function Public Function fncID() As Boolean     pstrName = "ID" End Function Public Function fncName() As Boolean     pstrName = "STRING" End Function Private Sub Class_Initialize()     pstrID = 0     pstrName = "" End Sub

  • プロパティープロシージャーについて

    簡単な年齢計算プログラムです。 書籍のサンプルなのでうまく動いています。 クラスの変数がPrivate strnameだったりするので そこへアクセスするためにプロパティプロシージャーを使っているというところまでは 判ったような気がしますが、 getとsetの関係がわかりません。 まず、 1.何をGetしているのか 2.なぜGetが先に来るのか、 3.Setの前にGetのReturnで返してますが実態は何を返しているのでしょうか?普通に考えると逆のような気がします。 根本がわかっていないのだと思いますが、どなたかお教え願います。 呼ぶ方 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim person As New Class1() person.Name = TextBox1.Text person.Birthday = DateTimePicker1.Value.Date MessageBox.Show(person.Name & "さんの年齢は" & person.GetAge()) End Sub クラスの方。 Public Class Class1 Private strname As String Private datBirthday As Date Public Property Name() As String Get Return strname End Get Set(ByVal pro_name As String) strname = pro_name End Set End Property Public Property Birthday() As Date Get Return datBirthday End Get Set(ByVal pro_birthday As Date) datBirthday = pro_birthday End Set End Property Public Function GetAge() As Integer Return Int(DateTime.Today.Subtract(Birthday).Days / 365.25) End Function End Class

  • エクセルVBA ユーザーフォームのリストボックス

    エクセルVBAのユーザーフォームのリストボックスについて教えてください。 現在、以下のようにコードがされています。 Private Sub UserForm_Initialize() With UserForm.ListBox1 .AddItem "ABC" .AddItem "DEF" .AddItem "GHI" .ListIndex = 0 End With End Sub Private Sub ListBox1_Click() With ListBox2 .Clear Select Case UserForm.ListBox1.List(ListBox1.ListIndex) Case "ABC" .AddItem "123" .AddItem "456" .AddItem "789" Case "DEF" .AddItem "456" .AddItem "789" Case "GHI" .AddItem "789" End Select .ListIndex = 0 End With End Sub それで、ユーザーフォームを起動した時点で、ListBox1には"ABC"、ListBox2には"789"を選択し、青く色がついている状態にすることは可能でしょうか。 よろしくお願いします。

  • EXCELのマクロについて

    以下のプロシージャの内容が理解出来ません。 Public Sub test() test.show End Sub Public Function te2(ByVal Val1 As Single, Typ As String) As list シート1の名前.Activate draht=test.suchtest(Val1,Typ) End Function 不明点は以下の通りです。 ・「show」は何の操作か?(関数でしょうか?) ・また、「test」とは何を指すものか?  プロジェクト中には上記ステートメント以外で「test」の記載は  有りません。また、シート名ではなく、セル範囲の名前でも無い  ようです。何か他のものでしょうか? ・As list のlistとは何か?  関数のデータ型を記載する場所にユーザが付けたと思われる名前を記 載して何故マクロが動くのか? ・draht=test.suchtest(Val1,Typ)は何が異なるのか?

  • リストボックス

    すいません以下の処理に困っております。 リストボックスで値を取得して他のリストボックスにその値を 出力したいのですがまったくできません。 <例> リストボックス1 a b c リストボックス2(上で選択した値を出力) a ちなみに構文は、 ------------------------------------------------------------ Private Sub btn選択_Click() ListBox2.Text = ListBox1.Text 'ListBox1.ListIndex + 1 & ": " & ListBox1.Text End Sub Private Sub CommandButton1_Click() End Sub Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) btn選択_Click End Sub Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) btn選択_Click End Sub Private Sub UserForm_Initialize() With ListBox1 .AddItem "スケジューラ" .AddItem "データ変換" .AddItem "DWH Server" .AddItem "PPP Server" .AddItem "ファイヤーウォール" .AddItem "暗号オプション" End With End Sub ---------------------------------------------------- 初心者でまったくできません。 御教授をお願いします。

  • VBAクラスで、プロパティを使わずに、データを受け渡すには?

    はじめまして。 最近、クラスモジュールを使い始めたのですが、 別のクラスに、プロパティを使わずに、 データを受け渡すには、どうすればいいのでしょうか? たとえば、次の2つのクラスがあったとします。 (両方ともString型の読み取り専用のプロパティがある) 'クラスA Private m_Str_A as string Public Property Get Str_A() as String Str_A = m_Str_A End Property 'クラスB Private m_Str_B as string Public Property Get Str_B() as String Str_B = m_Str_B End Property ここで、クラスAで使用したm_Str_Aのデータを クラスBのm_Str_Bへ渡したいのですが、、、、。 別のプロパティを作ればいいだろうと考えたのですが、 それでは、値の変更が可能になってしまいます。 使用環境は、Excel2000 VBA、Windows2000です。 いろいろ調べてみたところ、他の言語か、VB.NETでない と無理そうなことが書かれていました。 仕事場では、他の言語は使用できないので、困ってます。 何か良い方法がありましたら、よろしくおねがいします。

  • ExcelのVBAについてです。

    Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) UserForm1.Show End Sub というコードで、シート上で右クリックしたら、ユーザーフォームを表示するようにしたんですが、ユーザーフォームを閉じると右クリックメニューが出てきます。これを出なくするにはどのようにしたらいいのでしょうか。教えてください。よろしくお願いします。

  • クラスの作成方法を教えてください

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1328191 標記の内容がわからなくうまくいきません 作成したいクラスの内容 ・CSVのデータ1行を表すクラス(CsvQueueクラスとする)  ・メンバー変数は、  その1行のデータとCsvQueueクラスへのポインタ。  データは面倒ならPublic。  ・メンバー関数は、  PutData()とGetData()。 CsvQueueクラス Public strCsvData1 As String Public strCsvData2 As String Public strCsvData3 As String Private queNextData As CsvQueue 初歩的な質問ではございますが、 作成方法を教えてくださいます様、よろしくお願いいたします 以下、参考::::::::::::::::::::: Public Function PutData(ByVal q As CsvQueue) As Boolean  If queNextData Is Nothing Then   Set queNextData = q   Exit Function  End If  PutData = queNextData.PutData(q) End Function Public Function GetData() As CsvData  GetData = queNextData End Function CSV出力モジュール内(追加した行を++で表している) Private csvRoot As CsvData ' Nothingに初期化 Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle  Do Until csvRoot Is Nothing   (中略と同内容)   csvRoot = csvRoot.GetData()  Loop (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output"  Dim csvTemp As New CsvData  csvTemp.strCsvData1 = ...  If csvRoot Is Nothing Then   Set csvRoot = csvTemp  Else   csvRoot.PutData(csvTemp)  End If End Sub

  • SerialPort処理でInvokeメソッドを使用するとエラーが発生。

    はじめまして。こんばんわ。 同一プロジェクトの複数のフォームから、RS232C接続処理を行っております。 まったく同じ処理内容なので、クラスを使用しようとしております。 しかし、データ受信時、Invokeメソッドを使用して、各フォームのイベントをCALLしますと、『InvalidOperationException』が発生し、『ウィンドウ ハンドルが作成される前、コントロールで Invoke または BeginInvoke を呼び出せません。』というエラーメッセージが表示されてしまいます。 ソースを下記に記載いたします。どなたか、原因・対処方法がわかる方がいらっしゃいましたら、御手数をおかけいたしますが、ご教示の程、よろしくお願い申し上げます。 ============================== 呼び出し元フォーム ============================== Public Class Form1   Private cls232CIns As cls232C   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     cls232CIns.openport()   End Sub   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     cls232CIns = New cls232C()   End Sub   Public Sub DispData(ByVal data As String)     TextBox1.Text = data   End Sub End Class ============================== SerialPort通信クラス ============================== Imports System.IO.Ports Public Class cls232C   WithEvents SP1 As SerialPort   Delegate Sub RecvDataDisp(ByVal dataR As String)   Public Sub New()     SP1 = New SerialPort("COM6", 9600)   End Sub   Public Sub openport()     SP1.Open()   End Sub   Public Sub closeport()     SP1.Close()   End Sub   Public Sub ReceiveData(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SP1.DataReceived     Dim getdata As String     getdata = SP1.ReadLine     Form1.Invoke(New RecvDataDisp(AddressOf Form1.DispData), getdata) ←ここでエラー発生   End Sub End Class