ExcelVBA 所属部署・権限別のシート表示

このQ&Aのポイント
  • ExcelVBAを使用して、ログインフォームを実装し、IDとパスワードを入力することでログインできるようにし、ログイン者の権限に応じて表示するシートを変更する機能を実装したいです。
  • ログイン者が管理者権限を持つ場合、すべてのシートを表示し、それ以外の場合はログイン者個人のシートのみを表示するようにしたいです。
  • さらに、ログイン者が一定以上の役職(管理職)である場合には、同じ部署の他の人のシートも表示する機能を追加したいです。
回答を見る
  • ベストアンサー

ExcelVBA 所属部署・権限別のシート表示

VBA初心者です。 エクセルにログインフォームを実装しました。 IDとパスワードを入力してログインボタンを押下すると、ログイン情報が記述されたシートを参照し、IDとパスワードを照合してログインします。 現在、ログイン者が「管理者」権限であるとき、すべてのシートを表示します。 ログイン者が権限を持たない場合、ログイン者個人のシートが表示されるようになっています。 これに加え、「ログイン者が一定以上の役職(管理職)であれば同じ部署全員のシートを表示する(他部署は見れない)」構文を追加したいです。 Option Explicit Enum eColIndex id = 1 pass = 2 name = 3 dep = 4 post = 5 depcode = 6 postcode = 7 End Enum Private Sub Loginbtn_Click() Dim isAdmin As Boolean Dim isManage As Boolean Dim ws As Worksheet id = txtId.Text pass = txtPass.Text 'IDを検索しパスワードと照合 Dim idRow As Long Dim nameRow As Long On Error GoTo failed idRow = WorksheetFunction.Match(id, login.Columns(eColIndex.id), 0) If pass = login.Cells(idRow, eColIndex.pass) Then MsgBox "『" & login.Cells(idRow, eColIndex.name) & "』" & "でログインしました", vbInformation, "成功" Unload Me '入力されたIDから名前と部署と役職を参照する name = login.Cells(idRow, eColIndex.name) '入力ID行の3列目(氏名)のセルを参照 depcode = login.Cells(idRow, eColIndex.depcode) '入力ID行の6列目(部署コード)のセルを参照 postcode = login.Cells(idRow, eColIndex.postcode) '入力ID行の7列目(役職コード)のセルを参照 '所属・役職を判断 If depcode = "_ADM" Then isAdmin = True '部門コードが_ADMならシステム管理者 If postcode >= "J-3" Then isManage = True '役職コードがJ-3以上なら管理職 If isAdmin Then 'システム管理者なら For Each ws In Worksheets '全てのシートを ws.Visible = True '表示 Next ----------------------- ここに上述のシート表示の構文を記述したい ----------------------- Else 'いずれでもないなら個別シートを表示 On Error Resume Next 'エラートラップ開始 Set ws = Sheets(name) 'Sheets("氏名") On Error GoTo 0 'エラートラップ終了 If ws Is Nothing Then 'シートが無いなら MsgBox "ユーザーシートがありません" Application.Quit '終了 End End If ws.Visible = True 'ユーザーのシート表示 For Each ws In Worksheets '全てのシート If ws.name <> name Then ws.Visible = False 'シート名がユーザ名のシート以外Visible=False Next End If Application.Visible = True 'ブックを表示 Else failed: 'エラーになった場合 MsgBox "ログインに失敗しました", vbCritical, "失敗" End If End Sub 試行錯誤してみましたがさっぱりうまくいきません。 どうかよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.10

> が、ログイン情報シート等の余計なシートまで見えるようになってしまいました。 リストに記載されていないシートは対象にならないので残念ながらそうなってしまいます。 リストから同一部署所属者リストを内部で作成して、シートが所属者リストに含まれるかどうかで表示非表示を決めるという手段でしたら(コードがだらだらと長くなるのですが)以下のような感じでいけるのではないでしょうか。 ユーザー名がない場合(ログイン情報リストの名前だけ記載漏れとか)に止めなくてもいいような気もしますがとりあず止めてます。 ElseIf isManage = True Then '管理職なら Dim i As Long Dim j As Long: j = 0 Dim NameList As Variant Dim MatchFlg As Boolean ReDim NameList(j) NameList(j) = "" For i = 1 To login.Cells(Rows.Count, eColIndex.depcode).End(xlUp).Row If login.Cells(i, eColIndex.depcode).Value = depcode Then ReDim Preserve NameList(j) NameList(j) = login.Cells(i, eColIndex.Name).Value If NameList(j) = "" Then MsgBox login.Cells(i, eColIndex.ID).Value & " のユーザー名がありません" Application.Quit '終了 End End If j = j + 1 End If Next For Each ws In Worksheets MatchFlg = False For i = LBound(NameList) To UBound(NameList) If ws.Name = NameList(i) Then ws.Visible = True '表示 MatchFlg = True Exit For End If Next If MatchFlg = False Then ws.Visible = False '非表示 End If Next

oldold_d
質問者

お礼

若干不格好にはなりましたが、ログイン情報等のシート名をログイン情報シートに登録することで解消しました。 これでほぼほぼ希望通りの形となりました。ありがとうございました!

その他の回答 (9)

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.9

全てのシートがリストに存在するのであれば、現状シートの表示非表示にかかわらず以下のような感じでいけると思います。 前回までの回答で ws.Visible = のあとに Set ws = Nothing を入れ忘れてました。 ElseIf isManage = True Then '管理職なら Dim i As Integer For i = 1 To login.Cells(Rows.Count, eColIndex.depcode).End(xlUp).Row On Error Resume Next 'エラートラップ開始 Set ws = Sheets(login.Cells(i, eColIndex.Name).Value) 'Sheets("氏名 ")" On Error GoTo 0 'エラートラップ終了 If login.Cells(i, eColIndex.depcode).Value = depcode Then If ws Is Nothing Then 'シートが無いなら MsgBox login.Cells(i, eColIndex.Name).Value & " のユーザーシートがありません" Application.Quit '終了 End End If ws.Visible = True 'ユーザーのシート表示 Set ws = Nothing ElseIf Not ws Is Nothing Then ws.Visible = False Set ws = Nothing End If Next Else

oldold_d
質問者

お礼

うまくいきました! が、ログイン情報シート等の余計なシートまで見えるようになってしまいました。 感触的にはNo.3、No.5が理想的な動作をしました。 ありがとうございました!

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.8

横から失礼します。 まず私が把握できない疑問点を列挙します。 (1)マクロブックの配布 このマクロ込みのブックを 管理者が適時メンテナンスし、 必要なシートを全数非表示にしたうえで、 利用者それぞれに配布しているんですね? それともファイルサーバー上に配置し、 各自が参照しているんでしょうか? (2)「管理者」、「一定以上の役職(管理職)」の判定 前者は If depcode = "_ADM" Then isAdmin = True で判断できるようですが 後者は、どのように判定すればいいでしょうか? If postcode >= "J-3" Then isManage = True これで判定すればいいですか? (3)同じ部署全員のシートを表示 ログインする時に ログイン情報シートのID、パスワードをマッチングし、 マッチングした行の部署(あるいは部署コード)を取得。 続いて、 ログイン情報シートを使い同じ部署の社員一覧を取得、 (個々のシート名が社員名だろうことから) この社員一覧を使い、個々のシートの表示/非表示を制御する。 という理解でいいですか? (4)セキュリティについて VBAは扱えないものの、シート関数には長けている方なら 手動でシートを追加、あるいは別なブックを開き 隠れたシートを参照する計算式を埋めることで 管理者や管理職者以外であっても 別な社員やログイン情報シートを覗けてしまいそうですが いかがでしょうか? それは「しない」、あるいは「できないだろう」という前提ですか? ブックを然るべきパスワードで保護しておかないと 手動で保護解除、任意シートの再表示ができてしまいそうですが いかがでしょうか? 一方、 ブックを保護しているのであれば、 マクロの中で一時的に保護を無効にしてから 指定のシートを表示し 再び保護する必要があるものの 提示されたマクロでは行われていないように見えますが いかがでしょうか?

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.7

あと最初の状態で If login.Cells(i, eColIndex.depcode).Value = depcode Then を If login.Cells(i, eColIndex.depcode).Value <> depcode Then にして ws.Visible = False にする手もあると思いますが、depcodeが不正な場合に意外なシートが非表示になる、もしくはすべてのシートを非表示にしようとしてエラーになる可能性があると思いますのでさけました。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.6

> ここに上述のシート表示の構文を記述したい これを意識して入れ込みましたが その後でユーザーのシートを表示してその他は非表示にしてるのですから Application.Visible = True 'ブックを表示 の前に最初のコード If isManage = True Then 以下を入れたらいいのではないでしょうか。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.5

起動時でなくても管理職の時に最初に他のシートを非表示にするとかだと他の部分に影響がないと思います。 ElseIf isManage = True Then '管理職なら For Each ws In Worksheets If ws.Name = Name Then ws.Visible = True '表示 Else ws.Visible = False '非表示 End If Next Dim i As Integer

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.4

> ご教示にならい挿入してみましたが、すべてのシートが見れてしまいます。 起動時にすべてのシートは非表示になっているでしょうか。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.3

No2の訂正です。 End End If End If ws.Visible = True 'ユーザーのシート表示 Next End If ↑ シートの表示の場所が間違ってました こちらの場所で ↓ End End If ws.Visible = True 'ユーザーのシート表示 End If Next あとValueを付けたいかも login.Cells(i, eColIndex.depcode).Value login.Cells(i, eColIndex.Name).Value

oldold_d
質問者

補足

ElseIf isManage = True Then '管理職なら Dim i As Integer For i = 1 To login.Cells(Rows.Count, eColIndex.depcode).End(xlUp).Row If login.Cells(i, eColIndex.depcode).Value = depcode Then On Error Resume Next 'エラートラップ開始 Set ws = Sheets(login.Cells(i, eColIndex.name).Value) 'Sheets("氏名") On Error GoTo 0 'エラートラップ終了 If ws Is Nothing Then 'シートが無いなら MsgBox "ユーザーシートがありません" Application.Quit '終了 End End If ws.Visible = True 'ユーザーのシート表示 End If Next ご教示にならい挿入してみましたが、すべてのシートが見れてしまいます。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.2

こんな感じ(あくまでも感じですので実際に動作確認はできていません)でいかがですか。 If isManage = True Then For i = 1 To login.Cells(Rows.Count, eColIndex.depcode).End(xlUp).Row If login.Cells(i, eColIndex.depcode) = depcode Then On Error Resume Next 'エラートラップ開始 Set ws = Sheets(login.Cells(i, eColIndex.Name)) 'Sheets("氏名") On Error GoTo 0 'エラートラップ終了 If ws Is Nothing Then 'シートが無いなら MsgBox "ユーザーシートがありません" Application.Quit '終了 End End If End If ws.Visible = True 'ユーザーのシート表示 Next End If

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.1

部署ごとに各部署全員の一覧を作るか、シート名に部署コードもしくは部署名を付加して depcode postcode を見て表示するシートを決めたらいいのではないでしょうか。

oldold_d
質問者

補足

ログイン情報シートには、A列から順にID、パスワード、氏名、部署、役職、部署コード、役職コードを格納しています。

関連するQ&A

  • 実行時エラー

    先日はご回答いただきありがとうございました。 ご回答いただいた構文を採用してテストしてみましたところ、特定の操作時にエラーが発生してしまいました。 発生条件:「管理」部署のユーザー・シート3人と「総務」部署のユーザー・シート2人を用意      「管理」の管理職でログインしたあと、「総務」の管理職でログインを試みるとエラーが発生 発生エラー:実行時エラー'1004' 'Visible' メソッドは失敗しました: '_Worksheet' オブジェクト エラー発生箇所:ws.Visible = False(下から4行目) お手すきの時で構いませんので、宜しければご回答お願いいたします。 ElseIf isManage Then '管理職なら Dim i As Integer For i = 1 To login.Cells(Rows.Count, eColIndex.depcode).End(xlUp).Row On Error Resume Next 'エラートラップ開始 Set ws = Sheets(login.Cells(i, eColIndex.name).Value) 'Sheets("氏名") On Error GoTo 0 'エラートラップ終了 If login.Cells(i, eColIndex.depcode).Value = depcode Then If ws Is Nothing Then 'シートが無いなら MsgBox "ユーザーシートがありません", vbExclamation, "警告" Application.Visible = True 'ブックを表示 End End If ws.Visible = True 'ユーザーのシート表示 Set ws = Nothing ElseIf Not ws Is Nothing Then ws.Visible = False Set ws = Nothing End If Next

  • Excel 2007 マクロ 別シートの情報を反映する方法

    Excel 2007 マクロ 別シートの情報を反映する方法 Sheet1とSheet2があります。 Sheet1のD列とSheet2のM列で同じ値があれば、 Sheet1のE列の値をSheet2のN列に反映するマクロを 作成しました。 下記が正しいと思っていたのですが、エラーメッセージは出ずに 値が反映されません。 マクロに問題点があればご指摘ください。 よろしくお願いいたします。 Sub Rist() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") For i = 2 To ws1.Cells(Rows.Count, "D").End(xlUp).Row For j = 2 To ws2.Cells(Rows.Count, "M").End(xlUp).Row If ws2.Cells(j, "M") = ws1.Cells(i, "D") Then ws2.Cells(j, "N") = ws1.Cells(i, "E") End If Next j Next i End Sub

  • Excel VBA 指定シートの有無確認

    指定した名前のシートがあるかないか判断させてますが、 以下のやりかたでは、 グラフ作成したシートを認識してくれません。 そのようにすれば良いでしょうか? Dim ws As Worksheet, flag As Boolean For Each ws In Worksheets If ws.Name = "シート" Then flag = True  Next ws If flag = True Then  msgbox "あります  Else  Sheets.Add  ActiveSheet.Name = "シート" End If

  • 【help】Excelデータが消えました。

    this work bookで下記のコードを入れ、間違えて閉じてしまった後からそのページにあったファイルが消えてしまいました。 復旧は可能でしょうか? ちなみに現在の状況はbook2から始まる状態で、消えたはずのbook1の合計の関数を示しています。どなたかわかる方教えてください!! Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) For Each ws In Sheets If ws.Name = "Dummy" Then ws.Visible = True Else ws.Visible = xlSheetVeryHidden End If Next End Sub Private Sub Workbook_Open() Dim ws As Worksheet For Each ws In Sheets If ws.Name = "Dummy" Then ws.Visible = xlSheetVeryHidden Else ws.Visible = True End If Next End Sub (seiya)

  • ファイルオープン時のマクロが一部実行されない

    いつも回答して頂き、ありがとうございます。感謝感謝です。 ファイルオープン時にApplication.Runで3つのマクロを実行させているのですが、最後のマクロだけ実行されません。どうしてでしょうか?もしかして、前の2つで『一覧シート』を除外するマクロを実行しているからでしょうか?御指導の程宜しくお願いいたします。 1番目に実行するマクロ Sub 特定のシート以外の最終履歴と次回予定日を算出する() Dim ws As Worksheet For Each ws In Worksheets If ws.Name <> "一覧" Then If ws.Name <> "メニュー" Then Dim c As Integer c = 3 Do While ws.Cells(2, c).Value <> "" With ws.Cells(6, c) .FormulaR1C1 = "=MAX(R8C:R10000C)" If .Value = 0 Then .Value = "履歴無し" ws.Cells(7, c).ClearContents Else .Value = .Value ws.Cells(7, c) = DateAdd("d", ws.Cells(5, c), DateAdd("m", ws.Cells(4, c), DateAdd("yyyy", ws.Cells(3, c), ws.Cells(6, c)))) End If End With c = c + 1 Loop End If End If Next End Sub 2番目に実行するマクロ Sub 期限の未達と到達を色で分ける() Dim ws As Worksheet For Each ws In Worksheets If ws.Name <> "一覧" Then If ws.Name <> "メニュー" Then Dim c As Long Dim res As Variant For c = 3 To ws.Cells(7, Columns.Count).End(xlToLeft).Column If IsDate(ws.Cells(7, c)) Then If ws.Cells(7, c) > Date Then res = 8 Else res = 3 End If Else res = xlNone End If ws.Cells(7, c).Interior.ColorIndex = res Next c End If End If Next End Sub 3番目に実行するマクロ Sub 各シートの情報を一覧へ転記する() Dim d As Integer Dim retu As Integer d = 3 Do While Cells(d, 2).Value <> "" With Worksheets(Worksheets("一覧").Cells(d, 2).Value) .Activate retu = .Range("IV7").End(xlToLeft).Column .Range(Cells(7, 3), Cells(7, retu)).Copy End With With Worksheets("一覧") .Activate Cells(d, 3).PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False End With d = d + 1 Loop End Sub

  • エクセル2007 参照セルの値が認識されない

    エクセル2007の環境で下記マクロを実行すると、 アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記しても そのセルA1の値をVLOOKUP関数で参照できません。 マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。 宜しくお願いいたします。 【sheet】は アクティブシートの3行目から1000行目までのA列のセルをクリックしたらセルA1に値を表示 その後、下記【モジュール】を使用し、 アクティブシートのセルA1が空白の場合、 A列の数値をSheet1のセルA1に転記し、アクティブシートのA列の数値が空白になるまで循環する。 Sheet1のセルA1の値をVLOOKUP関数で参照した内容を表示、印刷します。 ----------------------------------------------------------------- '【sheet】 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Count > 1 + IsEmpty(.Value) Then Exit Sub If Application.Intersect(.Cells, Range("A3:A1000")) Is Nothing Then Exit Sub ActiveSheet.Cells(1, 1).Value = .Value End With End Sub ----------------------------------------------------------------- '【モジュール】 Sub TEST() Dim myBtn As Integer Dim myMsg As String, myTitle As String Dim WS1 As Worksheet, WS2 As Worksheet Dim i As Long myMsg = "●●●" myTitle = "確 認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then Set WS1 = ActiveSheet Set WS2 = Sheet1 If WS1.Cells(1, 1).Value = "" Then With WS1 For i = 3 To 65536 If .Cells(i, 1).Value = "" Then Exit For WS2.Cells(1, 1).Value = .Cells(i, 1).Value WS2.Cells(1, 2).Value = ActiveSheet.Name 'WS2.PrintOut Copies:=1 Next i End With ElseIf WS1.Cells(1, 1).Value >= 1 Then WS2.Cells(1, 1).Value = WS1.Cells(1, 1).Value WS2.Cells(1, 2).Value = WS1.Name 'WS2.PrintOut Copies:=1 Else End If End If End Sub -----------------------------------------------------------------

  • 【Excel VBA】ワークシートの表示

    Excel 2013で以下のコードを実行し、 非表示にしているワークシートの表示を試みましたが、 上手く機能しませんでした。 コード自体にエラーはなく、該当シートのVisibleプロパティを確認すると xlSheetVisibleに変わっているのですが、実際のシートは非表示のままでした。 どう対処すればワークシートを表示することが可能でしょうか? ==================== If actsht = tmp(i) Then If Sheets(元データ).Visible = False Then Sheets(元データ).Visible = True End If End If ====================

  • 別シートにコピペするExcelVBA

    超初心者なのですが、業務処理の簡素化のため、色々調べながら、下記を作りました。 が、、、うまく動いてくれません。。 やりたいことは、D列に「OK」とある行を、「終了リスト」というSheetにコピーし、コピーした行を削除。 その処理の前に、メッセージボックスで処理を進めて問題ないか確認する。。。です。 メッセージボックスでの処理分岐を入れようとして、色々記述を変えたところ、エラーになってしまいました。。。 どなたか、お詳しい方がいらっしゃいましたら、誤っている箇所をご指摘、ご教授いただけないでしょうか。 それから、もし可能であれば件数が0件の場合は、「対象なし」と表示したいです。 どうぞ宜しくお願いいたします。 Sub 終了処理() Dim cnt As Long Dim chk As Integer Dim i, LastRow As Long Dim myMsg1 As String, myMsg2 As String myMsg1 = "終了件数は" myMsg2 = "件です。完了しますか?" cnt = WorksheetFunction.CountIf(ActiveSheet.Range("A3:A65536"), "OK") chk = MsgBox(myMsg1, cnt, myMsg2, vbYesNo) If chk = vbYes Then LastRow = Cells(Rows.Count, 4).End(xlUp).Row For i = 1 To LastRow If Cells(i, 4) = "OK" Then Rows(i).Copy Sheets("終了リスト").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Rows(i).Delete shift:=xlUp Next i End If End Sub どうぞ宜しくお願いいたします。

  • マクロ実行中エラーが発生する

    いつも回答して頂きありがとうございます。 ws.Cells(7, c).ClearContentsの箇所で『excel2010』ではエラーが発生しませんでしたが、『excel2003』ではエラーが発生しました。(オブジェクトが・・・・みたいなコメント有。)原因は何でしょうか?御指導の程宜しくお願い致します。 Sub 特定のシート以外の最終履歴と次回予定日を算出する() Dim ws As Worksheet For Each ws In Worksheets If ws.Name <> "一覧" Then If ws.Name <> "メニュー" Then Dim c As Integer c = 3 Do While ws.Cells(2, c).Value <> "" With ws.Cells(6, c) .FormulaR1C1 = "=MAX(R8C:R10000C)" If .Value = 0 Then .Value = "履歴無し" ws.Cells(7, c).ClearContents'ここでエラーが発生 Else .Value = .Value ws.Cells(7, c) = DateAdd("d", ws.Cells(5, c), DateAdd("m", ws.Cells(4, c), DateAdd("yyyy", ws.Cells(3, c), ws.Cells(6, c)))) End If End With c = c + 1 Loop End If End If Next End Sub

  • 検索マクロ

    下記のマクロは、検索文字でシートを検索し、そのセルアドレス情報を シートを追加して表示する機能ですが、BOOK全体に検索し、シート名を含めて表示するには、xxxxのところをどのように変更すればいいか。よろしくお願いします。 Sub kennsaku_Macro1() Dim ret Dim r As Range Dim adr As String Dim cnt As Long Dim psw As Boolean Dim mySht, adSht, ws As Worksheet Set mySht = ActiveSheet ret = Application.InputBox("検索文字列を入力してください") If TypeName(ret) <> "Boolean" Then With mySht.Cells Set r = .Find(ret, LookIn:=xlValues, lookat:=xlPart) If Not r Is Nothing Then adr = r.Address cnt = 2 '2行目から表示 xxxxxxxxxxxxx For Each ws In Worksheets If ws.Name = "検索結果" & ret Then psw = True Exit For End If Next ws If psw Then Set adSht = ws adSht.Cells.ClearContents Else Set adSht = Worksheets.Add adSht.Name = "検索結果" & ret End If adSht.Cells(cnt, 1).Value = r.Value adSht.Cells(cnt, 2).Value = xxxx 'シート名 adSht.Cells(cnt, 3).Value = adr Do Set r = .FindNext(r) If r.Address = adr Then Exit Do Else cnt = cnt + 1 adSht.Cells(cnt, 1).Value = r.Value adSht.Cells(cnt, 2).Value = xxxx 'シート名 adSht.Cells(cnt, 3).Value = r.Address End If Loop End If End With End If adSht.Cells(1, 1).Value = "項目" adSht.Cells(1, 2).Value = "シート名" adSht.Cells(1, 3).Value = "セルアドレス" mySht.Activate End Sub

専門家に質問してみよう