|
【 定 義 】 |
|
標準 モジュールの宣言セクション(モジュールの先頭)で、下記のように定義します。
Public object As clsRangeSelection
このクラスオブジェクトは、必ず Public で宣言してください。
なお、宣言時に New キーワード を付けないでください。
OK Public object As clsRangeSelection
NG Public object As New clsRangeSelection
( object )
任意の名前を指定して下さい。
RefEdit 代替手法を利用する ユーザーフォーム を表示する前に、下記のようにしてクラスのインスタンスを
作成します。
Set object = New clsRangeSelection
※ 複数の ユーザーフォーム でこの機能を使う場合、個々の ユーザーフォーム ごとに クラスオブジェクトを
用意せず、1プロジェクト(ワークブック) にクラスオブジェクトは1つのみとし、複数のユーザーフォー
ム で共有するようにしてください(排他制御の判定の為)。
※ 通常は、StartUpブック(クラスオブジェクト作成時の ActiveWorkbook) が RefEdit 代替フォームで
選択可能なブックとなります。もし、ユーザーフォームのマクロ で アクティブブック を他の ブック に切り替え
たとしても、その ブック に対しては機能しません(選択セルは取り込まれません)。なお、シート
は切り替えは
可能です。
※ 上記StartUpブック 以外のブックのセル選択を行ないたい場合には、Show メソッドの[BookChange] にTrue
を指定します。
※ アドイン運用など、参照設定でクラスを利用している場合は、New キーワードを使わずに下記のようにします。
Set object =
CreateRangeSelectClass ( )
(CreateRangeSelectClass 関数は、mdlRangeSelection
モジュール に用意してあります)
|
|
【 メソッド 】 |
|
object .Show MsForms ユーザーフォーム オブジェクト , [ BookChange ]
RefEdit 代替手法の制御ルーチンを起動するメソッドです。ユーザーフォームは、このメソッド内から
表示されます(ユーザーサイドで UserForm1.Show 等とする必要はありません)。尚、この Show メソッド
を実行する前に ユーザーフォームを Load してください。
( 例 )
Set RefEditSupport = New clsRangeSelection
Load UserForm1
' 〜 UserForm1 の初期処理が必要な場合は、この場所、もしくは UserForm_Initialize に記述する 〜
RefEditSupport.Show UserForm1 , False
Set RefEditSupport = Nothing
( MsForms ユーザーフォーム オブジェクト )
RefEdit 代替手法を利用する ユーザーフォームオブジェクトを指定します。
( BookChange )
StartUpブック(クラスオブジェクト生成時点のActiveWorkbook )以外のブックへ切り替えを行
なってセル
選択を行なうか否かを指定します。
省略が可能です。
False : StartUpブックに対してのみセル選択可能です。(既定値)
True : StartUpブック以外のブックに切り替えてセル選択が可能です。
ブック切替機能を使用する場合、以下の点が変わります。
・RefEditフォームに『ブック切替コンボボックス』が表示されます。このコンボ ボックスでブックを切り替え
てからセルを選択します。
・セルアドレス表示にブック名が加わります(TargetAddr プロパティも同様)。
|
|
object .InitRefEdit RefEditLabel , RangeType
RefEdit 対象コントロール(選択したセルアドレスを表示するラベル)の初期設定を行なうメソッドです。
UserForm_Initialize 等で実行します。
[単一セル] のみ許すのか、[セル範囲] も可とするのかという制限を指定できます。
( 例 )
Private Sub UserForm_Initialize ()
With RefEditSupport
.InitRefEdit Me.lblRefEdit1
, 0 ‘ 複数セル範囲可
.InitRefEdit Me.lblRefEdit2
, 2 ‘ 単一セルのみ可
End With
( RefEditLabel )
RefEdit 対象コントロールオブジェクト(選択したセルアドレスを表示する ラベル) を指定し ます。
ラベル のみ指定できます。テキストボックスなどは指定できません。
( RangeType )
セルを選択する際の制限を指定します。
0 : 制限なし ( 複数セル範囲 or 単一セル範囲 or 単一セル
)
1 : 単一セル範囲 or 単一セル が可能
2 : 単一セル のみ可能
3 : 複数の単一セル が可能
なお、結合セルは1セル(結合セルの先頭セル) として扱います。
InitRefEdit メソッドで指定したRangeType属性はSetRefEdit メソッドで変更する事が可能です。
InitRefEdit/SetRefEdit メソッドにて設定したRangeType属性はTargetRangeプロパティでセル範囲を
設定する際の妥当性チェックにも使用されます([単一セルのみ可] としているコントロールに対して
セル範囲を設定しようとした場合など。この場合にはセル範囲の先頭セルのみが設定されます)。
|
|
object .SetRefEdit RefEditLabel , [ RangeType ]
RefEdit 対象コントロール(選択したセルアドレスを表示するラベル) を指定するメソッドです。
このメソッドの後で [ Me.Hide ] でフォームを閉じると、RefEdit 代替フォームが表示されます。
[単一セル] のみ許すのか、[セル範囲] も可とするのかという制限を指定できます。
( 例 )
Private Sub cmdRefEdit3_Click ()
RefEditSupport.SetRefEdit Me.lblRefEdit3
, 2 '単一セルのみ
Me.Hide
End Sub
セルアドレスは Excel のオプション設定にしたがって
"Sheet2!A1:B5" (A1形式) or "Sheet2!R1C1:R5C2" (R1C1形式)
の形式で表示されます。なお、ブック切替機能を有効にしている場合にはセルアドレスにブック名 が
付きます。
"[Book1.xls]Sheet2!A1:B5" (A1形式) or "[Book1.xls]Sheet2!R1C1:R5C2" (R1C1形式)
選択したセルが結合セルの場合には「結合セルの先頭セル」が取得されます(結合セルを含むセル範囲
の場合にはセル範囲全体が取得されます)。
( RefEditLabel )
RefEdit 対象コントロールオブジェクト(選択したセルアドレスを表示する ラベル) を指定します。
ラベル のみ指定できます。テキストボックスなどは指定できません。
( RangeType )
セルを選択する際の制限を指定します(省略が可能です)。実行の都度、変更しても構いません。
省略 : 前回の設定が継続。初回設定時は [ 0 ] と解釈します。
0 : 制限なし ( 複数セル範囲 or 単一セル範囲
or 単一セル )
1 : 単一セル範囲 or 単一セル が可能
2 : 単一セル のみ可能
3 : 複数の単一セル が可能
なお、結合セルは1セル(結合セルの先頭セル)として扱います。
InitRefEdit/SetRefEdit を一度も実行していないRefEdit 対象コントロールに対して、RangeType を
省略した場合(初回設定)には [0 :制限なし] となります。
|
|
object .Clear RefEditLabel
セル選択情報をクリアするメソッドです。クリアボタン押下 または RefEdit 対象コントロール(ラベル)
のマウスイベント等で実行してください。
指定した RefEdit 対象コントロール(選択したセルアドレスを表示するラベル)上に表示されている
セルアドレスを消去します。また、このメソッド実行後、指定した RefEdit 対象コントロールに対する
TargetRange プロパティは Nothing を返します。
TargetRange プロパティに Nothing を代入しても同じ効果が得られます。
( 例 )
Private Sub lblRefEdit1_MouseDown ( ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As
Single )
If ( Button = 2 ) And ( Shift
= 4 ) Then
' [ Alt + 右Click
] 操作でクリアする
RefEditSupport.Clear Me.lblRefEdit1
End If
End Sub
( RefEditLabel )
RefEdit 対象コントロールオブジェクト(選択したセルアドレスを表示する ラベル) を指定します。
ラベル のみ指定できます。テキストボックスなどは指定できません。
|
|
object .Terminate
RefEdit 利用フォーム の Terminateイベントで必ず実行してください。
クラスオブジェクト内からUserForm(コントロール)参照を完全に削除して、UnLoadを確実に行なえるように
する為に必要です。
|
|
object .EndRefEdit
[ frmRefEdit : QueryClose ] で RefEdit 終了通知(ループ停止指示) に使用しています。
【ユーザーサイド】では使用しません。
|
|
object .BookChange Index
[ frmRefEdit : cmbBook_Change ] で 対象ブック切替に使用しています。
【ユーザーサイド】では使用しません。
( Index )
ブック切替コンボボックスの ListIndex 値を指定します。
|
|
object .ReleaseBookReference Book
ブック切替機能を使用している場合に使用します(ブック切替機能を使用していない場合は 無効です)。
これから Close しようとしているブックのセルを選択している RefEdit 情報を 一括してクリアして、そのブック
へのオブジェクト参照を解放する為に使用します。 詳細は「ブック切替機能とブック参照の解放」 を参照し
てください。
( Book )
Workbookオブジェクトを指定します。
StartUpブック(クラスオブジェクト生成時点のActiveWorkbook)を指定した場合は無効です。
|
|
【 プロパティ 】 |
|
object .StartUpBook ( ) [ = Workbook ]
StartUpブック(クラスオブジェクト生成時のActiveWorkbook)のオブジェクトを取得します。
値の取得のみ可能です。
( 値の取得 )
StartUpブック(クラスオブジェクト生成時のActiveWorkbook)のオブジェクトを返します。
|
|
object .TargetRange ( RefEditLabel ) [ = Range ]
RefEdit ボタンから選択したセルの Range オブジェクトを取得します。逆に RefEdit ボタンへ Range
オブジェクト を設定する事もできます(RefEdit ラベル上への セルアドレス文字の設定も同時に行な
われます)。
値の取得/設定が可能です。
このプロパティを使うと、RefEdit コントロールの場合に必要だった 「セルアドレス文字 → Range オブ
ジェクト」 の変換処理(Evaluate 等による変換)が必要ありません。
Nothing を代入する操作は Clear メソッド と同じ効果です(RefEdit ラベルのセルアドレス文字は消去
されます)。
( RefEditLabel )
RefEdit 対象コントロールオブジェクト(選択したセルアドレスを表示する ラベル) を指定します。
ラベル のみ指定できます。テキストボックスなどは指定できません。
( 値の取得 )
指定の RefEdit 対象コントロールについて、セル選択済みの場合は、その Range オブジェクト を
返します。セル未選択の場合は Nothing を返します。
初期値(セル選択 or TargetRange (値の設定) を一度も行なっていない状態)は Nothing
です。
選択したセルが結合セルの場合には「結合セルの先頭セル」が取得されます(結合セルを含むセル
範囲の場合にはセル範囲全体が取得されます)。
( 値の設定 )
指定の RefEdit 対象コントロールに対して、Range オブジェクト を設定できます(その Range
オブ
ジェクト は、この TargetRange プロパティで再び取得できます)。Range オブジェクトのセルアドレス
文字が RefEdit ラベル に設定されます(Nothing を設定した場合は、消去になります)。
InitRefEdit/SetRefEdit にて設定したRangeType に合わないセル範囲を渡した場合には、RangeType
に沿うように渡されたセル範囲を整形してから設定されます。
例: RangeType = 2 (単一セルのみ可)と指定されているRefEdit対象コントロールに
「セル範囲」を渡した場合には、そのセル範囲の先頭セルだけが設定されます。
InitRefEdit/SetRefEdit を一度も実行していないRefEdit対象コントロールに対して、TargetRange
プロパ
ティでセル範囲(or 単一セル)を設定する場合には、そのRefEdit対象コントロールのRangeType
は
[0:制限なし] と見做されます。
ブック切替機能を使わない場合、そのRangeオブジェクトがStartUpブック(クラスオブジェクト
生成時の
ActiveWorkbook)と異なる時は無効です。
セルアドレス文字のフォーマット(A1形式 , R1C1形式)は Excel のオプションの設定に従います。
A1形式 : "Sheet2!B2:C5"
R1C1形式 : "Sheet2!R2C2:R5C3"
ブック切替機能を有効にしている場合には、セルアドレスにブック名が付きます。
A1形式 : "[Book1.xls]Sheet2!B2:C5"
R1C1形式 : "[Book1.xls]Sheet2!R2C2:R5C3"
|
|
object .TargetBook ( RefEditLabel ) [ = Workbook ]
RefEdit ボタンから選択したセルの Workbook オブジェクト を取得します。
値の取得のみ可能です。
( RefEditLabel )
RefEdit 対象コントロールオブジェクト(選択したセルアドレスを表示する ラベル) を指定します。
ラベル のみ指定できます。テキストボックスなどは指定できません。
( 値の取得 )
指定の RefEdit 対象コントロールについて、セル選択済みの場合は、そのセルの Workbook
オブジェクト を返します。セル未選択の場合は Nothing を返します。
初期値(セル選択 or TargetRange (値の設定) を一度も行なっていない状態)は Nothing
です。
|
|
object .TargetSheet ( RefEditLabel ) [ = Worksheet ]
RefEdit ボタンから選択したセルの Worksheet オブジェクトを取得します。
値の取得のみ可能です。
( RefEditLabel )
RefEdit 対象コントロールオブジェクト(選択したセルアドレスを表示する ラベル) を指定します。
ラベル のみ指定できます。テキストボックスなどは指定できません。
( 値の取得 )
指定の RefEdit 対象コントロールについて、セル選択済みの場合は、そのセルの Worksheet
オブジェクト を返します。セル未選択の場合は Nothing を返します。
初期値(セル選択 or TargetRange (値の設定) を一度も行なっていない状態)は Nothing
です。
|
|
object .TargetAddr ( RefEditLabel , [ ReferenceStyle ] , [ CellOnly ] ) [ = String ]
RefEdit ボタンから選択したセルの セルアドレス文字 を取得します。
値の取得のみ可能です。
( RefEditLabel )
RefEdit 対象コントロールオブジェクト(選択したセルアドレスを表示する ラベル) を指定します。
ラベル のみ指定できます。テキストボックスなどは指定できません。
( ReferenceStyle )
セルアドレスの編集形式(A1形式/R1C1形式)を xlA1 または xlR1C1 で指定します。
省略可能です。省略した場合は Excel のオプション設定に従います。
( CellOnly )
セルアドレスにブック名/シート名を含めるか否かを指定します。 省略可能です。
False : ブック名/シート名を含めます。既定値。
True : ブック名/シート名を含めずに、セルアドレスのみの編集
( 値の取得 )
指定の RefEdit 対象コントロールについて、セル選択済みの場合は、そのセルのアドレスを文字列で
返します。セル未選択の場合は 空文字( "" ) を返します。
A1形式 : "Sheet2!B2:C5"
R1C1形式 : "Sheet2!R2C2:R5C3"
ブック切替機能を有効にしている場合には、セルアドレスにブック名が付きます。
A1形式 : "[Book1.xls]Sheet2!B2:C5"
R1C1形式 : "[Book1.xls]Sheet2!R2C2:R5C3"
CellOnly=Trueとした場合には、ブック名/シート名は付きません(セルアドレスのみ)。
初期値(セル選択 or TargetRange (値の設定) を一度も行なっていない状態)は 空文字
です。
|
|
object .ActivateInfo [ = String ]
UserForm_Activate イベント内で使用します。このプロパティには Activate イベントの発生理由が
文字列で返ります。値の取得のみ可能です。
※ この ActivateInfo プロパティは、値を一度取得すると、値が 空文字( "" ) に リセット されます。
したがって、Activate イベントの先頭で 変数に取り込み、その変数で処理を行ってください。
a) UserForm_Initialize イベント直後の Activate イベントでは "Initialize" の文字列が返ります。
b) RefEdit 入力から復帰する際にも、ユーザーフォームの再表示によって Activate イベントが発生
します。この場合には、RefEdit ラベルのオブジェクト名が返ります。
c) 上記以外の Activate イベントでは 空文字( "" ) が返ります。
・ 子フォームを表示し、その子フォームを閉じて戻って来た時(Excel2000(SR無)のみ)
・ RefEdit 処理以外で Hide した後に再表示した時
"Initialize" / 空文字( "" ) 以外の場合が、RefEdit 入力の AfterUpdate イベント に相当します。
RefEdit 項目が複数ある場合は、その項目名で分岐させてください。
( 値の取得 )
"Initialize" or RefEdit ラベルオブジェクト名 or 空文字("")
が 返ります。
|
|
object .RefEditActive ( ) [ = Boolean ]
RefEdit フォーム表示中(セル選択操作中) か否かの状態を取得します。
値の取得のみ可能です。
[ IsRefEditActive ] 関数内で使用しています。
【ユーザーサイド】 では使用しません。
( 値の取得 )
True : RefEdit フォーム表示中(セル選択操作中)
False : RefEdit フォームは表示されていない(利用元の ユーザーフォーム を表示中)
|
|
【 関 数 】 ( mdlRangeSelection に収録 ) |
|
IsRefEditActive ( object , [ Type ] ) [ = Boolean ]
RefEdit 代替手法によるユーザーフォーム処理が実行中か否かの状態を返します( clsRangeSelection
クラス
オブジェクトのインスタンス作成済か否か )。
[ Type = True ] とすると、範囲を狭めて『RefEdit フォーム表示中(セル選択操作中) か否か』の状態を返します。
この関数の使用目的については前述 『RefEdit 代替手法を利用する際に排他制御が必要な理由』 を参照。
Type 引数の使い分けは以下のようにしてください。
(1) RefEdit 代替手法を利用する プロシジャー
[ Type = False ] として RefEdit
代替手法の重複実行 ( clsRangeSelection クラスオブジェクトの
バッティング ) を回避します。
(2) 上記(1)以外の Sub プロシジャー で、メニュー登録されているもの/[マクロの実行] から呼出し可能なもの
[ Type = True ] として、セル選択操作中
( RefEdit フォーム 表示中 ) に メニュー から実行
されないようにします。
(3) 上記(1)(2)以外の プロシジャー
IsRefEditActive 関数による排他制御処理の組み込みは必要ありません。
( object )
clsRangeSelection クラスのオブジェクト変数 を指定します。
この排他制御管理を行なう為に、clsRangeSelection クラスオブジェクト変数はプロジェクト(ブック)内に
ただ1つだけとしてください。複数の ユーザーフォーム で RefEdit 代替手法を利用する場合、その1つ
の オブジェクト変数を共用して使用するようにしてください。
( Type )
省略 or False : RefEdit 代替手法を利用する プロシジャー が実行中か否かの状態
True : RefEdit フォーム表示中(セル選択操作中) か否かの状態
( 返却値 )
Type = False の場合
True : RefEdit 代替手法を利用する
プロシジャーが実行中
False : 上記以外(未実行状態)
Type = True の場合
True : RefEdit フォーム表示中
(セル選択操作中)
False : 上記以外
・ RefEdit 代替手法を利用する プロシジャー が実行中ではない
・ RefEdit フォームは表示されていない (利用元の ユーザーフォーム を表示中)
|
|
CreateRangeSelectClass ( ) [ = clsRangeSelection オブジェクト ]
VBA では外部の クラス の インスタンス(オブジェクト) を New キーワード によって生成する事ができません
ので、clsRangeSelection クラス を アドイン 運用する場合には、New キーワードの代わりに、この関数によって、
インスタンス(オブジェクト) を生成します。
Set object = CreateRangeselectClass ( )
RefEdit 代替手法を利用する ワークブック 内に clsRangeSelection クラスモジュール を 収録して使用する
場合には、この関数は必要ありません。
補: クラス を アドイン 運用する場合には、clsRangeSelection クラスモジュール の [ Instancing
] プロパティ
を 【 PublicNotCreatable 】 とする必要があります。
( 返却値 )
clsRangeSelection クラス の 新規インスタンス (オブジェクト) を作成して返します。
|
|
【 利 用 例 】 |
|
'==== 標準モジュール(Sample) ====
'RefEdit制御クラスオブジェクト(Public),プロジェクト内で共有して使用する
Public RefEditSupport As clsRangeSelection
'----------------------------------------------------------
Sub Test_RefEdit_1()
'===================================================================
' RefEdit入力中(モードレス)はメニュー操作も可能になります。その為、
' ・[メニュー/マクロの実行]から[Public]マクロの実行
' ・コマンドメニュー/右クリックメニューに登録されたマクロの実行
' が可能な状態になっています。そこで、安全性の面から上記のマクロ等
' が起動しないように、以下のように排他制御を行なってください。
If IsRefEditActive(RefEditSupport, False) Then
Beep
Exit Sub
End If
'===================================================================
'StartUpブック:[クラスオブジェクト作成時のActiveWorkbook]
Set RefEditSupport = New clsRangeSelection
Load UserForm1 '[UserForm1.Show]は使用しない
'〜 UserForm1の初期処理が必要な場合は、この場所か、UserForm_Initialize に記述する 〜
With UserForm1
.Caption = "RefEdit 代替テスト(ブック切替 無)"
.cmdBook1Open.Enabled = False
.cmdBook2Open.Enabled = False
End With
'UserForm表示とRefEdit処理の制御
'[BookChange=False] : StartUpブックのみRefEditでセル選択可
RefEditSupport.Show UserForm1, False
Set RefEditSupport = Nothing
End Sub
'----------------------------------------------------------
Sub Test_RefEdit_1_BookChange()
If IsRefEditActive(RefEditSupport, False) Then
Beep
Exit Sub
End If
Set RefEditSupport = New clsRangeSelection
Load UserForm1
With UserForm1
.Caption = "RefEdit 代替テスト(ブック切替 有)"
.cmdBook1Open.Enabled = True
.cmdBook2Open.Enabled = True
End With
'[BookChange=True] : StartUpブック以外もRefEditでセル選択可
RefEditSupport.Show UserForm1, True
Set RefEditSupport = Nothing
End Sub
'--------------------------------------------------------------
'RefEditSupport を使用するマクロはRefEditSupportの有無で判断
'
'Sub Test_RefEdit_2()
' If IsRefEditActive(RefEditSupport, False) Then
' Beep
' Exit Sub
' End If
'
' Set RefEditSupport = New clsRangeSelection
' Load UserForm2
' RefEditSupport.Show UserForm2, False
' Set RefEditSupport = Nothing
'End Sub
'--------------------------------------------------------------
'RefEditSupport を使用しないマクロはRefEditフォームの入力中か否かで判断
'
'Sub Test_Other()
' If IsRefEditActive(RefEditSupport, True) Then
' Beep
' Exit Sub
' End If
'
' UserForm3.Show
'End Sub
'--------------------------------------------------------------
' ※ アドイン運用など、別ブックから参照設定して利用する場合 ※
' (1) clsRangeSelectionのInstancingプロパティを"PublicNotCreatable"にする。
' (2) [ Set RefEditSupport = New clsRangeSelection ] の代わりに
' インスタンス作成関数を使って
' Set RefEditSupport = CreateRangeSelectClass
' としてインスタンスを作成する。
'==== UserForm1 モジュール ====
Private Wkbk1 As Workbook 'New Book[1]
Private Wkbk2 As Workbook 'New Book[2]
'----------------------------------------------------------
Private Sub UserForm_Initialize()
' [InitRefEdit] メソッド
' arg1: 呼出元Label(選択セル範囲のアドレス文字を受取ります)
' arg2: 0(複数セル範囲可,既定値), 1(単一セル範囲可), 2(単一セルのみ), 3(1つ以上の単一セル)
With RefEditSupport
.InitRefEdit Me.lblRefEdit1, 0 '複数セル範囲可
.InitRefEdit Me.lblRefEdit2, 1 '単一セル範囲可
.InitRefEdit Me.lblRefEdit3, 2 '単一セルのみ
.InitRefEdit Me.lblRefEdit4, 3 '1つ以上の単一セル
End With
End Sub
'----------------------------------------------------------
Private Sub UserForm_Activate()
Dim strActivateInfo As String
'ActivateInfoプロパティの取得は1回のみ有効です(取得後は空文字にリセットされる)。
'直接参照せずに変数に取り出してから利用します。
strActivateInfo = RefEditSupport.ActivateInfo
Select Case strActivateInfo
Case ""
'[RefEdit呼出]以外で Hide した後に再表示した場合は空文字です。
'その際のActivateイベント処理は、ここに記述します。
Case "Initialize"
'Initializeイベント直後のActivateイベント処理は、ここに記述します。
Case Else
'RefEditからの復帰イベント処理は、ここに記述します。
'(AfterUpdate イベントの代替になります)
'[ActiveInfo]には RefEdit代替Label名が入っているので、
'複数のRefEdit使用時にはラベル名で分岐させます。
lblInfo.Caption = strActivateInfo & " から復帰"
End Select
End Sub
'----------------------------------------------------------
Private Sub UserForm_Terminate()
RefEditSupport.Terminate '※Terminateイベントで必ず実行する
End Sub
'----------------------------------------------------------
'============== RefEdit 呼び出し ===========================
'呼出元のRefEdit代替Labelを設定してHideすると、RefEditフォームが呼び出されます。
' [SetRefEdit] メソッド
' arg1: 呼出元Label(選択セル範囲のアドレス文字を受取ります)
' arg2: 0(複数セル範囲可), 1(単一セル範囲可), 2(単一セルのみ)),
3(1つ以上の単一セル)
' 省略時は[InitRefEdit]メソッドでの設定値で実行される。
' [SetRedEdit]メソッドにて[RangeType]の変更は可能。
Private Sub cmdRefEdit1_Click()
RefEditSupport.SetRefEdit Me.lblRefEdit1 '省略により [0]複数セル範囲可
Me.Hide
End Sub
'----------------------------------------------------------
Private Sub cmdRefEdit2_Click()
RefEditSupport.SetRefEdit Me.lblRefEdit2 '省略により [1]単一セル範囲可
Me.Hide
End Sub
'----------------------------------------------------------
Private Sub cmdRefEdit3_Click()
RefEditSupport.SetRefEdit Me.lblRefEdit3 '省略により [2]単一セルのみ
Me.Hide
End Sub
'----------------------------------------------------------
Private Sub cmdRefEdit4_Click()
RefEditSupport.SetRefEdit Me.lblRefEdit4 '省略により [3]複数の単一セル可
Me.Hide
End Sub
'----------------------------------------------------------
'===========================================================
'入力内容をクリアする場合は、クリアボタン もしくは ラベルの
'マウスイベント等で Clear メソッドを実行します。
Private Sub lblRefEdit1_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If (Button = 2) And (Shift = 4) Then
'[Alt+右Click]操作でクリアする
RefEditSupport.Clear Me.lblRefEdit1
'下記でも同じクリア操作になります
'[ RefEditSupport.TargetRange(Me.lblRefEdit1) = Nothing ]
End If
End Sub
'----------------------------------------------------------
Private Sub lblRefEdit2_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If (Button = 2) And (Shift = 4) Then
RefEditSupport.Clear Me.lblRefEdit2
End If
End Sub
'----------------------------------------------------------
Private Sub lblRefEdit3_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If (Button = 2) And (Shift = 4) Then
RefEditSupport.Clear Me.lblRefEdit3
End If
End Sub
'----------------------------------------------------------
Private Sub lblRefEdit4_MouseDown(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If (Button = 2) And (Shift = 4) Then
RefEditSupport.Clear Me.lblRefEdit4
End If
End Sub
'----------------------------------------------------------
'===========================================================
' RefEdit入力後には[TargetRange]プロパティで Range オブジェクトを取得できます。
' [TagetRange] プロパティ
' arg1: 呼出元Label を指定します
Private Sub cmdMsgBox1_Click()
Dim rngSelect As Range
Set rngSelect = RefEditSupport.TargetRange(Me.lblRefEdit1)
If (rngSelect Is Nothing) Then
MsgBox "Nothing"
Else
MsgBox rngSelect.Parent.Parent.Name & vbCrLf & _
rngSelect.Parent.Name & vbCrLf & _
rngSelect.Address(False, False)
' TargetBook/TargetSheetプロパティでも Book/Sheetオブジェクトを取得できます。
' TargetAddrプロパティでも セルアドレス文字を取得できます。
' MsgBox RefEditSupport.TargetBook(Me.lblRefEdit1).Name & vbCrLf & _
' RefEditSupport.TargetSheet(Me.lblRefEdit1).Name & vbCrLf & _
' RefEditSupport.TargetAddr(Me.lblRefEdit1, xlA1, True)
End If
End Sub
'----------------------------------------------------------
Private Sub cmdMsgBox2_Click()
Dim rngSelect As Range
Set rngSelect = RefEditSupport.TargetRange(Me.lblRefEdit2)
If (rngSelect Is Nothing) Then
MsgBox "Nothing"
Else
MsgBox rngSelect.Parent.Parent.Name & vbCrLf & _
rngSelect.Parent.Name & vbCrLf & _
rngSelect.Address(False, False)
End If
End Sub
'----------------------------------------------------------
Private Sub cmdMsgBox3_Click()
Dim rngSelect As Range
Set rngSelect = RefEditSupport.TargetRange(Me.lblRefEdit3)
If (rngSelect Is Nothing) Then
MsgBox "Nothing"
Else
MsgBox rngSelect.Parent.Parent.Name & vbCrLf & _
rngSelect.Parent.Name & vbCrLf & _
rngSelect.Address(False, False)
End If
End Sub
'----------------------------------------------------------
Private Sub cmdMsgBox4_Click()
Dim rngSelect As Range
Set rngSelect = RefEditSupport.TargetRange(Me.lblRefEdit4)
If (rngSelect Is Nothing) Then
MsgBox "Nothing"
Else
MsgBox rngSelect.Parent.Parent.Name & vbCrLf & _
rngSelect.Parent.Name & vbCrLf & _
rngSelect.Address(False, False)
End If
End Sub
'----------------------------------------------------------
Private Sub cmdBook1Open_Click()
If (Wkbk1 Is Nothing) Then
'Book[1] Open
Set Wkbk1 = Workbooks.Add
cmdBook1Open.Caption = "Close"
cmdBook1Open.ForeColor = vbRed
Else
'Book[1] Close , Closeする前にBook[1]のセル選択を全て解放する
RefEditSupport.ReleaseBookReference Wkbk1
Wkbk1.Close SaveChanges:=False
Set Wkbk1 = Nothing
cmdBook1Open.Caption = "Open"
cmdBook1Open.ForeColor = vbBlack
End If
End Sub
'----------------------------------------------------------
Private Sub cmdBook2Open_Click()
If (Wkbk2 Is Nothing) Then
'Book[2] Open
Set Wkbk2 = Workbooks.Add
cmdBook2Open.Caption = "Close"
cmdBook2Open.ForeColor = vbRed
Else
'Book[2] Close , Closeする前にBook[2]のセル選択を全て解放する
RefEditSupport.ReleaseBookReference Wkbk2
Wkbk2.Close SaveChanges:=False
Set Wkbk2 = Nothing
cmdBook2Open.Caption = "Open"
cmdBook2Open.ForeColor = vbBlack
End If
End Sub
|
|
【 F A Q 】 |
|
Q1. VBEの実行ボタンでUserFormを表示するとエラーになります。
A1. clsRangeSelectionを使用しているUserFormを、VBEの実行ボタンで直接表示させる事はできません。
また、UserFormをShowメソッドで表示させた場合も同様にエラーになります。標準モジュールのプロシ
ジャーからclsRangeSelectionのShowメソッドで表示させてください。
Q2. RefEditボタン(CommandButton)のアイコン画像は、どのように設定しますか?
A2. サンプルブックのUserForm1にあるRefEditボタンをコピー&ペーストすれば、アイコン画像付きで作成
できます。Excelのアイコン画像に変更したい場合は、アイコン画像ファイルをダウンロードして、その中
にある画像ファイルをVBEのプロパティウィンドウからCommandButtonのPictureプロパティに読み込めば
差し替えられます。
[ アイコン画像ファイル ] : RefEdit_Icon_zip
Q3. RefEditをUserFormに複数配置したいのですが、クラスオブジェクトはRefEditの数だけ定義
するのですか?
A3. clsRangeSelectionのクラスオブジェクトは、1プロジェクト(ワークブック)に1つだけ定義して、その1つの
クラスオブジェクトを全てのRefEdit(プロジェクト内にRefEditを使うUserFormが複数ある/UserForm上に
RefEditが複数ある)で共有して使用します。
Q4. RefEditを使うUserFormがブックに複数あるのですが、クラスオブジェクトはUserFormごとに
定義するのですか?
A4. A3.を参照
Q5. シートを切り替えてからセルを選択しても、セルアドレスのシート表示が変わりません。
A5. その場合には、一旦、RefEditフォームをクリックしてからセル選択を行ってください。
Q6. UserForm_Activateイベントを使っていますが、RefEditフォームを閉じる度にActivateイベ
ントの処理が実行されてしまいます。
A6. UserForm.Hide → RefEditフォーム表示 → UserForm.Show の流れで作り上げていますのでRefEdit
フォームを閉じる度にActivateイベントが発生します。ActivateInfoプロパティの値でInitialize後のActivateか、
RefEdit入力後のActivateかが判断できます。判定方法の詳細はActivateInfoプロパティを参照してください。
Q7. RefEdit入力後のイベント処理を行いたい。
A7. RefEditフォームを閉じる度にUserForm_Activateイベントが実行されます。Activateイベント内でActivateInfo
プロパティの値を判断して、Initialize後のActivateか、RefEdit入力後のActivateか(どのRefEditか)が判断
できます。判定方法の詳細はActivateInfoプロパティを参照してください。
Q8. 他のブックのセルを選択したい。
A8. ShowメソッドのBookChange引数にTrueを指定すると他のブックのセルを選択できます。なお、ブックの
切り替えはRefEditフォーム上から行います。
Q9. UserForm表示の際にRefEdit に初期選択セルを設定しておきたい。
A9. ActivateイベントでActivateInfoプロパティ="Initialize"の際に、TargetRangeプロパティへ初期選択セル
のRangeオブジェクトを設定(Set)します。セルアドレス文字は自動的に編集されてRefEditラベルに表示
されます。
Q10. RefEditで選択したセル範囲のRangeオブジェクトを取得したい。
A10. TargetRangeプロパティで取得します。
Q11. RefEditで選択したセル範囲のセルアドレス文字を取得したい。
A11. TargetAddrプロパティで取得します。
Q12. RefEditで選択したセル範囲のセルアドレス文字のシートとセルを分割したい。
A12. TargetBookプロパティ/TargetSheetプロパティでブックとシートオブジェクトが取得できますので、
そのNameプロパティから取得できます。セルアドレス部分はTargetAddrプロパティで[
CellOnly
= True ]とします。
Q13. RefEditで選択した内容をクリアしたい。
A13. RefEdit入力で何もセルを選択しないで戻ればクリアされます。マクロで行うには、Clearメソッドを
実行するか、TargetRangeプロパティにNothing を設定するとクリアされます。
Q14. RefEditでの選択を単一セルに制限したい。
A14. SetRefEditメソッドで[ RangeType = 2 ]とするとセル範囲を選択しても取得されるのは、その先頭
セルのみになります。
Q15. ブック切替機能を使用していて、セル選択していたブックをマクロからクローズしても
大丈夫ですか?
A15. そのブックを選択しているRefEdit を残したままでブックをクローズすると、エクセル上では消えても、
VBE上ではVBAプロジェクトが残ってしまいます。ブックをクローズする前に、そのブックを選択し
ているRefEdit を全てクリアする必要があります。ReleaseBookReferenceメソッドに、そのクローズする
ブックオブジェクトを指定すれば、そのブックのセルを選択しているRefEditを一括してクリアします。
ユーザーサイドで「どのRefEditが、そのブックを選択しているか」を調べる必要はありません。
Q16. 排他制御が何故必要なんですか?
A16. 「RefEdit代替手法を利用する際に排他制御が必要な理由」 を参照。
|