• 締切済み

DataReport(PrintReport)の同期(待ち)について教えてください

只今、VB6のDataReportを使用して500ページほど 印刷したいのですが100ページほどしか印刷されません。 原因は印刷が完了する前にDataReportの解放を行っているためです。 DataReportの解放前に数秒プログラムを停止させる方法があるのですが できればPrintreportメソッドで出力が完了したかの判断を行いたいです。 それに近い質問があり以下のように実行したのですがうまくいきませんでした。 具体的な解決方法があればとてもありがたいです。 【プログラムロジック.vbs】 '起動プロセスのオープン(状態の取得準備) Public Declare Function OpenProcess Lib "KERNEL32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long '起動プロセスとのシンクロ(待機する) Public Declare Function WaitForSingleObject Lib "KERNEL32" _ (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long '起動プロセスのクローズ(終了) Public Declare Function CloseHandle Lib "KERNEL32" _ (ByVal hObject As Long) As Long '起動プロセスが実行中か調べる(状態の取得) Public Declare Function GetExitCodeProcess Lib "KERNEL32" _ (ByVal hProcess As Long, lpExitCode As Long) As Long Public Const SYNCHRONIZE = &H100000 Public Const INFINITE = &HFFFF 【プログラムロジック.frm】 Dim IDProcess As Long Dim hProcess As Long Dim ret As Long IDProcess = Control.PrintReport hProcess = OpenProcess(SYNCHRONIZE, 1, IDProcess) ret = WaitForSingleObject(hProcess, INFINITE) ret = CloseHandle(hProcess) 上記方法でテストしたのですが 「IDProcess」には「1」が返ります。 「hProcess」には「0」が返ります。 スプールにJOBがたまるまで「WaitForSingleObject」で WAITされると思ったのですがとくに待ちになりませんでした。 環境はWindowsXP、Windows2003サーバです。 よろしくお願いします。

みんなの回答

  • sinsia53
  • ベストアンサー率75% (6/8)
回答No.2

解放前に以下の記述をします。 '非同期操作終了待 Do While drt.AsyncCount > 0 DoEvents Loop sleep入れたほうがいいかも?

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

DataReportのPrintReportは クッキーを返すだけでProcesハンドルを返すわけではないと思います アウトプロセスで起動されてるなら EnumProcessesなどでプロセスIDを取得してEnumProcessModulesでモジュールハンドルを取得 GetModuleFileNameExでファイル名を取得して捜し求めるプロセスハンドルを特定 といった手順が必要でしょう … たぶんインプロセスで動いてると思うけど それより DataReportのErrorイベントでエラーになっている原因を探ったほうがいいように思います

関連するQ&A

  • ExcelVBAでのkernel32(64bit)

    今までExcel2000のVBAから、以下のようなコードを使ってC++で作ったコマンドプロンプトで動くプログラムを動かすプログラムを作っていましたが、これを64bitのWindows7上で動いているExcel2010で使おうとしたらメッセージが出ました。いろいろ調べてみたところ、たぶんDeclareにPtrSafeを付ければ良いようなのですが、その際、他のコードはそのままで良いのでしょうか。特に、コード中のLongはそのままで良いのか気になるのですが...。ちなみに、下記コードの条件コンパイルはネットで調べて見よう見まねで付けたもので、Excel2000のときには付けていないものでした。ご存じの方がいらっしゃいましたらご教授ください。 '------------------------------------------------------------------------------ ' Win32 API関数・定数の宣言 '------------------------------------------------------------------------------ #If VBA7 And Win64 Then '64bit Declare PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _   ByVal dwMilliseconds As Long) As Long Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _   ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long #Else '32bit Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _   ByVal dwMilliseconds As Long) As Long Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _   ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long #End If Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Private Const INFINITE As Long = &HFFFF '------------------------------------------------------------------------------ ' Run '------------------------------------------------------------------------------ Public Sub Run(ByVal project_name As String)   Dim program As String   Dim task_id As Long   Dim h_proc As Variant   program = mdlFunc.ProgramPath() & mdlFunc.ProgramOption(project_name) 'プログラム名   task_id = Shell(program, vbHide)   h_proc = OpenProcess(PROCESS_ALL_ACCESS, False, task_id)   If OpenProcess(PROCESS_ALL_ACCESS, False, task_id) <> vbNull Then     Call WaitForSingleObject(h_proc, INFINITE)     CloseHandle h_proc   End If End Sub

  • GetProcessWorkingSetSizeでエラーが発生します

    VB6で画像処理アプリケーションの開発を行っている者です。 下記記述でワーキングセット領域を変更しようとしていますが、GetProcessWorkingSetSizeの部分でエラーが発生します。 使用PCにより、「問題が発生したため、Visual Basic を終了します。 ご不便をおかけして申し訳ありません。」や有無を言わさず開発環境が終了してしまう場合がありますが、いずれにしても原因が分かりません。 どなたかアドバイスいただけませんでしょうか? よろしくお願い致します。 (標準モジュールで宣言) Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long Declare Function GetProcessWorkingSetSize Lib "kernel32" (ByVal qq As Integer, ByVal pp As Integer, ByVal rr As Integer) As Long Declare Function SetProcessWorkingSetSize Lib "kernel32" (ByVal phph1 As Long, ByVal wkminwkmin1 As Long, ByVal wkmaxwkmax1 As Long) As Long Declare Function GetLastError Lib "kernel32.dll" () As Long (実行部) Sub WorkingSetChange() Dim id As Long 'アプリケーションプログラムのID用変数 Dim ph As Long 'アプリケーションプログラムのハンドル用変数 Dim wkmin As Long '最小ワーキングセット用変数 Dim wkmax As Long '最大ワーキングセット用変数 Dim bret As Long Const PROCESS_SET_QUOTA = &H100 Const PROCESS_QUERY_INFORMATION = &H400 'アプリケーションプログラムのIDを取得する id = GetCurrentProcessId() 'アプリケーションプログラムのハンドルをオープンする ph = OpenProcess(PROCESS_SET_QUOTA + PROCESS_QUERY_INFORMATION, False, id) 'アプリケーションプログラムの最大ワーキングセット値と最小ワーキングセット値を取得 bret = GetProcessWorkingSetSize(ph, wkmin, wkmax) '最小ワーキングセット値を1MBに設定 wkmin = 1 * 1024 * 1024 '最大ワーキングセット値を3MBに設定 wkmax = 3 * 1024 * 1024 'アプリケーションプログラムの最大ワーキングセット値と最小ワーキングセット値を変更 bret = SetProcessWorkingSetSize(ph, wkmin, wkmax) 'アプリケーションプログラムのハンドルをクローズする bret = CloseHandle(ph) End Sub

  • UWSCがうまく動かない

    ExcelからUWSCを使って他のソフト2個を動かして又、Excelに 戻ってくるのですが、UWSCが重なって動作を同時に行う為、次のソフトで実行してみました。すると同時には動作せずに1個のプログラムの動作が終わって次ののプログラムを実行してくれて良くのですが、戻るときにExcelプログラムが真っ白に表示されて上の部分にファイル名と応答無と出てそれ以上進みません。UWSCソフトを終了すれば元には戻りますが、うまく操作をさせるにはどうすれば良いですか?よろしくお願いします。 UWSCの動きは⇒スタートボタンの横のタスクバーにあるソフトをクリックから始まり⇒終わったら又、Excelのタブをクリックして戻ります。 次のソフトはWebで見つけたソフトです。 外部プログラムの実行と処理待ち そこで、以下のサンプルマクロでは、Shell関数を使用して外部プログラムを実行し、そのプログラムが終了するまで待つように処理を施してあります。 *もうひとつの質問ですが、Win32 API関数の宣言はどこに記載をすればいいのですか? このままエディータに書けばいいのでしょうか '--- Win32 API 関数の宣言 --- Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _ ByVal dwMilliseconds As Long) As Long Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long '--- Win32 API 定数の宣言 --- Global Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Global Const INFINITE As Long = &HFFFF Sub WaitRun() Dim TaskId As Long 'タスクID Dim hProc As Variant 'プロセスハンドル ' 外部プログラムの実行 TaskId = Shell("c:\Test.bat", 2) ' プロセスハンドルの取得 hProc = OpenProcess(PROCESS_ALL_ACCESS, False, TaskId) ' プロセスのオープン If OpenProcess(PROCESS_ALL_ACCESS, False, TaskId) <> vbNull Then ' プロセスのシグナル待ち Call WaitForSingleObject(hProc, INFINITE) ' プロセスクローズ CloseHandle hProc End If

  • VBAでSetTextColorがうまくいかない

    EXCELのVBAでユーザーフォームを使ったグラフィック表示のプログラムを 作っているのですが、SetTextColorでテキスト色の設定をしようと してもうまくいきません。何故か設定しようとする色の値が無視されて 「1304008」が設定されてしまいます。(GetTextColorで確認) そしてそれ以降何を設定してもこの状態のままです。 何か考えられることがありますでしょうか。 下にそのプログラムを示します。 ちなみにSetBKColorやAngleArcなど他のグラフィック命令は問題なく 動いていてSetTextColorだけがうまくいってない状態です。 '------------------------------------------------- ' ユーザーフォーム用プログラム '------------------------------------------------- Private Declare Function GetActiveWindow Lib "user32" () As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, _ ByVal lpszWindow As String) As Long Private Declare Function GetDC Lib "user32" ( _ ByVal hWnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" ( _ ByVal hWnd As Long, _ ByVal hdc As Long) As Long Private Declare Function SetTextColor Lib "gdi32" _ (ByVal hdc As Long, crColor As Long) As Long Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" _ (ByVal hdc&, ByVal x&, _ ByVal y&, ByVal lpString$, ByVal nCount&) As Long Dim hWnd As Long Dim hdc As Long Public Sub UserForm_Activate() DoEvents hWnd = FindWindowEx(GetActiveWindow, 0, "F3 Server 60000000", "") hdc = GetDC(hWnd) ret = SetTextColor(hdc, RGB(255, 0, 0)) ret = TextOut(hdc, 0, 0, "abc", 3) Call ReleaseDC(hWnd, hdc) End Sub '-------------------------------------------------

  • マウスのある個所の色

    お世話になります よろしくお願いします Pictureboxをクリックされたときに そのPictureboxがクリックされた箇所の色を16進数で取得したいのですが うまくいきません どこが間違っているのか教えてもらえないでしょうか? ソースは Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub Picture1_Click() Dim Poi As POINTAPI Dim iro As Long GetCursorPos Poi iro = GetPixel(Me.Picture1.hdc, Poi.x, Poi.y) Me.Label2.Caption = Poi.x Me.Label3.Caption = Poi.y Me.Label1.Caption = iro CloseHandle (Me.Picture1.hdc) End Sub GetPixcelの引数に-1しか入りません あと、もし数値で取れたとして それを16進数にする方法を教えてください よろしくお願いします

  • 64ビットエクセルでのAPI宣言/PtrSafe

    エクセルのInputboxで、入力された文字列を自動的にアスタリスクで隠すようにする方法を探し http://okwave.jp/qa/q2371878.html の回答No1のコードがまさに最適なコードで、これまで非常に助かっていました。 ところが、64bitのエクセルでは動かないことがわかりました。 表示されたエラーメッセージの言葉から調べて、PtrSafeという言葉を入れなければならないようなのでAPI宣言を以下のようにしてみました。 #If VBA7 And Win64 Then '64ビット版 Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare PtrSafe Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long #Else '32ビット版 Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long #End If ところが、回答No1のコードで Sub Report_Open() を実行すると Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, _ Optional YPos, Optional HelpFile, Optional Context) As String のところがハイライトされてエラーになります。 どう直せば良いのでしょうか? 全文のコードを乗せると字数制限に引っかかりますので、申し訳ありませんが宣言以外の部分は http://okwave.jp/qa/q2371878.html の回答No1のコードを見てくださいますようお願いします。

  • VB6 二重起動確実防止について

    VB6 SP5にて2重起動確実な防止処理をいれようとCreateMutex 関数を使用しようと思っています。 CreateMutex 関数を埋め込んでEXEを実行すると 実際に対象となるプログラムが起動しているにも関わらず起動してしまいます。 何がいけないのか?検討がつかず困っています。 下記がプログラムになります。 何かわかりましたらご回答の程、よろしくお願い致します。 ***Win32API**************** Option Explicit ' CreateMutex 関数 Private Declare Function CreateMutex Lib "KERNEL32.DLL" Alias "CreateMutexA" ( _ ByRef lpMutexAttributes As Long, _ ByVal bInitialOwner As Long, _ ByVal lpName As String _ ) As Long ' CloseHandle 関数 Private Declare Function CloseHandle Lib "KERNEL32.DLL" ( _ ByVal hObject As Long _ ) As Long ************************************ SUB MAIN********************************* Public Sub Main() Dim hMutex As Long hMutex = CreateMutex(ByVal 0&, 0&, App.Title) On Error GoTo Err_Main If Err.LastDllError = 0 Then Dim cForm As Form1 Set cForm = New Form1 Call cForm.Show(vbModal) End If Err_Main: If hMutex <> 0 Then Call CloseHandle(hMutex) End If End Sub ************************************************

  • VBAでIEの「ファイルのダウンロード」ダイアログを制御

    VBではなくVBAにて、IEの「ファイルのダウンロード」ダイアログを制御したいと思い、過去の同様の質問等を参考に下記のソースを作成して動かしてみましたが、「ファイルのダウンロード」画面で、「保存(S)」ボタンのハンドルを取得するところまではできましたが、sendMessageでクリックができず、次に進むことが出来ませんでした。 手動で「保存(S)」ボタンを押下して、強制的に「名前を付けて保存」画面に遷移させた後プログラムを再開すると、同画面の「保存(S)」ボタンのクリックはできました。 同じロジックで「名前を付けて保存」画面の「保存(S)」は動くのに、「ファイルのダウンロード」画面の「保存(S)」が動かないのはなぜでしょうか。 どなたかおわかりになる方がいらっしゃいましたら、ご回答をお願いします。 ***使用環境*** OS: XP pro IE: 6 OFFICE:2002 ***以下作成したソース(エラー制御は省略)*** Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetDlgCtrlID Lib "user32" (ByVal hwnd As Long) As Long Private Sub Test() Dim ret1 As Long Dim ret2 As Long Const WM_COMMAND As Long = &H111 ret1 = FindWindow("#32770", "ファイルのダウンロード") ret2 = FindWindowEx(ret1, 0, "Button", "保存(&S)") Call SendMessage(ret1, WM_COMMAND, GetDlgCtrlID(ret2), ByVal ret2) ret1 = FindWindow("#32770", "名前を付けて保存") ret2 = FindWindowEx(ret1, 0, "Button", "保存(&S)") Call SendMessage(ret1, WM_COMMAND, GetDlgCtrlID(ret2), ByVal ret2) End Sub ***以上ソース終わり***

  • WinAPIで電卓をクリック

    現在、WinAPIを勉強しており、練習としてVBAを用いて、電卓アプリのボタンをクリックしようとしています。 キーを送るのではなく、クリックで行いたいたいと 考えています。 ボタンのハンドルを取得するところまではできましたが、sendMessageでクリックできず、EditBoxに数字が 入りません。 どのようにすればよいのかご教授ください。 よろしくお願い致します。 環境: WinXP home、 Excel2002、Win付属アプリの電卓v5.1 ---作成したプログラム---- '標準モジュールの中身 Option Explicit Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long Private Const WM_LBUTTONDOWN = &H201 Private Const WM_LBUTTONUP = &H202 Sub Main() Dim lngWindWnd As Long 'ウィンドウハンドル Dim ret As Long Dim hCalc As Long 'アプリケーションタイトルより、ウィンドウハンドルを得ます lngWindWnd = FindWindow(vbNullString, "電卓") '8ボタンのハンドル(確実に取れていることを確認 hCalc = FindWindowEx(lngWindWnd, 0, "Button", "8") ret = SetForegroundWindow(lngWindWnd) ret = SendMessage(hCalc, WM_LBUTTONDOWN, 0, 0) End Sub

  • WriteFileの引数について

    APIを学習中の初心者です。 サンプルコードにあったのですが、test0623.txt のテキストを作成し、「abcde」と書き込むというものです。 Const GENERIC_WRITE = &H40000000 Const GENERIC_READ = &H80000000 Const FILE_ATTRIBUTE_NORMAL = &H80 Const CREATE_ALWAYS = 2 Const OPEN_ALWAYS = 4 Const INVALID_HANDLE_VALUE = -1 Private Declare Function CloseHandle Lib "kernel32" ( _ ByVal hObject As Long) As Long Private Declare Function WriteFile Lib "kernel32" ( _ ByVal hFile As Long, lpBuffer As Any, _ ByVal nNumberOfBytesToWrite As Long, _ lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long Private Declare Function CreateFile Lib "kernel32" _ Alias "CreateFileA" (ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _ ByVal lpSecurityAttributes As Long, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Sub test1() Dim hFile As Long Dim FileName As String Dim Sampledata() As Byte Dim BytesToWritten As Long Dim SC As Long FileName = "test0623.txt" SC = StrConv("abcde", vbFromUnicode) hFile = CreateFile(FileName, GENERIC_WRITE Or GENERIC_READ, _ 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) SC = WriteFile(hFile, Sampledata(0), _ UBound(Sampledata), BytesToWritten, 0) Call CloseHandle(hFile) End Sub とあったのですが質問は以下の通りです。    (1) SC = WriteFile(hFile, Sampledata(0), UBound(Sampledata), BytesWritten, 0) で、な ぜ、lpBuffer(第1引数)にSampledata(0)を指定すれば、ファイルに書き込むべきデータを保持しているバッファへのポインタになるのか?またSampledata(0)のように配列にする理由が不明? (2) SC = WriteFile(hFile, Sampledata(0), UBound(Sampledata), BytesWritten, 0) で、なぜ、  nNumberOfBytesToWrite(第2引数)に UBound(Sampledata)を指定すれば、ファイルに書き込むべきバイト数になるのか?ここで、0を指定すると、何も書き込まないらしい。 (3) SC = WriteFile(hFile, Sampledata(0), UBound(Sampledata), BytesWritten, 0) で、なぜ、lpNumberOfBytesWritten(第3引数)に何の値も格納していない BytesWritten を記述しているのか?MSDNライブラリには、「関数から制御が返ると、この変数に、実際に書き込まれたバイト数が格納されます。」とあるので、指定しなくてよいのか?    (4) Pathを指定していないが、なぜか、C:\Users\123\Documents に作成される。 以上です。よろしくお願いします

専門家に質問してみよう