Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1482 / 13644 ツリー ←次へ | 前へ→

【74101】テキストボックスの表示 taro 13/4/18(木) 6:37 質問[未読]
【74102】Re:テキストボックスの表示 ichinose 13/4/18(木) 7:09 発言[未読]
【74124】Re:テキストボックスの表示 taro 13/4/19(金) 18:40 質問[未読]
【74147】Re:テキストボックスの表示 ichinose 13/4/21(日) 20:04 発言[未読]

【74101】テキストボックスの表示
質問  taro  - 13/4/18(木) 6:37 -

引用なし
パスワード
   おはようございます。

テキストボックスの表示方法について悩んでおります。

シート2上に入力した数値 仮にA1セルに1、B2セルに2が入力してあるとします。

それをシート1のA2をクリックしたときに【1】を、C1をクリックしたときに【2】を作成したユーザーフォーム上のテキストボックスを出現させ表示させたいのですがどうすればいいでしょうか。

【74102】Re:テキストボックスの表示
発言  ichinose  - 13/4/18(木) 7:09 -

引用なし
パスワード
   おはようございます
>
>テキストボックスの表示方法について悩んでおります。
>
>シート2上に入力した数値 仮にA1セルに1、B2セルに2が入力してあるとします。
>
>それをシート1のA2をクリックしたときに【1】を、C1をクリックしたときに【2】を作成したユーザーフォーム上のテキストボックスを出現させ表示させたいのですがどうすればいいでしょうか。
仮にユーザーフォーム名が UserForm1
そこに貼り付けられたテキストボックスをTextBox1とした場合、

本当は、

Userform1.Show(Worksheets("シート2").range("a1").value)

なんてパラメータで送ることができればよいですよね!!
でも、できないので・・・。

このUserForm1に独自のプロパティを作ってしまいましょう。


プロパティ名は、 SetTXt1

With userform1
  .SetTxt1=Worksheets("シート2").range("a1").value
  .Show
End with

こんな呼び出しが出来れば、何となく自分で作ったオブジェクトみたいですよね!!


UserForm1側は、

Option Explicit
Property Let SetTxt1(ByVal myvalue As Variant)
  TextBox1.Value = myvalue
End Property


このようにしておけばよいと思います。
尚、Userform1では、
UserForm_Initializeイベントが先に実行されますので、
その点だけ注意してください

【74124】Re:テキストボックスの表示
質問  taro  - 13/4/19(金) 18:40 -

引用なし
パスワード
   ▼ichinose さん:

ご親切にありがとうございます。

ただ、参考書を読みながらなんとか設定している程度のレベルなので、ご教授くださったコードをどこに設定すればよいのかわかりません。

【プロパティ名】とは【オブジェクト名】のことでよろしいのでしょうか。

大変申し訳ないのですが、ご指導願います。

【74147】Re:テキストボックスの表示
発言  ichinose  - 13/4/21(日) 20:04 -

引用なし
パスワード
   こんばんは。
>テキストボックスの表示方法について悩んでおります。
↑これがご質問の主題だと思っていました。
よって、そのプログラムは、ユーザーフォームというオブジェクトのモジュール内に
SetTXt1というインターフェース(プロパティ)を追加してテキストボックスにデータを設定すればよい という投稿でした。インターフェースも

>With userform1
>  .SetTxt1=Worksheets("シート2").range("a1").value
>  .Show
>End with

↑このような使用方法で と記述しました。

>【プロパティ名】とは【オブジェクト名】のことでよろしいのでしょうか。
違います。Excel/VBAは、主にExcelをオブジェクトというユニットに分けられ、
そのオブジェクトを操作することでプログラムを作成します。
それぞれのオブジェクトは、プロパティとメソッドという手続き(インターフェース)を
使って、操作します。

例えば、
  Range(“A1”).Value=123
は、RangeオブジェクトのValueプロパティを使って、セルA1に値123を設定しています。

又、
  Range("A1").Copy Range("B1")
は、RangeオブジェクトのCopyメソッドを使って、セルA1をコピーし、セルB1に貼り付けています。

プロパティは、主にオブジェクトの性質を指定したり、取得するインターフェース、
メソッドは、オブジェクトの動作を指定するインターフェースですが、実際には、プログラムの書式の指定によるところはあり、プロパティとメソッドの位置付けがあいまいなものもあります。

で、今回の対象のオブジェクトは、テキストボックス(仮にTextBox1)を貼り付けたユーザーフォーム(仮にUserForm1)ですね。つまり、taroさんは、UserForm1という独自オブジェクトを作成していることになります。そして、前回の投稿では、そのUserForm1という独自オブジェクトにSetTxt1 というプロパティを
独自に設定してみてはいかがですか? という提案でした。

例えば・・・・、新規ブックにユーザーフォーム(UserForm1)を作成してください。

このUserForm1には、テキストボックス(TextBox1)を一つ貼り付けてください。

このUserformのモジュール(この場所は、自分で調べてください)に

Option Explicit
Property Let SetTxt1(ByVal myvalue As Variant)
  TextBox1.Value = myvalue
End Property


次に標準モジュール(Module1)に

Option Explicit
Sub test()
  Range("a1").Value = "ichinose"
  With UserForm1
    .SetTxt1 = Range("a1").Value
    .Show
  End With
End Sub

標準モジュールの作成は、VBEにて、「挿入」----「標準モジュール」とクリックすれば作成されます。

以上ですが、UserForm1のモジュールに

Property Let SetTxt1(ByVal myvalue As Variant)
  TextBox1.Value = myvalue
End Property

というインターフェースを追加すれば、どのプログラムからも
  With UserForm1
    .SetTxt1 = Range("a1").Value
    .Show
  End With

という呼び出しを行えば、UserForm1のテキストボックスに指定されたデータを設定できるということです

分からないところは、ここだと思ったので上記の記述をしたのです。


>シート2上に入力した数値 仮にA1セルに1、B2セルに2が入力してあるとします。
>
>それをシート1のA2をクリックしたときに【1】を、C1をクリックしたときに【2】を作成したユーザーフォーム上のテキストボックスを出現させ表示させたいのですがどうすればいいでしょうか

この質問を二つのポイントに分けると、

1 シートをクリックしたときにプログラムを起動させる方法

2 テキストボックスに指定したデータを表示させる方法

です。

2については、記述した通りです。


1は・・・、

Excelのオブジェクトの中には、オペレータの操作をきっかけに作動するプログラムが用意されているものがあります。この操作をイベントと呼び、実行されるプログラムをイベントプロシジャーと呼んでいます。

セルをクリックした時のイベントはないので、セルをダブルクリックした時のイベントを利用してみてはいかがですか?

シート1のモジュールに以下のコードを記述してみてください
(シート1のモジュールは、シート1のタブにマウスを合わせ、その状態で右クリック---コードの表示 とクリックし、表示されたモジュールです)。


Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Address = Range("A1").Address Then
    MsgBox "A1がダブルクリックされました"
    Cancel = True
  ElseIf Target.Address = Range("C1").Address Then
    MsgBox "C1がダブルクリックされました"
    Cancel = True
  End If
End Sub

上記のコードは、セルA1をダブルクリックすれば、

「A1がダブルクリックされました」と表示し、C1をダブルクリックすれば、
「C1がダブルクリックされました」と表示するコードです。


これで1も解決ですよね!!


方法が分かれば、仕様に合わせて
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
というプロシジャーを修正してください。

1482 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free