|
はじめまして。テキストボックスから検索値を入力して、
抽出するようにしたいのですが、オブジェクトが必要ですとでて
フォームを表示することすら出来ません。
本に載っているデータを変えただけなのですが、うまくいきません。
大変長文で申し訳ないのですが、お教え頂けませんでしょうか?
よろしくお願いいたします。(2つのフォームが順番に出るようになっています。)
frm Main↓
Dim HyoujiSheetName As String ' 表示するワークシートの名前
' "住所録"または"抽出結果"
Dim TourokuKensuu As Long ' 住所録の登録件数
'
' [抽出条件を設定]ボタンがクリックされた場合の処理
'
Private Sub cmdSettei_Click()
' 作成した抽出条件設定用のフォームを表示
frmJyouken.Show vbModeless
End Sub
' スクロールバーのつまみの位置が変更された場合の処理
'
' ただし、つまみがドラッグされている場合はScrollイベントが発生し、
' ドラッグが終了した時点でChangeイベントが発生する
'
Private Sub srlMove_Change()
' スクロールバーが保持している表示データ番号(Valueプロパティ)の
' データをフォームに表示
Hyouji HyoujiSheetName, srlMove.Value
' 何件目を表示しているかを更新
lblHyoujiKensuu.Caption = srlMove.Value & "件目を表示中"
End Sub
'
' スクロールバーのつまみがドラッグされた場合の処理
'
' ドラッグを終了するとChangeイベントが発生する
'
Private Sub srlMove_Scroll()
' このマクロでは、Changeの場合と同じ処理を行っている
' 複雑な計算が含まれる場合や画像を表示する場合などは、
' Scrollイベントでは行わず、Changeイベントのみで
' 行うようにするとよい
Hyouji HyoujiSheetName, srlMove.Value
lblHyoujiKensuu.Caption = srlMove.Value & "件目を表示中"
End Sub
'
'[条件を満たすデータを抽出] ボタンがクリックされた場合の処理
'
Private Sub tglCyuusyutsu_Click()
Dim Kensuu As Long
' [条件を満たすデータを抽出]ボタンが押し込まれた場合の処理
'(抽出表示モードが設定された)
' ValueプロパティがTrueの場合は押し込まれた状態、
' Falseの場合は出っ張った状態
If tglCyuusyutsu.Value = True Then
' 抽出プロシージャを呼び出し、抽出件数を変数に代入
Kensuu = Cyuusyutsu()
' 抽出件数によって処理を変える
If Kensuu = 0 Then
' 抽出されたデータがなかったので、メッセージを表示
MsgBox "抽出条件を満たすデータは見つかりませんでした。"
' 抽出モードを強制的に解除
tglCyuusyutsu.Value = False
Exit Sub
Else
' 抽出されたデータが1件以上ある場合、
' シート[抽出結果]を表示するワークシートにする
' シート[住所録]も[抽出結果]も同じように項目が配置された
' ワークシートなので、フォームとマクロは共通のままで
' 表示対象のワークシートを切り替える
HyoujiSheetName = "抽出結果"
' シート[住所録]と[抽出結果]では、データの件数が異なるので
' 表示切り替え用のスクロールバーの値を設定し直す
ScrollBarSet Kensuu
' シート[抽出結果]の1件目を表示する
' 件数から実際に表示する行番号への変換はHyoujiプロシージャ内で行う
Hyouji HyoujiSheetName, 1
' シート[抽出結果]を表示する(確認用)
Worksheets("抽出結果").Select
Exit Sub
End If
End If
'
' [条件を満たすデータを抽出]ボタンが出っ張った場合の処理
'(抽出表示モードが解除された)
'
' 表示対象をシート[住所録]に変更
HyoujiSheetName = "住所録"
' 表示切り替え用のスクロールバーの値を設定
ScrollBarSet TourokuKensuu
' シート[住所録]の1件目を表示
Hyouji HyoujiSheetName, 1
' シート[住所録]を表示する(確認用)
Worksheets("住所録").Select
End Sub
'
' ユーザーフォームの表示直前に行われる処理
'
Private Sub UserForm_Initialize()
' シート[住所録]に書き込まれているデータの件数をチェック
HyoujiSheetName = "住所録"
Hyouji HyoujiSheetName, 1
ScrollBarSet TourokuKensuu
cmdSettei.SetFocus
' 抽出条件を指定するフォームにあるコンボボックスに選択肢と
' あらかじめ選ばれている選択肢を指定
' frmJyoukenのUserForm_Initializeで行わないのは、
' 以前の検索状態を保持するため
'
frmJyouken.cmbTosyoJyouken.RowSource = "抽出条件!I3:I5"
frmJyouken.cmbTosyoJyouken.ListIndex = 0
frmJyouken.cmbTitleJyouken.RowSource = "抽出条件!I3:I5"
frmJyouken.cmbTitleJyouken.ListIndex = 0
frmJyouken.cmbTyosyaJyouken.RowSource = "抽出条件!I3:I5"
frmJyouken.cmbTyosyaJyouken.ListIndex = 0
frmJyouken.cmbSyuppansyaJyouken.RowSource = "抽出条件!I3:I5"
frmJyouken.cmbSyuppansyaJyouken.ListIndex = 0
frmJyouken.cmbBunyaJyouken.RowSource = "抽出条件!I3:I5"
frmJyouken.cmbBunyaJyouken.ListIndex = 0
frmJyouken.cmbBunruiJyouken.RowSource = "抽出条件!I3:I5"
frmJyouken.cmbBunruiJyouken.ListIndex = 0
frmJyouken.cmbTanabanJyouken.RowSource = "抽出条件!I3:I5"
frmJyouken.cmbTanabanJyouken.ListIndex = 0
End Sub
'
' マクロの終了処理
'
'
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' frmJyoukenは隠したままで閉じていないため、Endステートメントで
' 表示されているすべてのユーザーフォームを閉じる
' Unload frmJyouken と記述してもよい
End
End Sub
'
' 引数で指定されたワークシートに何件のデータが登録されているかを
' 返すFunctionプロシージャ
'
' 引 数:SheetName(String型) データ数を調べたいワークシートの名前
' 戻り値:MaxTourokuKensuu(Long型) データの件数
'
Function MaxTourokuKensuu(SheetName As String) As Long
Dim Gyou As Long
Gyou = Worksheets(SheetName).Cells(1, 1).End(xlDown).Row
If Gyou = 65536 Then
MaxTourokuKensuu = 0
Else
MaxTourokuKensuu = Gyou - 1
End If
End Function
'
' 引数で指定されたワークシートにあるデータ番号(TourokuNo)のデータを
' 読み込み、ユーザーフォームに表示する
'
' 引 数:SheetName(String型) ワークシートの名前
' TourokuNo(Long型) 表示するデータ番号
' ※行番号ではないことに注意
'
Sub Hyouji(SheetName As String, TourokuNo As Long)
' 変数を介さずコントロールに直接セルの値を代入
' TourokuNo + 1は、データ番号から行番号に変換している
txtTosyo.Text = Worksheets(SheetName).Cells(TourokuNo + 1, 1).Text
' 各コントロールにセルから読み込んだ値を代入
txtTitle.Text = Worksheets(SheetName).Cells(TourokuNo + 1, 2).Text
txtTyosya.Text = Worksheets(SheetName).Cells(TourokuNo + 1, 3).Text
txtSyuppansya.Text = Worksheets(SheetName).Cells(TourokuNo + 1, 4).Text
txtBunya.Text = Worksheets(SheetName).Cells(TourokuNo + 1, 5).Text
txtBunrui.Text = Worksheets(SheetName).Cells(TourokuNo + 1, 6).Text
txtTnanaban.Text = Worksheets(SheetName).Cells(TourokuNo + 1, 7).Text
End Sub
'
' 条件を満たすデータをシート[抽出結果]にコピーし、抽出件数を返すFunctionプロシージャ
'
' 引 数:なし
' ただしシート[抽出条件]のセルA1〜D2を参照する
' 戻り値:Cyuusyutsu(Long型) 抽出したデータの件数
'
Function Cyuusyutsu() As Long
' シート[抽出結果]をクリアする
Worksheets("抽出結果").Range("A1:G65536").Clear
' Worksheets("〜").Range(Cells(y1,x1),Cells(y2,x2)).〜という記述は
' できないので、Worksheetsを選択する。以降、Worksheetsの選択が不要となり
' Range(Cells(y1,x1),Cells(y2,x2)).〜と記述できる
Worksheets("住所録").Select
' AdvancedFilterは、指定した範囲内から抽出条件を満たすものを
' 指定範囲に抽出する
Range(Cells(1, 1), Cells(TourokuKensuu + 1, 7)).AdvancedFilter _
xlFilterCopy, _
Worksheets("抽出条件").Range("A1:G2"), _
Worksheets("抽出結果").Range("A1:G65536")
'抽出したデータの件数を戻り値にする
Cyuusyutsu = MaxTourokuKensuu("抽出結果")
End Function
' 表示切り替え用のスクロールバーにデータの最小件数(1)、最大件数
' などを設定する
'
' 引 数:MaxKensuu(Long型) データの最大件数
'
Sub ScrollBarSet(MaxKensuu As Long)
' スクロールバーの最大値はデータの最大件数に連動する
srlMove.Max = MaxKensuu
' 最小値は常に1
srlMove.Min = 1
' Valueプロパティはつまみの位置によって変わる
' 現在の表示データはこの値を使用する
srlMove.Value = 1
' ProportionalThumb = Trueとすると、データの件数によってつまみの
' 大きさが変化する。Falseにすると、つまみの大きさは固定となる
srlMove.ProportionalThumb = True
' 左右の三角ボタンなどをクリックすると、Valueプロパティの値を
' いくつずつ増減するかを指定する
srlMove.SmallChange = 1
srlMove.LargeChange = CLng((srlMove.Max - srlMove.Min) / 10) + 1
' ラベルに最大件数と現在の表示データの位置を表示
lblMaxKensuu.Caption = MaxKensuu & "件"
lblHyoujiKensuu.Caption = srlMove.Value & "件目を表示中"
End Sub
|
|