質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

4541閲覧

学校の家庭数カウント関数

wakame01

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/10/08 09:44

前提・実現したいこと

・学校の家庭数を正確にカウントしたい。
・コードにミスがないか教えていただきたい。
・よりスマートなコードがあれば教えていただきたい。

※家庭数=上の学年や同学年に兄弟姉妹のいない児童数

・児童名簿シート
児童名簿

41は学年が4、クラスが1の意で、そのクラスに兄弟姉妹がいることを示す。
兄弟姉妹は最大3人まで。

・実現したいシートの例
実現したいもの

該当のソースコード

VBA

1Option Explicit 2 3Public Function CountFamily(ByVal Grade As Long, ByVal Class As Long) As Long 4 5 Dim i As Long 6 Dim lngDataCnt As Long 7 Dim lngFamilyCnt As Long 8 9 With Worksheets("児童名簿") 10 lngDataCnt = .Range("A1").End(xlDown).Row 11 12 For i = 2 To lngDataCnt 13 If .Cells(i, 1) = Grade And .Cells(i, 2) = Class Then 14 If .Cells(i, 7) < (Grade * 10 + Class) And _ 15 .Cells(i, 8) < (Grade * 10 + Class) And _ 16 .Cells(i, 9) < (Grade * 10 + Class) Then 17 lngFamilyCnt = lngFamilyCnt + 1 18 End If 19 End If 20 Next i 21 22 End With 23 24 CountFamily = lngFamilyCnt 25 26End Function 27

試したこと

数学級分手作業で家庭数を数えて確認した。

補足情報(FW/ツールのバージョンなど)

Excel 2016

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

正確にカウントできていると思います。
以下のようなチェックで安心できるのではないでしょうか。
・マクロは、生徒の並び順を変えても結果が同じになる

<解決後追記>
論理的に正しいコードでも、数字で入力されていない場合、誤った結果となります。
G~I列が数字で入力されていることのチェックを追加してみました。

VBA

1Public Function CountFamily(ByVal Grade As Long, ByVal Class As Long) As Long 2 3 Dim i As Long 4 Dim lngDataCnt As Long 5 Dim lngFamilyCnt As Long 6 7 With Worksheets("児童名簿") 8 lngDataCnt = .Range("A1").End(xlDown).Row 9 10 For i = 2 To lngDataCnt 11 If .Cells(i, 1).Value = Grade And .Cells(i, 2).Value = Class Then 12 '数字で入力されていることをチェック 13 If IsNumeric(.Cells(i, 7).Value) And _ 14 IsNumeric(.Cells(i, 8).Value) And _ 15 IsNumeric(.Cells(i, 9).Value) Then 16 17 If .Cells(i, 7).Value < (Grade * 10 + Class) And _ 18 .Cells(i, 8).Value < (Grade * 10 + Class) And _ 19 .Cells(i, 9).Value < (Grade * 10 + Class) Then 20 lngFamilyCnt = lngFamilyCnt + 1 21 End If 22 Else 23 MsgBox "数字で入力されていない箇所があります。" 24 CountFamily = -1 25 Exit Function 26 End If 27 End If 28 Next i 29 End With 30 31 CountFamily = lngFamilyCnt 32 33End Function

投稿2018/10/08 10:30

編集2018/10/08 11:28
TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakame01

2018/10/08 10:44

ありがとうございます。 並び順をランダムに変えても結果は同じになりました。
wakame01

2018/10/08 11:31

コードに追加させていただきます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問