- ベストアンサー
エクセルでできますか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
VisualVasicのカテゴリーで質問されているということは、ただの数式のことではないですよね? とりあえずエクセルVBAでやってみました。 うまい具合にA列の学校名のみ結合セルになっているのを利用してみました。 列の配置さえ、ご提示のとおりなら、行はいくら増えても大丈夫です。 Sub test01() Dim i As Long For i = 2 To Cells(Rows.Count, "B").End(xlUp).Row If Cells(i, "A").Value <> "" Then Cells(i, "E").Value = Cells(i, "A").MergeArea.Rows.Count Cells(i, "D").Value = Application.Sum(Cells(i, "C").Resize(Cells(i, "E").Value)) End If Next i End Sub まさかとは思いますが、万一使い方がわからないとこまるので一応書いておきます。 1.その表があるシートをひらき、AltキーとF11キー同時に押し(以下Alt+F11キーと記述)て Visual Basic Editor を呼び出します。 2.Visual Basic Editor のメニューから「挿入」、「標準モジュール」で出てきたコードウィンド(右側の白い広い部分)に上記のコード(Sub~End Sub)をコピペします。 3.Alt+F11キーでワークシートへもどります。 4.Alt+F8キーで出てきたマクロ名(test01)を選択して実行します。
その他の回答 (6)
- kagakusuki
- ベストアンサー率51% (2610/5101)
まず、D2セルに次の数式を入力して下さい。 =IF($A2="","",SUM(IF(COUNTIF($A$1:$A2,"*?")=COUNTIF($A:$A,"*?"),$C2:INDEX($C:$C,MATCH(9^9,$C:$C)),OFFSET($C2,,,MATCH("*?",INDEX($A:$A,ROW()+1):INDEX($A:$A,MATCH(9^9,$C:$C)),0))))) 次に、E2セルに次の数式を入力して下さい。 =IF($A2="","",COUNT(IF(COUNTIF($A$1:$A2,"*?")=COUNTIF($A:$A,"*?"),$C2:INDEX($C:$C,MATCH(9^9,$C:$C)),OFFSET($C2,,,MATCH("*?",INDEX($A:$A,ROW()+1):INDEX($A:$A,MATCH(9^9,$C:$C)),0))))) 次に、D2~E2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。 以上です。
- snowsan062
- ベストアンサー率42% (21/50)
F列を作業列(非表示)として使っていいなら F3に「=IF(A3="",F2,A3)」 D3に「=IF(A3="","",SUM(C3:OFFSET(C3,E3-1,0)))」 E3に「=IF(A3="","",COUNTIF($F$3:$F$8,F3))」 $F$3:$F$8は最終行にあわせて変える。 もしくはこれぐらいあればいいと思う最大行数を指定するか。 入力が終わったら、F3からE3を範囲選択して数式を末尾までコピー 値が入っている最初の行位置を取得する方法がわかれば 作業列なしでもoffset関数でいけるんじゃないかと思います。 エクセルの関数に詳しい人ならわかるかもしれませんが私はちょっとわかりません。
- imogasi
- ベストアンサー率27% (4737/17069)
式を入れるセルを、質問者が判断して、関数を入れれば、質問の答えを出すのは難しくない。 既に出ている回答のように、セルの場所(主に行)に応じて入れる式を組めば簡単(例=C2+C3のように。 これなら加減算、SUM関数など知っておれば質問などしなくて良はず。 ーー 普通の、ここでの質問は、同性格のデータが下方向に並んでいて、一番上のセル向けに式を組んで入れて、下方向に式を複写すると、第2行目以下はセル番地が旨く変化してくれて、各行の結果が一遍にでるという、「式の複写」の「威力を使う」ものなのです。 その本質を忘れた表設計と、それに起因することの質問になっていて、果たして、エクセル関数といわれるものを判っているのかなと思う。 ーーー A列でセル結合があるので、エクセル関数ではA小学校のクラス数は出ない。 答えを入れる場所が、毎行でなく、行番号も不定なので、式の複写が使いにくい ーー 例えば学校ごとクラス数は =IF(A2="","",mrg(A2)) その前にユーザー関数(mrg)として、標準モジュールに Function mrg(a) mrg = a.MergeArea.Rows.Count End Function を定義するために入れておく。 質問者の能力外かもしれないが、他に方法が無くやむをえない。 ーー 例データ A列 B列 C列 D列 E列 学校 クラス 人数 クラス数 生徒数 A X 1 2 3 - Y 2 B X 2 4 10 - Y 3 - Z 4 - U 1 C X 1 3 7 - Y 2 - Z 4 D X 2 6 13 - Y 4 - Z 1 - U 3 - V 1 - W 2 D2の式 =IF(A2="","",mrg(A2)) 下方向に式複写 E2に =IF(D2="","",SUM(OFFSET(C2,0,0,D2,1))) 下方向に式複写。 ーー 結果 上記D、E列 === なお、エクセル関数では(そのエクセル関数の現在の本質から) セル結合に関して、一切情報は取れないから 無駄なことを考えない様、注意のこと
- fmat
- ベストアンサー率35% (39/111)
1です。 すみません!カン違いしてました。 count関数じゃなくてcounta関数です! =counta(b2:b3) =counta(b4:b7) と入力してください。 申し訳ないです。
- temtecomai2
- ベストアンサー率61% (656/1071)
D2 → =SUM(C2:C3) E2 → =COUNTA(B2:B3) D4 → =SUM(C4:C7) E4 → =COUNTA(B4:B7) D8 → =SUM(C3:C10) E8 → =COUNTA(B8:B10) とか
- fmat
- ベストアンサー率35% (39/111)
D2には =sum(c2:c3) D4には同様に =sum(c4:c7) E2にはcount関数を使って・・ =count(b2:b3) 同じくE4には =count(b4:b7) を入れてみるのはどうでしょうか?