- ベストアンサー
VBA データの転記、参照の方法
- VBAを使用してパソコンの情報を管理するシステムを作成しています。特定の条件に該当するパソコン情報を検索結果画面に表示する処理の方法が分かりません。
- また、検索画面で選択された条件に応じて、正しいコードを書く方法も分かりません。特に、Win8、Win7、WinXPが選択された場合についても教えてください。
- さらに、条件が一つも選択されていない場合にはメッセージを表示したいのですが、その書き方も分かりません。修正や追加すべき点があれば教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
フォームコントロールのチェックボックスでしたら Dim c As Shape Dim flg As Boolean For Each c In ActiveSheet.Shapes If c.Type = msoFormControl Then If c.Name Like "cb*" Then If CheckBoxes(c.Name).Value = xlOn Then Select Case c.Name Case "cbWin10" flg = True Call SearchPC("Windwos10")
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17070)
質問の方法と違うのですが、下記の方を勉強してください。勧めます。 普通の解説書なら、こうではないかという方法を使った。質問の方法は、泥臭い方法と感じて、その為に色色質問が出る、と感じたから。 今までの回答者は、質問者の質問路線での、部分訂正の教示の回答がほとんどだが、小生は、回答者の今後のためには、広げた勉強が必要と思う。 ーー Sheet1のA,B列に、例データとして PCID OS PC1 windows10 PC2 windows10 PC3 windows7 PC4 windows10 PC5 windows8 PC6 windows10 ’--- ユーザーフォームにオプションボタンを5つほど設ける(OSの種類数に合わせてである)。 CaptionはOS名(B列の表記の通り、一字一句同じにする)。 ElseIfの行はそれに合わせて増やすこと。 そのユーザーフォームに、コマンドボタンを1つ設ける。 コマンドボタンのクリックイベントに Private Sub CommandButton1_Click() Worksheets("Sheet1").Range("B1").AutoFilter With UserForm1 If .CheckBox1.Value = True Then 検索語 = CheckBox1.Caption ElseIf .CheckBox2.Value = True Then 検索語 = CheckBox2.Caption ElseIf CheckBox3.Value = True Then 検索語 = CheckBox3.Caption Else MsgBox "どれかを選択してください。" End If End With MsgBox 検索語 '---シート検索 Worksheets("Sheet1").Range("B2").AutoFilter Field:=2, Criteria1:=検索語, VisibleDropDown:=False Worksheets("Sheet1").Range("A1").CurrentRegion.Copy Worksheets("Sheet2").Range("A1") End Sub 結果 Sheet2 PCID OS PC1 windows10 PC2 windows10 PC4 windows10 PC6 windows10 Sheet2データを用いた、その後の処理はご自由に。
お礼
確かに私が当初考えていた処理よりもわかりやすいですね。 オートフィルタの機能を初めて知ったので活用しようと思います。 ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1742/2617)
最初の方だけ変更してください Call SearchPC("Windwos10") までを変更して後はそのままです。 > f c.Object.Value = True Then 'IFはそれぞれのOSの場合を書く? OleObjectをシート上で検索して名前がcbで始まるものであればそれがチェックされているかどうか見て、チェックされていればそのチェックボックスがどのチェックボックスなのかを Select Case c.Name 以降で判断してOS名を引数に入れて SearchPC(ByVal SelectPC As String) を実行します。 VBA Select Caseで検索してそのやり方を確認してください。 チェックボックスの確認ができているかどうかの確認のため 下の方の Function SearchPC を以下のようにしてボタンを押したときにチェックボックスに対応したOS名が渡されているかどうか見てください。 Function SearchPC(ByVal SelectPC As String) MsgBox SelectPC End Function > また、検索したデータを転記するにはどのような命令を使うといいでしょうか? 右辺を左辺に代入するです。 PCT(PCテーブルのシート)からResult(検索結果のシート)に転記なら Result.Cells(Row,Column).value=PCT.Cells(Row,Column).value 以後コードについてやテストの仕方の説明はしませんので関数などの使い方は検索してください。
- kkkkkm
- ベストアンサー率66% (1742/2617)
ユーザーフォームではなくて直接シートにチェックボックスだったのですね。 ActiveXコントロールでしたら(最初の方だけ変更してください) cにはFor~Nextで順次コントロールオブジェクトが入ります。 Dim c As OLEObject Dim flg As Boolean flg = False For Each c In ActiveSheet.OLEObjects If c.Name Like "cb*" Then If c.Object.Value = True Then Select Case c.Name Case "cbWin10" flg = True Call SearchPC("Windwos10")
補足
そのとおりです。チェックボックスをのせてます。 説明不足ですみません。 以下のようにまとめておきました。 If c.Name Like "cb*" ThenからEndIFまでは同じ要領で それぞれのOSの場合を書けばよろしいですか? また、検索したデータを転記するにはどのような命令を使うといいでしょうか? Private Sub cmdSearch_Click() '検索ボタンを押す Dim c As OLEObject Dim flg As Boolean flg = False For Each c In ActiveSheet.OLEObjects If c.Name Like "cb*" Then If c.Object.Value = True Then 'IFはそれぞれのOSの場合を書く? Select Case c.Name Case "cbWin10" flg = True Call SearchPC("Windows10") End Select End If If c.Object.Value = True Then Select Case c.Name Case "cbWin8" flg = True Call SearchPC("Windows8") End Select End If Next If flg = False Then MsgBox "OSを選択してください", vbCritical End If End Sub Function SearchPC(ByVal SelectPC As String) Dim nStartRow As Long '開始行 Dim nEndRow As Long '終了行 Dim mRow As Long nStartRow = 3 'OSの列 nEndRow = PCT.Cells(Rows.Count, 3).End(xlUp).Row 'Tb最後 For mRow = nStartRow To eEndRow If PCT.Cells(mRow, 3) = SelectPC Then Result.Activate '検索結果表示 'データの転記コード End If Next End Function
- kkkkkm
- ベストアンサー率66% (1742/2617)
チェックボックスだと以下のような感じでも Function SearchPC(ByVal SelectPC As String)はNo1と同じで Private Sub cmdSearch_Click() Dim c As Control Dim flg As Boolean flg = False For Each c In Controls If TypeName(c) = "CheckBox" Then If c.Value = True Then Select Case c.Name Case "cbWin10" flg = True Call SearchPC("Windwos10") Case "cbWin8" flg = True Call SearchPC("Windwos8") Case "cbWin7" flg = True Call SearchPC("Windwos7") Case "cbWinXP" flg = True Call SearchPC("WindwosXP") Case Else End Select End If End If Next If flg = False Then MsgBox "OSを選択してください", vbCritical End If End Sub
補足
素早い回答ありがとうございます! ちなみに、c=nothingとなったのですが、Controlsのcには何を代入すればよいのでしょうか?
- kkkkkm
- ベストアンサー率66% (1742/2617)
コンボボックスで選択するようにして以下のようにすると単純になると思います。 Private Sub cmdSearch_Click() If ComboBox1.Value <> "" Then Call SearchPC(ComboBox1.Value) Else MsgBox "OSを選択してください", vbCritical End If End Sub Function SearchPC(ByVal SelectPC As String) Dim nStartRow As Long '開始行 Dim nEndRow As Long '終了行 Dim mRow As Long nStartRow = 3 'OSの列 nEndRow = PCT.Cells(Rows.Count, 3).End(xlUp).Row 'Tb最後 For mRow = nStartRow To eEndRow If PCT.Cells(mRow, 3) = SelectPC Then Result.Activate '検索結果表示 データの転記コード End If Next End Function
お礼
丁寧に教えてくださり、ありがとうございます! 少しずつ自分で勉強して理解を深めます。