エクセルVBAでのCSV出力方法について

このQ&Aのポイント
  • エクセルVBAを使ってCSVを出力する方法についての質問です。
  • シート1の内容をCSV化するためのVBAコードについて、修正のアドバイスを求めています。
  • シート2のコマンドボタンを押すことで、シート1の内容をCSVに出力したいと思っています。
回答を見る
  • ベストアンサー

エクセルVBAでのCSV出力方法について

エクセルVBAを使ってCSVを出力しようとしているのですが、 狙った範囲を上手くCSV化することが出来ずに苦戦しています。 どなたかアドバイスを頂けませんでしょうか。 使用してるエクセルは2010になります。 シート2のコマンドボタンを押すことでシート1の内容をCSV化したいと考えています。 シート1のA1に入力した内容がCSVのタイトルになります。 2行目はヘッダーですが、CSVには反映しないように制御をかけています。 ↓が実際に書いてみたVBAですが、どうしてもシート1の内容を持ってきてしまいます。 どのように改修したらシート2の内容を持ってこれるでしょうか。 Private Sub CommandButton1_Click() Dim MyFile, FileType, Prompt As String Dim FileNamePath As Variant Dim StartRow, StartCol, EndRow, EndCol As Integer Dim Rowcnt, Colcnt As Integer Dim UsedCell As Range Dim ch1 As Long '対象のシートをアクティブにする Worksheets("シート1").Activate 'ファイル名の取得 MyFile = ActiveSheet.Range("A1") & ".csv" FileType = "CSV ファイル (*.csv),*.csv" Prompt = "保存するファイルの名前を付けてください" '保存するファイルのパスを取得します FileNamePath = SaveFileNamePath(MyFile, FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Output As #ch1 '使用しているセルの取得 Set UsedCell = ActiveSheet.UsedRange StartRow = UsedCell.Cells(3).row StartCol = UsedCell.Cells(1).Column EndRow = UsedCell.Cells(UsedCell.Count).row EndCol = UsedCell.Cells(UsedCell.Count).Column For Rowcnt = StartRow To EndRow For Colcnt = StartCol To EndCol - 1 '改行を挿入しないで書き出す ; を最後に付ける Write #ch1, Cells(Rowcnt, Colcnt); Next '改行を挿入する Write #ch1, Cells(Rowcnt, EndCol) Next 'ファイルを閉じます Close #ch1 End Sub Function SaveFileNamePath(MyFile, FileType, Prompt) As Variant SaveFileNamePath = Application.GetSaveAsFilename(MyFile, FileType) End Function アドバイスを頂けたらと思います。 どうぞ宜しくお願いします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.5

ご相談の書き間違いまで全部想定して「ご相談に書かれてることが全部正しければこう、ここが間違いてる場合はこう、あっちが間違いならこう」と回答しなきゃダメですかね。 まぁでも、こちらの回答1にもマクロの読み違いがあったので、一応チャラということで。 改めて。 でもふつーに各部で「ここはシート1から持ってくる」「こっちはシート2から持ってくる」と、丁寧に作成してみればよいだけでは。  : 'ファイル名の取得 MyFile = worksheets("sheet1").Range("A1") & ".csv"  ’★  : '使用しているセルの取得 Set UsedCell = worksheets("Sheet1").UsedRange ’★  : Write #ch1, worksheets("Sheet1").Cells(Rowcnt, Colcnt);  ; Write #ch1, worksheets("Sheet1").Cells(Rowcnt, EndCol) 結局最後の2か所でシートを指定していないのが、直接の敗因です。 シートモジュールに記載したマクロでは、明示的にシートを修飾してない場合はアクティブシートじゃなく自シートを参照します。

Hiroron12
質問者

お礼

いつもご回答下さり、ありがとうございます。 シートをアクティブにしていれば、そちらを参照するものだと勘違いしていました。 ありがとうございました。 無事実行することが出来ました。

その他の回答 (4)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.4

> Worksheets("シート1").Activate Worksheets("シート1").Select としたらどうなります?

Hiroron12
質問者

お礼

ご回答ありがとうございます。 すみません、見逃してしまっていました。 早速試して見たいと思います。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.3

STEP実行中にクリックして切替る等、ご自身でActiveSheetを変更してませんか? 書き間違いとは「どこが」「どう」間違い?

Hiroron12
質問者

お礼

書き間違いはVBAそのものではなく、説明文の方です。 すみません。 シート1をCSV化したいのにシート2をCSV化したいと書いていました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

> '対象のシートをアクティブにする > Worksheets("シート1").Activate コードのはじめで、シート1を指定してるじゃないですか。 そのままでデータ本体を出力し始めるから、シート1のまま。 ヘッダー処理が済んだら、シート2をActivateして下さい。 ファイルオープンの後かな

Hiroron12
質問者

お礼

すみません。 書き間違えてしまいました。 先ほどのVBAで実行しても、【シート2】の内容を持って来てしまう、の誤りです。 本当は【シート1】の内容を持って来ようと思っています。 失礼しました。 改めて教えて頂ければ嬉しいです。 宜しくお願い致します。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

はて?? ご相談の状況説明: >シート2のコマンドボタンを押すことでシート1の内容をCSV化したいと考えています。  : >どうしてもシート1の内容を持ってきてしまいます。 >どのように改修したらシート2の内容を持ってこれるでしょうか。 実際のマクロ: >'対象のシートをアクティブにする >Worksheets("シート1").Activate  : >'使用しているセルの取得 >Set UsedCell = ActiveSheet.UsedRange  : あと、 >シート1のA1に入力した内容がCSVのタイトルになります。 このご説明も実際のマクロとは食い違っています。 -------------------------- それで結局。 ヤリタイ事: 1.CSVのファイル名はシート1記載の内容じゃなくて、マクロ動作中にインプットしたい 2.シート2のデータを書き出したい 現在のマクロの修正箇所 変更前: '対象のシートをアクティブにする Worksheets("シート1").Activate 変更後: '対象のシートをアクティブにする Worksheets("シート2").Activate 以上です。

Hiroron12
質問者

お礼

すみません。 書き間違えてしまいました。 先ほどのVBAで実行しても、【シート2】の内容を持って来てしまう、の誤りです。 本当は【シート1】の内容を持って来ようと思っています。 失礼しました。 改めて教えて頂ければ嬉しいです。 宜しくお願い致します。

関連するQ&A

  • CSVの読み込み処理について

    こんばんわです。 エクセルのVBAをつかってCSV形式のファイルデーターを読み込みように某サイトを参考に作成しました。 確かに読み込む事が出来たのですが、数値も文字列扱いになってしまいます。 数値処理する方法があるのでしょうか? Sub CSV_Read2() Dim FileType, Prompt As String Dim FileNamePath As Variant Dim textline, csvline() As String Dim Rowcnt, ColumNum As Integer Dim ch1 As Long FileType = "CSV ファイル (*.csv),*.csv" Prompt = "CSV File を選択してください" '操作したいファイルのパスを取得します FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 'エラーが発生したらファイルを閉じます 'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、 '色々なCSVがあるようなので入れておきます On Error GoTo CloseFile '表の行番号の初期化 1行目から読み込んだデータを入力します Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 '1行読み込みます Line Input #ch1, textline 'ダブルクォーテーションを削除します 'カンマ+ダブルクォーテーションで区切られている CSV ファイルなどは '適時追加してください textline = Replace(textline, """", "") 'カンマで分離します csvline() = Split(textline, ",") '配列渡しでセルに代入 Range(Cells(Rowcnt, 1), Cells(Rowcnt, UBound(csvline()) + 1)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: 'ファイルを閉じます Close #ch1 End Sub Function SelectFileNamePath(FileType, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt) End Function Function GetItemNum(FileNamePath) As Integer Dim ch1 As Long Dim textline As String '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 Line Input #ch1, textline '1行だけ読み込みます。 Close #ch1 GetItemNum = 1 '1行中のカンマの数を数えます Do GetItemNum = GetItemNum + 1 textline = Mid(textline, InStr(textline, ",") + 1) Loop Until InStr(textline, ",") = 0 End Function

  • \記号が入った数値の処理について(VBA)

    はじめまして。 excel2013でcsvの読み込みをVBAで自動化させようとしています。 基となるCSVファイルに\記号が含まれておりファイルを読み込むと文字列として読まれてしまいまい、エラーインジケータが表示されます。 文字と読み込まれているので計算もできないでいます。 数値に置き換える方法として考えられる事はないでしょうか? ご教授お願いいたします。 ------------------------------- ソース Sub Read() Dim FileType, Prompt As String Dim FileNamePath As Variant Dim csvline() As String Dim i, Rowcnt, ColumNum As Integer Dim ch1 As Long FileType = "CSV ファイル (*.csv),*.csv" Prompt = "CSV File を選択してください" '操作したいファイルのパスを取得します FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '1行あたりの項目数を取得します ColumNum = GetItemNum(FileNamePath) 'csvlineを1行あたりの項目数で再割り当てます ReDim csvline(1 To ColumNum) '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 'エラーが発生したらファイルを閉じます 'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、 '色々なCSVがあるようなので入れておきます On Error GoTo CloseFile '表の行番号の初期化 1行目から読み込んだデータを入力します Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認します。 For i = 1 To ColumNum Input #ch1, csvline(i) '1行の項目数だけ読み込みます Next '配列渡しでセルに代入 この方が早い Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: 'ファイルを閉じます Close #ch1 End Sub Function GetItemNum(FileNamePath) As Integer Dim ch1 As Long Dim textline As String '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Input As #ch1 Line Input #ch1, textline '1行だけ読み込みます。 Close #ch1 GetItemNum = 1 '1行中のカンマの数を数えます Do GetItemNum = GetItemNum + 1 textline = Mid(textline, InStr(textline, ",") + 1) Loop Until InStr(textline, ",") = 0 End Function Function SelectFileNamePath(FileType, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt) End Function ----------------------- CSVファイル \101,\101,\101

  • このようなエクセルマクロを作りたいのですが・・・

    ,で区切られたasc形式のファイルを、エクセル上に出力したいです。 ファイルは大体12万行くらいあります。 やりたいこと) 1. 任意のファイルを読み込む。 2. ,毎に区切って「数値」として出力する。(,は2つあるので、データはABC列に出力されることになります) 3. 32000行を越えたら、DEF列に出力する。 4. DEF列でも再び32000行(合計64000行読み込んだ)を越えたらGHI列に・・・ 5.データがなくなったら終了 ということがやりたいです。 現在、ファイルを読み込んで区切るところまでは出来たのですが、3のところで躓いています。ソースを書いておきますので、どのようにやればいいのでしょうか? 途中で、IF Rowcnt > 32000 then・・・とやると上手くいきそうなのですが、様々なエラーに阻まれてお手上げです・・・ また、このマクロで出力すると、必ず「文字列」として出力されてしまうのですが、どうやれば最初から「数値」として出力してくれるのでしょうか?どこか宣言を誤ったのでしょうか・・・ つたない文章ですが、ご指導のほどよろしくお願いいたします。 Sub CSV_Read() Dim FileType, Prompt As Variant Dim FileNamePath As Variant Dim csvline() As String Dim i, Rowcnt, ColumNum As Integer Dim ch1 As Variant FileType = "asc ファイル (*.asc),*.asc" Prompt = "ファイルを選択してください" FileNamePath = SelectFileNamePath(FileType, Prompt) If FileNamePath = False Then End End If ColumNum = GetItemNum(FileNamePath) '1行あたりの項目数を取得します ReDim csvline(1 To ColumNum) 'csvlineを1行あたりの項目数で再割り当て ch1 = FreeFile Open FileNamePath For Input As #ch1 'FileNamePath のファイルをオープンします On Error GoTo CloseFile Rowcnt = 1 Do While Not EOF(ch1) 'ファイルの終端かどうかを確認。 For i = 1 To ColumNum Input #ch1, csvline(i) '1行の項目数だけ読み込み Next Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline() Rowcnt = Rowcnt + 1 Loop CloseFile: Close #ch1 End Sub

  • ExcelのVBAの配列に関する質問です。

    ExcelのVBAの配列に関する質問です。 sheet1のデータをsheet2に表示するVBAを作成しています。。 sheet1のデータは7行目からスタートし、sheet2のデータは26行目からスタートしています。。 sheet1とsheet2の列は同じ並びではないため、それぞれのシートの列番号をCellsを用いて指定しています。 Sub test1() Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 Worksheets("sheet2").Cells(j, 1) = Worksheets("sheet1").Cells(i, 2) Worksheets("sheet2").Cells(j, 8) = Worksheets("sheet1").Cells(i, 28) Worksheets("sheet2").Cells(j, 9) = Worksheets("sheet1").Cells(i, 31) Worksheets("sheet2").Cells(j, 10) = Worksheets("sheet1").Cells(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub 上記のtest1は正常に動くのですが、データ量が多いため、処理に時間がかかってしまいます。 高速化できないかと、以下のように変更しました。 Sub test2() Dim dataRange1 As Variant Dim dataRange2 As Variant dataRange1 = Worksheets("sheet1").Range("A1:GI10006") dataRange2 = Worksheets("sheet2").Range("A1:DZ10018") Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 dataRange2(j, 1) = dataRange1(i, 2) dataRange2(j, 8) = dataRange1(i, 28) dataRange2(j, 9) = dataRange1(i, 31) dataRange2(j, 10) = dataRange1(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。 ちなみに、以下のようにsheet1のみ配列化した場合は、正常に表示されました。 Worksheets("sheet2").Cells(j, 1) = dataRange1(i, 2) Worksheets("sheet2").Cells(j, 8) = dataRange1(i, 28) Worksheets("sheet2").Cells(j, 9) = dataRange1(i, 31) Worksheets("sheet2").Cells(j, 10) = dataRange1(i, 32) test2は、どこが間違っているのでしょうか? ご教示ください。 よろしくお願いいたします。

  • ジャグ配列生成時の1オリジン

    ExcelVBAで、CSVFileを取込み、シートを介さずに 配列へ格納する処理をしています。 尚、一行のデータの数が変わる可能性があるため、 ジャグ配列にしています。  Dim FileNamePath As Variant 'CSVファイルパス  Dim CSVFile() As Variant  Dim ch1 As Long  Dim RowCnt As Long ~略~  ch1 = FreeFile  Open FileNamePath For Input As #ch1  RowCnt = 1  Do While Not EOF(ch1)   ReDim Preserve CSVFile(RowCnt)   Line Input #ch1, CSVFile(RowCnt)   CSVFile(RowCnt) = Replace(CSVFile(RowCnt), """", "")   CSVFile(RowCnt) = Split(CSVFile(RowCnt), ",")   RowCnt = RowCnt + 1  Loop ~略~ この時、後の処理でやりやすくするために配列の添字を 1からにしたく、行の添字となるRowCntを1としています。 同様に列となる添字も1からとしたくて、モジュールの宣言にて 「Option Base 1」としましたが、上記コードでジャグ配列を 生成すると、(多次元配列で言う)2次元目の添字は 0からとなってしまいます。  例:CSVFile(1)(0) このような状況で、ジャグ配列でも1オリジンとするには どのようにすれば良いのでしょうか。 宜しくお願い致します。

  • エクセルでマクロを別のbookにコピペしたら不具合

    いつもお世話になっております。 先日ここで下記のマクロを教わって非常に感動して使い始めて、今日は他のbookへも展開しようとしたのですが、何故かコピペしたbookではエラーがでて動きません。 何度もの試行錯誤で、保護範囲に結合セルが入った場合エラーになることが分かって以降順調に使えていたのですが。 > With ThisWorkbook.Sheets(MySheet) が黄色にハイライトになります。 bookやシートを特定するようなコードは無いように思うのですが。 何が悪いのでしょう? 問題ないbookとどこが違うのでしょう? =================================== Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const RowS = 16 'ロック範囲開始行 Const RowE = 500 'ロック範囲終了行’ Const ColS = 1 'ロック開始列 Const ColE = 8 'ロック終了行 Const MyPassword = "" 'パスワード(省略可) Const MySheet = "入力表" '保護したいシート名 Dim RowCnt As Long Dim ColCnt As Long With ThisWorkbook.Sheets(MySheet) .Unprotect Password:=MyPassword For RowCnt = RowS To RowE For ColCnt = ColS To ColE If .Cells(RowCnt, ColCnt).Value <> "" Then .Cells(RowCnt, ColCnt).Locked = True Else .Cells(RowCnt, ColCnt).Locked = False End If Next ColCnt Next RowCnt .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub =====================================

  • エクセルVBA CSVファイル出力について

    エクセルVBAでCSVファイル出力マクロを作成しています。 本を参考にして作成したのですが、日付のセルで 2007/7/22 8:29:45と記入させているのが #2007-07-22 08:29:45#と言う形で出力 されてしまいます。 そのまま「2007/7/22 8:29:45」と出力させるには どのようにしたらいいのでしょうか? 出力したデーターを基にアクセスに取り込んでデーター ベースにしようと思っているのですが、「#」がある ため、そのまま、時刻関数で取り込めないもので 困っています。 コードは以下のように書いてあります。 Sub WriteCsv() Dim myTxtFile As String, myFNo As Integer Dim myLastRow As Long, i As Long Dim ShName As String Application.ScreenUpdating = False ShName = ActiveSheet.Name myTxtFile = ActiveWorkbook.Path & "\" & ShName & ".csv" myLastRow = Range("A1").CurrentRegion.Rows.Count myFNo = FreeFile Open myTxtFile For Output As #myFNo For i = 1 To myLastRow Write #myFNo, Cells(i, 1), Cells(i, 2), Cells(i, 3) Next Close #myFNo MsgBox "このシートを元に「" & ShName & ".csv」を作成しました" End Sub 宜しくお願いいたします。

  • エクセルでシートを保護するマクロの関数化

    いつもお世話になっております。 先日ここで複数の人が使用するエクセル(Ver.2016)シートで、入力されたセルだけに保護をかける下記のコードを教わって使い始めたのですが、当方にとっては非常に有益な機能なので他のブック、シートでも簡単に使えるようにマクロ化して関数で使えるようにしたいと思ったのですが、シートにより保護対象の行数と列数がちがうのでこのままでは関数化しても意味がないことに気付きました。 また、特定のセルに適用する関数ではないのでどうやって使うのかもわからないことに気付きました。 やりたいことは、どこかのセルで 関数=HOGO(範囲)、もしくは=HOGO(範囲、パスワード :省略可)のような使い方ができれば理想なのですが。 当方マクロはほとんど使えないので上記のようなことができるのかどうかもわからないのですが、もしできれば非常に便利な関数ですのでお知恵を拝借したく。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const RowS = 16 'ロック範囲開始行 Const RowE = 500 'ロック範囲終了行’ Const ColS = 1 'ロック開始列 Const ColE = 8 'ロック終了行 Const MyPassword = "" 'パスワード(省略可) Const MySheet = "入力表" '保護したいシート名 Dim RowCnt As Long Dim ColCnt As Long With ThisWorkbook.Sheets(MySheet) .Unprotect Password:=MyPassword For RowCnt = RowS To RowE For ColCnt = ColS To ColE If .Cells(RowCnt, ColCnt).Value <> "" Then .Cells(RowCnt, ColCnt).Locked = True Else .Cells(RowCnt, ColCnt).Locked = False End If Next ColCnt Next RowCnt .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub

  • VBA コピペ Range エラー

    いつもありがとうございます。 https://okwave.jp/qa/q9586463.html この質問のコードを自力で実務用に改変中です。 GetShe.Range(Cells(RowCnt, 1), Cells(RowCnt, 2)).Copy PutShe.Cells(PutRowCnt, 1) ↑このコードでRangeメソッドが失敗しましたというエラーが出るのですが、超初心者のため、原因がわかりません。 GetSheシートのRowCnt行の1列目と2列目をコピーして、PutSheシートのPutRowCnt行の1列目に貼り付けしたいです。 ○番目のシート、行という意味です。 お願いします。 Sub msukei6() ' 変数を宣言 Dim GetShe As Worksheet Dim PutShe As Worksheet Dim SheCnt As Long Dim RowCnt As Long Dim ColCnt As Long Dim PutRowCnt As Long Dim x As Long ' このブックに何シートあるか調べる SheCnt = ThisWorkbook.Worksheets.Count ' "集計"シートが抽出先である Set PutShe = ThisWorkbook.Worksheets("集計") PutRowCnt = 9 For SheCnt = 4 To 6 ' コピー元は4シート目~6シート目 Set GetShe = ThisWorkbook.Worksheets(SheCnt) ' 各シートの氏名をカウントする x = WorksheetFunction.CountA(GetShe.Range("b3:b100")) Do For RowCnt = 3 To x + 3 ' コピー元は3行目からコピーする If GetShe.Cells(RowCnt, Worksheets("集計").Cells(4, 2)) <> "" Then PutRowCnt = PutRowCnt + 1 GetShe.Range(Cells(RowCnt, 1), Cells(RowCnt, 2)).Copy PutShe.Cells(PutRowCnt, 1) End If Next RowCnt Exit Do Loop Next SheCnt End Sub

  • Excel 2010 VBA:ファイル名を読み込む

    下は複数のcsvファイルを一つに合体するVBAです。これにシートの右端に読み取ったファイル名を追加するにはどうしたらよいでしょうか。 よろしくお願いします。 Sub macro1() Dim myPath As String Dim myFile As String Dim s As String myPath = ThisWorkbook.Path & "\" On Error Resume Next Kill myPath & "合体版.csv" On Error GoTo 0 myFile = Dir(myPath & "*.csv") If myFile = "" Then Exit Sub Open myPath & "合体版.csv" For Output As #1 Do Until myFile = "" Open myPath & myFile For Input As #2 Do Until EOF(2) Line Input #2, s Print #1, s Loop Close #2 myFile = Dir() Loop Close #1 End Sub

専門家に質問してみよう