• ベストアンサー

グループごとの集計、全体の集計について

いつもお世話になっております。 VBAでの課題で行き詰ってしまったので、どなたかお力をお貸しいただけないでしょうか? コードの効率のよい書き方が分からないため 非常に長くなってしまいますが、すべて書かせていただきます。 課題は A グループ1 商品1    300000 A グループ1 商品2    460000 A グループ2 商品1    120000 A グループ2 商品2     80000 A グループ3 商品3     71000 B グループ1 商品1    200000 B グループ1 商品2    208000 B グループ2 商品1     2300 となっている表を A グループ1 商品1    300000 A グループ1 商品2    460000   グループ1        760000 A グループ2 商品1    120000 A グループ2 商品2     80000   グループ2        200000 A グループ3 商品3     71000   グループ3         71000 支店A            1031000 B グループ1 商品1    200000 B グループ1 商品2    208000   グループ1        408000   B グループ2 商品1     2300   グループ2         2300 支店B            410300 合計(A+B)        1441300 このように、グループが変わるとグループ合計を出し、 支店名が変わると支店合計を出し、 最終的にすべての合計を出力するコーディングをしています。 今回は配列変数を使わないということなのですが 以下のような流れで考えました '変数の宣言 Dim X As String Dim Y As String Dim siten_A As String '支店名 Dim siten_B As String Dim kubun_A As String '区分 Dim kubun_B As String Dim syohin_A As String '商品名 Dim syohin_B As String Dim kingaku_A As Long '金額 Dim kingaku_B As Long Dim k_goukei As Long '区分合計 Dim s_goukei As Long '支店合計 Dim goukei As Long '合計 'ファイルを開く Open "C:\My Documents\INFILE.txt" For Input As #1 Open "C:\My Documents\OUTFILE.txt" For Output As #2 '1行目を読み込み、変数に格納 Line Input #1, X siten_A = Left(X, 10) kubun_A = Mid(X, 11, 10) kingaku_A = Right(X, 8) syohin_A = Mid(X, 21, 15) Do Until EOF(1) '2行目以降を読み込み変数に格納 Line Input #1, Y siten_B = Left(Y, 10) kubun_B = Mid(Y, 11, 10) kingaku_B = Right(Y, 8) syohin_B = Mid(Y, 21, 15) If siten_A = siten_B And kubun_A = kubun_B Then Print #2, siten_A & kubun_A & syohin_A & kingaku_A k_goukei = kingaku_A + kingaku_B kingaku_A = kingaku_B siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B ElseIf siten_A = siten_B And kubun_A <> kubun_B Then Print #2, siten_A & kubun_A & syohin_A & kingaku_A s_goukei = s_goukei + k_goukei k_goukei = k_goukei Print #2, k_goukei siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B kingaku_A = kingaku_B Else Print #2, siten_A & kubun_A & syohin_A & kingaku_A Print #2, k_goukei s_goukei = s_goukei + k_goukei Print #2, s_goukei siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B kingaku_A = kingaku_B End If Loop Print #2, siten_A & kubun_A & syohin_A & kingaku_A k_goukei = k_goukei + kingaku_A Print #2, k_goukei s_goukei = s_goukei + k_goukei Print #2, s_goukei goukei = goukei + s_goukei Print #2, goukei Close #1 Close #2 End Sub となっています。 これを実行すると、各レコードを出力した後に 合計を出したいのですが 各レコードの金額が、一つ前の金額に足されたものになっており 期待通りの出力ができません。 前半で間違っているため、後半の支店合計や全体の合計も 変わってきてしまい、どこをなおせばよいかわからない状態です。 VBは初心者なので、長くなってもかまわないので 教えていただければと思います。 長くなりましたが、よろしくお願いします。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

一見したところ計のクリアーとか計算の仕方に間違いがあるようです。 折角質問者自身で書いたコードですからそれを修正するとして、 (前提条件) 計算違いを除いて上手く動作していること。 以下の▲印は削除して、■を追加すること。   '------------------------------------------------ Sub org() '変数の宣言 Dim X As String Dim Y As String Dim siten_A As String '支店名 Dim siten_B As String Dim kubun_A As String '区分 Dim kubun_B As String Dim syohin_A As String '商品名 Dim syohin_B As String Dim kingaku_A As Long '金額 Dim kingaku_B As Long Dim k_goukei As Long '区分合計 Dim s_goukei As Long '支店合計 Dim goukei As Long '合計 'ファイルを開く Open "C:\My Documents\INFILE.txt" For Input As #1 Open "C:\My Documents\OUTFILE.txt" For Output As #2 '1行目を読み込み、変数に格納 Line Input #1, X siten_A = Left(X, 10) kubun_A = Mid(X, 11, 10) kingaku_A = Right(X, 8) syohin_A = Mid(X, 21, 15) Do Until EOF(1) '2行目以降を読み込み変数に格納 Line Input #1, Y siten_B = Left(Y, 10) kubun_B = Mid(Y, 11, 10) kingaku_B = Right(Y, 8) syohin_B = Mid(Y, 21, 15) If siten_A = siten_B And kubun_A = kubun_B Then Print #2, siten_A & kubun_A & syohin_A & kingaku_A ▲削除▲ k_goukei = kingaku_A + kingaku_B ■k_goukei = k_goukei + kingaku_A kingaku_A = kingaku_B siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B ElseIf siten_A = siten_B And kubun_A <> kubun_B Then Print #2, siten_A & kubun_A & syohin_A & kingaku_A ■k_goukei = k_goukei + kingaku_A s_goukei = s_goukei + k_goukei ▲削除▲k_goukei = k_goukei ■k_goukei = 0 Print #2, k_goukei siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B kingaku_A = kingaku_B Else Print #2, siten_A & kubun_A & syohin_A & kingaku_A ■k_goukei = k_goukei + kingaku_A Print #2, k_goukei s_goukei = s_goukei + k_goukei Print #2, s_goukei ■goukei = goukei + s_goukei ■k_goukei = 0 ■s_goukei = 0 siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B kingaku_A = kingaku_B End If Loop Print #2, siten_A & kubun_A & syohin_A & kingaku_A k_goukei = k_goukei + kingaku_A Print #2, k_goukei s_goukei = s_goukei + k_goukei Print #2, s_goukei goukei = goukei + s_goukei Print #2, goukei Close #1 Close #2 End Sub '-------------------------------------------------- ちょっと試して見てください。 上手くいきましたら同じような部分はひとつで済むようなコードにトライしてみるのも勉強になると思います。  

tao0417
質問者

お礼

非常に分かりやすく教えていただいてありがとうございます。 s_goukeiやk_goukeiを「0」にするのが必要だったのですね!! 教えていただいたおかげで、無事期待通りの出力ができました。 最後にありますように、少しでもスマートなコードを作れるように がんばりたいと思います。 本当にありがとうございました。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

>各項目は字数と(桁数)が決まっており これは質問者さんしか知らない仕様なので、当方は空白で区切って みただけです。Split関数は第1引数を第2引数で分離し、分離後の 配列を返します。これを受け取る変数はVariant型である必要がある ため、「Dim 項目 As Varint」という定義にしてあります。 項目の位置と長さが分かっているならMidでやっても良いです。 >また、IFの分岐で IfはEOFの判断以外に使用していませんが? >支店=支店、区分=区分の場合 この状態ではブレークは発生せず、最も内側のループを繰り返し 実行します。要するに、明細行の出力、小計の加算、次のデータの 読み込みが行われます。 ★最も内側のLoopのUntil条件のいずれにも該当しない。 >支店=支店、区分<>区分の場合 この条件になると、最も内側のループを抜ます。つまり、 「小(区分)ブレークの後処理」が実行されます。 ★最も内側のLoopのUntil条件の「kubun_A <> 項目(1)」に該当する。 Loop Until の後ろの部分が条件式になっています。 ブレークレベルが3なら、Do~Loopのネストも3レベルにならないと おかしいのです。掲題のプログラムではDo~Loopはネストしておらず、 If文で無理やり制御しているようですが、どのような考え方に基いて 作られたか理解できません。プロの場合、先ず考え方を整理し、文書化 してから複数人の検証(レビューと言う)を受けます。ここで、仕様や 考え方の間違いを正し、それからプログラムします。 そういう観点からすると、Do~Loopが3重になっていない段階で、 残念ながら却下です。詳しく調べれば正しい結果が得られるように なっているとしても、「詳しく調べなければ分からない」という 時点で、品質上アウトです。

tao0417
質問者

お礼

回答いただきありがとうございます。 Split関数、今後使えるようになりたいと思います。 理解しづらいコーディングになってしまい申し訳ありません。 プログラミングを始めてまだ1ヶ月なので どういったものが品質上位いいかすら分からない状態なのですが 今後、少しでも無駄のないものを作っていきたいと思います。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

先ず、考え方から整理します。 (1)データは1行につき、支店名、区分、商品名、金額からなり、  空白1文字(ここ大事)で区切られている。 (2)区分が変わった(ブレークと言う)ら小計を出力する。 (3)支店名が変わったら中計を出力する。 (4)最後に全合計を出力する。 ブレーク基準は3個あります。大きい方からEOF、支店名、区分です。 また、合計データも3レベル必要ですね。以下は要点を記述しました。 '** いきなりEOFなら終了する If EOF(1) Then   Close   MsgBox "ファイルが空です"   Exit Sub End If Dim 項目 As Variant '1行の項目の集団(漢字の変数名はOK) Line Input #1, X '先頭データを読み込む 項目 = Split(X, " ") '空白で区切る '★先ず最も外側のブレークを記述します Do   '==ここは中(支店名)ブレークの初期設定です。   s_goukei = 0 '支店合計を初期化   siten_A = 項目(0) '支店用ブレークキー(区切った項目の最初)   '★支店名ブレークを記述します   Do     '== ここは小(区分)ブレークの初期設定です。     k_goukei = 0 '区分合計を初期化     kubun_A = 項目(1) 'kubun用ブレークキー(区切った項目の2番目)     '★区分ブレークを記述します     Do       '明細を出力       Print #2, siten_A, kubun_A, 項目(2), 項目(3)       '小計を計算する       k_goukei = k_goukei + CLng(項目(3))       '次のデータを処理する       If Not EOF(1) Then         Line Input #1, X 'データを読み込む         項目 = Split(X, " ") '空白で区切る       End If     Until EOF(1) Or siten_A <> 項目(0) Or kubun_A <> 項目(1)     '==ここは小(区分)ブレークの後処理です。     Print #2, kubun_A, k_goukei     s_goukei = s_goukei + k_goukei '中計に小計を加算   Until EOF(1) Or siten_A <> 項目(0)   '==ここは中(支店名)ブレークの後処理です。   Print #2, siten_A, s_goukei   goukei = goukei + s_goukei '全計に中計を加算 Until EOF(1) '==大(EOF)ブレークの後処理です。 Print #2,"合計", goukei Close

tao0417
質問者

補足

回答いただき、ありがとうございます。 >Dim 項目 As Variant '1行の項目の集団(漢字の変数名はOK) の意味がよく分からないのですが、 各項目は字数と(桁数)が決まっており siten_B = Left(Y, 10) kubun_B = Mid(Y, 11, 10) kingaku_B = Right(Y, 8) syohin_B = Mid(Y, 21, 15) のように位置を指定して、変数に代入しているのですが それでは駄目なのでしょうか? また、IFの分岐で 支店=支店、区分=区分の場合 支店=支店、区分<>区分の場合 その他の場合 といったようにはできないでしょうか? よろしく尾お願いいたします。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

> 課題は > A グループ1 商品1    300000 > A グループ1 商品2    460000 > A グループ2 商品1    120000 > A グループ2 商品2     80000 > A グループ3 商品3     71000 > B グループ1 商品1    200000 > B グループ1 商品2    208000 > B グループ2 商品1     2300 > > となっている表を > A グループ1 商品1    300000 > A グループ1 商品2    460000 >   グループ1        760000 > A グループ2 商品1    120000 > A グループ2 商品2     80000 >   グループ2        200000 > A グループ3 商品3     71000 >   グループ3         71000 > 支店A            1031000 > B グループ1 商品1    200000 > B グループ1 商品2    208000 >   グループ1        408000 > B グループ2 商品1     2300 >   グループ2         2300 > 支店B            410300 > 合計(A+B)        1441300 のような感じで、 > 各レコードの金額が、一つ前の金額に足されたものになっており期待通りの出力ができません。 この結果も、具体的に提示すると、回答しやすいです。

tao0417
質問者

補足

ご指摘ありがとうございます。 実際は、もっとレコード数が多く簡略化して書いたので 本来ですと A グループ1  商品1 300000 A グループ1  商品2 460000   グループ1      760000 A グループ2  商品1 120000 A グループ2  商品2  80000 グループ2      200000 支店A 960000 B グループ1  商品1 200000 B グループ1  商品2 208000 B グループ1  商品3  75000 B グループ1  商品4  60000   グループ1       135000 B グループ2  商品1 005000 B グループ2  商品2 030000   グループ2       35000 支店B 1130000 合計  1130000 という状態になっています。 支店Bグループ1の合計であったり 最後の合計であったりが、異なる数字が出力されています。

関連するQ&A

  • VBのコーディングについて

    はじめまして。VBの課題で行き詰ってしまったので、力を貸していただければと思います。 課題は【商品一覧からレコードを取得し、取得したレコードを商品区分で集計し、商品区分・商品件数・売上合計金額を区分別売上表に出力する】 といったものです。 商品一覧には、【商品区分・商品名・売上】の順にデータが入っています。 自分なりに考えた手順は Private Sub コマンド1_Click() Dim INP_DATA As String Dim kubun_01 As String Dim syohin_01 As String Dim uriage_01 As Integer Dim kubun_02 As String Dim syohin_02 As String Dim uriage_02 As Integer  Open "C:INFILE.txt" For Input As #1 Open "C:OUT_FILE.txt" For Output As #2 'ファイルの終了までループ Do Until EOF(1) Line Input #1, INP_DATA '読み込んだレコードの各項目を変数に代入 kubun_01 = Trim(Left(INP_DATA, 10)) syohin_01 = Trim(Mid(INP_DATA, 11, 10)) uriage_01 = Right(INP_DATA, 8) '一行目かどうか If Trim(Mid(INP_DATA, 11, 10)) = syohin_01 kubun_01 = Trim(Left(INP_DATA, 10)) syohin_01 = Trim(Mid(INP_DATA, 11, 15)) uriage_01 = Right(INP_DATA, 8) ElseIf Trim(Mid(INP_DATA, 11, 10)) <> syohin_01 Then kubun_02 = Trim(Left(INP_DATA, 10)) syohin_02 = Trim(Mid(INP_DATA, 11, 10)) uriage_02 = Right(INP_DATA, 8) End If If kubun = kubun_hikaku_2 Then goukei = uriage_hikaku_2 + uriage ElseIf kubun <> kubun_hikaku_2 Then Print #2, kubun; syohin; goukei End If Loop '新たに比較用の変数に格納 Do Until EOF(1) Line Input #1, INP_DATA kubun_01 = Trim(Left(INP_DATA, 10)) syohin_01 = Trim(Mid(INP_DATA, 11, 10)) uriage_01 = Right(INP_DATA, 8) Loop Debug.Print "PROGRAM END" Close #1 Close #2 End Sub となっています。長くなってしまい申し訳ありません。 上記のコーディングですと、欲しいデータが返ってこないので、 どなたかご教授いただけないでしょうか?? よろしくお願いいたします。

  • 抽出マクロが上手くいきません教えてください!

    数値と文字が混在しているB列に、 入力されている数値データの最後のみをを違う合計シートに抽出したいのですが、 上手くいきません。。 下記のマクロなのですが。。 分かる方教えてください お願いします ThisWOrkbook1 Private SubWorkbook_Open() Dim NO As Double Dim シート名 As String For l = 70 To 130 シート名 = Worksheet("goukei").Range("B" & l).Value Debug.Print シート名 Worksheets(シート名).Select Range("B30").End(xlUp).Offset(0).Select NO = Range("B30").End(xlUp).Offset(0).Value Debug.Print NO Worksheets("goukei").Select Range("C" & l) = NO Next End Sub

  • なぜ結果が「#,100000」になるのでしょうか?

    vbaです。 Sub tset() Dim kingaku As Currency kingaku = 100000 Debug.Print Format(kingaku, "\#,##0") End Sub 予想としては、「¥100,000」になると思ったし、そうしたかったのですが #,100000になってしまいます。 どこがおかしいですか?

  • コードの簡略化 VBA

    dim a as string dim b as string dim c as string dim d as string dim e as string dim f as string dim g as string dim h as string dim i as string a = "○○" b = "○○" c = "○○" d = "○○" e = "○○" f = "○○" g = "○○" h = "○○" i = "○○" 上記のような形でたくさん宣言しているのですが、 実際はもっとあり、これだととても長いコードになってしまいます(・・;) なんとか簡略化したいとは考えたのですがよい方法が見つからず 皆さんよろしくお願いいたします_(_^_)_

  • VBE Excelのマクロがわかりません(IF関数)

    エクセルのマクロがわかりません。教えてください 問題は5人の簿記の点数を入力し5人の合計点・最高点・最低点を表示するプログラムを作成する。というものです。 Sub test() Dim boki as integer Dim sum as integer Dim max as integer Dim min as integer For A = 1 to 5 boki = InputBoxx("簿記の点数入力") goukei = goukei + boki ?????? Next A Msgbox"5人の合計点は"&A Msgbox"5人の最高点は"&A Msgbox"5人の最低点は"&A End Sub IF関数を使って??の部分を作るようなのですが、いまいちよく分からないので教えてください。 bokiは簿記 sumは合計 maxは最高 minは最低のことを現してます。

  • CSV取り込み&集計

    '***************************************************************** ' GLOBAL変数の定義 '***************************************************************** Dim CurrentDir As String '現在のディレクトリ Dim ThisBook As String '現在のブック名 Dim WorkSheetName1 As String Dim WorkSheetName2 As String Dim ConfigSheetName As String Dim ListSheetName1 As String Dim ListSheetName2 As String Dim ListSheetName3 As String Dim ListSheetName4 As String Dim ListSheetName5 As String Dim ListSheetName6 As String Dim ListSheetName7 As String Dim ErrorFlag As Integer 'エラーフラグ 0:正常 1:エラー Sub 初期設定() CurrentDir = ActiveWorkbook.Path '現在のディレクトリ ThisBook = ActiveWorkbook.Name '現在のブック名 WorkSheetName1 = "work1" WorkSheetName2 = "work2" ConfigSheetName = "設定" ListSheetName1 = "****" ListSheetName2 = "****" ListSheetName3 = "****" ListSheetName4 = "****" ListSheetName5 = "****" ListSheetName6 = "****" ListSheetName7 = "****" Application.DisplayAlerts = False 'EXCELの警告を無視する End Sub Sub CSV取り込み() Dim LoadBook As String '読み込みブック名 Dim DataMaxCol As Integer '読み込みデータ有効最大カラム数 Dim WorkStartRow As Integer 'workシート開始行 Dim WorkEndRow As Integer 'workシート終了行 Dim ListMaxCol As Integer '一覧シート有効最大カラム数 Dim ListStartRow As Integer '一覧シート開始行 '初期設定コール Call 初期設定 'workシートをクリア DataMaxCol = Sheets(ConfigSheetName).Range("F2").Value WorkStartRow = Sheets(ConfigSheetName).Range("F3").Value WorkEndRow = Sheets(ConfigSheetName).Range("F4").Value Sheets(WorkSheetName1).Select Range(Cells(WorkStartRow, 1), Cells(WorkEndRow, DataMaxCol)).ClearContents '受注データファイルを選択しオープン SelectedPath = Application.GetOpenFilename("CSVファイル (*.csv), *.csv") If SelectedPath <> "False" Then Workbooks.Open Filename:=(SelectedPath) Else 'キャンセル時は終了 Exit Sub End If LoadBook = ActiveWorkbook.Name '現在のブック名 '受注データの開始行をチェック I = WorkStartRow '受注データの最終行をチェック Do Until ActiveCell.Value = Null I = I + 1 Cells(I, 1).Select Loop WorkEndRow = I - 1 '受注データをコピー Range(Cells(WorkStartRow, 1), Cells(WorkEndRow, DataMaxCol)).Select Selection.Copy 'workシートへペースト Windows(ThisBook).Activate Sheets(WorkSheetName1).Select Range("A1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False '受注データファイルをクローズ Windows(LoadBook).Close End Sub Sub 売上() ' Call CSV取り込み Range("K3:K19").Select Selection.Copy Sheets("売上").Select Range("K3:K19").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub 上記のようなプログラムを書いているのですが何度もはじかれてしまいます。何が原因なのかいまいちよくわからないのですがVBAに詳しい方助けてもらえませんでしょうか?

  • 集計

    基礎的な質問ですみません。 VB6.0 SQLで開発しています。 テーブルm_A             テーブルm_B 品番  棚番  個数     品番  品名  仕入単価 001  A-1   10      001  あいう     5 002  B-1   20      002  かきく     6 001  C-2   15      001  あいう     5 002  B-2   13      002  かきく     6 003  C-5   20      003  さしす    7 これを下記の状態で出力は出来たのですが Dim strSQL As String Dim adoRs As New ADODB.RecordSet '----- SQL文作成 ----- strSel = "SELECT" strSel = strSel & ",A.品番" strSel = strSel & ",B.品名" strSel = strSel & ",A.棚番" strSel = strSel & ",A.個数" strSel = strSel & ",B.仕入単価 " strFro = " FROM m_A AS A" strFro = strFro & " LEFT JOIN m_B AS B ON A.品番=B.品番" strOrd = " ORDER BY" strOrd = strOrd + " A.品番" strSQL = strSel + " " + strFro + " " + strWhe + " " + strOrd 品番  棚番  個数  品名  仕入単価 001  A-1   10   あいう     5 002  B-1   20   かきく     6 001  C-2   15   あいう     5 002  B-2   13   かきく     6 003  C-5   20   さしす    7 下のように品番ごとに集計をしたいのですがどうすればいいのでしょうか? お願いします。 品番  個数  品名  仕入単価 001  25   あいう     5 002  33   かきく     6 003  20   さしす    7

  • Accessのレポート上でのデータ抽出とその集計

    Accessで、たとえば、 商品 個数 金額 A   123  1230 B    2   330 A   12   20 というようなデータで、金額をグループフッターおよび ページフッターで合計されるようにつくっているレポートが あります。 このレポートに、上記の商品AとBそれぞれにわけた場合の 合計も、グループフッターに表示したいのですが、 うまくできずに悩んでいます。 どういった数式を入れたら上記のリストからAとBを区別して 合計を出せるようにできるのでしょうか? 教えてください。 よろしくお願い致します。

  • SELECT文でこんなことはできるでしょうか?

    例えば、日付別の売上のリストを作る場合に SELECT date,SUM(kingaku) AS goukei FROM uriage WHERE date BETWEEN '2007/01/01' AND '2007/01/31' GROUP BY date ORDER BY date を発行して, date goukei 2007/01/01 10000 2007/01/03 20000 2007/01/04 30000 2007/01/06 20000 2007/01/07 40000 2007/01/08 50000 ・・・ を取得したとして、 これを date goukei 2007/01/01 10000 2007/01/02 0 2007/01/03 20000 2007/01/04 30000 2007/01/05 0 2007/01/06 20000 2007/01/07 40000 2007/01/08 50000 ・・・ というように、データが1件もない日付も 間にはさむ方法はあるでしょうか? 以上、よろしくお願いします。

  • 変数の宣言(s As String)で良い理由

    vbaについてしつもんです。 標準モジュールで Option Explicit Dim s As String Sub test1() Call test2("qqq") End Sub Sub test2(s As String) MsgBox s End Sub としたのですが、もしかしてDim s As Stringって必要ないのでしょうか? あってもなくても動きます。 (s As String)があるからDim s As Stringは不要なのですか? だとしたら、(s As String)に dim や publicをつけなくて良い理由を教えてください。

専門家に質問してみよう