ユーザフォーム

基本

コマンドボタン
Private Sub CommandButton1_Click()
(処理記述)
End Sub
ユーザフォーム初期化
Private Sub UserForm_initialize()

TextBox1.Text = ""
Label4.Caption = S作成日
(初期化処理記述)
End Sub
オプションボタン
Private Sub OptionButton1_Click()

status = True
Button = "受注報告"

End Sub
テキストボックス値の取得
Private Sub TextBox1_Change()

検索文字 = TextBox1.Text

End Sub
チェックボックス値の取得
Private Sub CommandButton1_Click()

Dim 売上実績表 As Boolean
Dim 営業通信簿 As Boolean
Dim 営業ランキング As Boolean

売上実績表 = UserForm1.CheckBox1.Value
営業通信簿 = UserForm1.CheckBox2.Value
営業ランキング = UserForm1.CheckBox3.Value

UserForm1.Hide
Call Step2_Main(売上実績表, 営業通信簿, 営業ランキング)
Unload Me

End Sub

キー入力の取得

シフトを押してコマンドボタンが押されたか CommandButton_Clickではできません。Mouseのイベント読んで判断。例えばMouseUpイベントを使って、
Private Sub CommandButton1_MouseUp(ByVal Button As Integer, _
                 ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Shift = 7 Then
        MsgBox "隠し機能"
    Else
        MsgBox "通常機能"
    End If
End Sub
引数Shiftの値 内容
  • 1 Shiftキーが押されました
  • 2 Ctrlキーが押されました
  • 3 Shiftキーと同時にCtrlキーが押されました
  • 4 Altキーが押されました
  • 5 Altキーと同時にShiftキーが押されました
  • 6 Altキーと同時にCtrlキーが押されました
  • 7 Altキー、Shiftキー、Ctrlキーの3つが同時に押されました
テキストボックスの入力モード設定 TextBoxをクリックした時のIMEモードをユーザフォームのプロパティーウインドウで設定する。
  • 0 fmIMEModeNoControl  変更しない(規定値)
  • 1 fmIMEModeOn      IMEをONにする
  • 2 fmIMEModeOff     IMEをOFFにする
  • 3 fmIMEModeDisable   IMEを無効にする
  • 4 fmIMEModeHiragana   ひらがなモードにする
  • 5 fmIMEModeKatakana   全角カタカナモードにする
  • 6 fmIMEModeKatakanaHalf 半角カタカナモードにする
  • 7 fmIMEModeAlphaFull  全角英数モードにする
  • 8 fmIMEModeAlpha    半角英数モードにする
プログラムからIMEモードを設定する。
Private Sub UserForm_Initialize()
  UserForm1.Caption = "商品名の入力"
  With TextBox1
    .Value = ""
    .IMEMode = fmIMEModeKatakana
    .SetFocus
  End With
End Sub
Shift+クリックや
Ctrl+クリックの判別
標準の「CommandButton_Click」ではできません。
左ボタンと右ボタンを判別したように、MouseDownイベントかMouseUpイベントを使う。
Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single,ByVal Y As Single)
End Sub

引数Shiftに結果が格納される。
  • 1 Shiftキーが押された
  • 2 Ctrlキーが押された
  • 3 Shiftキーと同時にCtrlキーが押された
  • 4 Altキーが押された
  • 5 Altキーと同時にShiftキーが押された
  • 6 Altキーと同時にCtrlキーが押された
  • 7 Altキー、Shiftキー、Ctrlキーの3つが同時に押された
コマンドボタンの右クリック コマンドボタンをダブルクリックして表示されるプロシージャでは、左ボタン(標準ボタン)のクリックしか判別できません。
左ボタンと右ボタンで、別の処理を行いたい場合は、Clickイベントではなく、MouseDownイベントまたはMouseUpイベントを使います。
Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
End Sub

引数Buttonにクリックされたボタンを表す数値が格納される。
  • 1 fmButtonLeft 左ボタンが押された
  • 2 fmButtonRight 右ボタンが押された
  • 4 fmButtonMiddle 中央ボタンが押された
Tabによるフォーカスをパス プロパティのTabStopをFalseに設定

詳細設定

ユーザフォームのモードレス(非同期)起動 UserFormの起動のデフォルトモードはモーダル(同期起動)ですが、この場合全てのインターアクションをUserFormが取ってしまうので、UserFormを終了しないと、その他の操作が行えない。
UserFormが表示されていても他の操作(Excelのメニュー操作等)を可能にするためにはUserFormをモードレスで起動する必要がある。
但し一つのプロセスでモーダル起動とモードレス起動のUserFormを混在することは出来ない。
UserForm5.Show vbModeless
ユーザホームの表示完了を待つ UserFormをモードレスで起動すると、起動側はUserFormの表示完了を待たずに処理を続行してしまうので、関連したUserFormを表示するなどの場合、それぞれの起動タイミングを同期できない。
そこで、UserFormの表示完了を待つコードを挿入して同期を取る。
UserForm3.Show vbModeless
DoEvents
Application.Wait (Now + TimeValue("0:0:3"))  '現在時刻より1秒後
Unload UserForm3
DoEvents
ユーザーフォームの初期表示位置を設定
Sub ユーザーフォーム表示位置設定()
    UserForm1.StartUpPosition = 3               '画面の左上隅(WindowsDefault)
    UserForm1.StartUpPosition = 2               '画面全体の中央(CenterScreen)
    UserForm1.StartUpPosition = 1               'UserFormが属する項目の中央(CenterOwner)
    UserForm1.StartUpPosition = 0               '初期表示位置を表す値を指定しない(Manual)
End Sub
ユーザーフォームを任意の位置に表示
Sub ユーザーフォーム任意位置表示()
    With UserForm1
        .StartUpPosition = 0                    '初期表示位置を表す値を指定しない
        .Top = 100                              '上端からの距離を設定する
        .Left = 300                             '左端    〃
        .Show                                   '表示する
    End With
End Sub
メッセージボックスのサイズ指定
フォントサイズに対して
Boxの高さは  Height
Boxの幅は   Width

ユーザフォームの作り込み

Yes/No入力

'<イニシャライズ>
Private Sub UserForm_initialize()
  EndYes = False
End Sub
'<続行>
Private Sub CommandButton2_Click()
    EndYes = False
    UserForm2.Hide
End Sub
'<終了>
Private Sub CommandButton1_Click()
    EndYes = True
    Unload Me
End Sub

プログレスバー設定

メーカー出荷状態のExcelツールボックスにはProgressBarは入っていないので、ツールボックス上で右クリックし、[その他のコントロール]で、[Microsoft ProgressBar Control]にチェックを入れ、ツールボックスに追加する。
Const MaxBar As Integer = 26
Dim Step As Integer
Dim A As Integer

'ユーザフォームの初期化
UserForm1.Caption = "商品品目対応表作成"
UserForm1.ProgressBar1.Value = 0
UserForm1.ProgressBar1.Min = 0
UserForm1.ProgressBar1.Max = MaxBar
step = RowMax / MaxBar + 1

'ユーザフォームを表示
UserForm1.Show vbModeless

J = 2

For I = 2 To RowMax

' 処理

'プログレスバーの値の設定
    A = I Mod step
    If A = 0 Then
        UserForm1.ProgressBar1.Value = UserForm1.ProgressBar1.Value + 1
        UserForm1.Label2.Caption = I    '処理量
        UserForm1.Label4.Caption = J    '処理結果量
'再表示
        UserForm1.Repaint
    End If
    
Next I

'終了
Unload UserForm1

処理途中のメッセージ設定

Private Sub UserForm_initialize()

Label1.Caption = MsgTitle
Label2.Caption = Massage

End Sub

処理途中のメッセージ表示

Sub 表示テスト()

Dim 指定時刻 As Date
Dim I As Integer
Dim MTitle As String

MTitle = "処理途中表示"
For I = 1 To 10
    Call ProgressDisp(MTitle, I)
        指定時刻 = Now + TimeValue("0:0:1")  '現在時刻より1秒後
        Application.Wait (指定時刻)          'Wait処理
    Call ProgressEnd
Next I

End Sub

処理途中のメッセージ表示終了

Sub ProgressEnd()
    Unload UserForm1
    DoEvents       'Unloadの完了待ち

End Sub

メッセージの表示

Public Job As Integer
Public メッセージ As String

Sub MsgDisp(Job, メッセージ)

Select Case Job
    Case 0
        'UserForm1.Caption = メッセージ
        UserForm102.Show vbModeless

    Case 1
        UserForm102.Label1.Caption = メッセージ
        UserForm102.Repaint
    Case 9
        Unload UserForm102
End Select

End Sub

Sub MsgDisp_Test()


Call MsgDisp(0, "メッセージ表示テスト")
    Application.Wait [Now() + "0:00:01"]

Call MsgDisp(1, "メッセージテスト1")
    Application.Wait [Now() + "0:00:01"]
Call MsgDisp(1, "メッセージテスト2")
    Application.Wait [Now() + "0:00:01"]
Call MsgDisp(1, "メッセージテスト3")
    Application.Wait [Now() + "0:00:01"]
Call MsgDisp(9, "")

End Sub
14 15 16

このサイトは個人生活を健やかに、愉しく、 企業活動を闊達にして、 持続可能な社会作りを目指します
Copyright © しなやか暮し研究所 2012 All Rights Reserved.