
以前、年齢が縦に並んだ表へ別シートからデータをカウントしたマクロをご教授いただきました。
今回、年齢が横に並んだ「B表シート」へ「状況シート」からカウントするため、下記マクロへ変更したのですが表が崩れてしまいできません。どのように修正したらよいか教えてください。
Public Sub 年齢別カウント_横()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim maxrow1 As Long '年齢最終行
Dim row1 As Long
Dim row2 As Long
Dim col2 As Long
Dim rgs As String
Dim rgs1 As String
Dim rgs2 As String
Dim idx As Long
Dim bun As String
Set sh1 = Worksheets("状況")
Set sh2 = Worksheets("B表")
sh2.Range("C5:G16").ClearContents '値をクリア
maxrow1 = sh1.Cells(5, 8).End(xlToRight) '年齢最終列まで
For row1 = 8 To maxrow1 '年齢列8行目~最終列まで
bun = sh1.Cells(Rows.Count, "C").Value '状況シートのC列分類1を選択
idx = GetBunrui(bun) '分類を取得
If idx < 0 Then
MsgBox ("分類1不正")
sh1.Select
sh1.Cells(row1, "C").Select
Exit Sub
End If
col2 = idx + 3 '状況シート年齢列
idx = GetAge(sh1.Cells(row1, "E").Value) '年齢を取得
row2 = idx + 5 '
sh2.Cells(row2, col2).Value = sh2.Cells(row2, col2).Value + 1
Next
For col2 = 3 To 6
rgs1 = sh2.Cells(5, col2).Address(False, False)
rgs2 = sh2.Cells(15, col2).Address(False, False)
rgs = rgs1 & ":" & rgs2
sh2.Cells(16, col2).Formula = "=sum(" & rgs & ")"
Next
For row2 = 5 To 16
rgs = "A" & row2 & ":F" & row2
sh2.Cells(row2, "G").Formula = "=sum(" & rgs & ")"
Next
MsgBox ("完了")
End Sub
Private Function GetBunrui(ByVal bun As String) As Long
Dim buns As Variant
Dim i As Long
buns = Array("A", "B", "C", "D")
For i = 0 To UBound(buns)
If bun = buns(i) Then
GetBunrui = i
Exit Function
End If
Next
GetBunrui = -1
End Function
Private Function GetAge(ByVal vage As Variant) As Long
Dim vals As Variant
Dim i As Long
Dim age As Long
vals = Array(0, 20, 25, 30, 35, 40, 999)
GetAge = UBound(vals)
If IsNumeric(vage) = False Then Exit Function
age = Int(vage)
If age < vals(0) Or age >= vals(UBound(vals)) Then Exit Function
For i = 0 To UBound(vals) - 1
If age >= vals(i) And age < vals(i + 1) Then
GetAge = i
Exit Function
End If
Next
End Function

No.4ベストアンサー
- 回答日時:
ご教授いただいたコードで無事転記できました。
別の問題に直面していますので質問しなおしています。
引き続きよろしくお願いいたします。
No.6
- 回答日時:
※この回答は、“締め切られた質問への回答追加”として、2023/01/25 12:15 に回答者の方よりご依頼をいただき、教えて!gooによって代理投稿されたものです。
エラー処理(入力されている値の型や書き込むセル範囲の変動など)はしていません。
0の場合は表示しないようにしてます。
Sub 年齢区分別カウント_横()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim r1 As Range
Dim bun_str As String
Dim n As Integer
Dim age_Area As Integer
Dim v(1 To 11, 1 To 6) As Variant
Set ws1 = Worksheets("状況")
Set ws2 = Worksheets("B表")
bun_str = "ABCDEFGHIJK" 'ここに違いがあるとエラーになります。
With ws1
For Each r1 In .Range("K3", .Cells(Rows.Count, "K").End(xlUp)).SpecialCells(xlCellTypeVisible)
n = InStr(bun_str, r1.Range("I1").Value)
age_Area = IIf(r1.Value <= 14 Or r1.Value >= 40, 6, Int((r1.Value - 15) / 5) + 1)
v(n, age_Area) = v(n, age_Area) + 1
Next
End With
With ws2
.Range("G15:M25").ClearContents
.Range("H15").Resize(11, 6).Value = v
.Range("G15:G25").Value = "=SUM(H15:M15)"
.Range("G15:M25").NumberFormatLocal = "G/標準""人"";;"
End With
End Sub
初級レベルなジジィなので、だいぶ古いやり方です。
No.5
- 回答日時:
E列の行数を i と言う変数でループさせた時、
age = iif(cells(i, "E").value <= 14 or cells(i, "E").value >= 40, 6 _
, int((cells(i, "E").value - 15) / 5))
でH~M列に対して 0 ~ 5 の数値を得られる。
あとは配列に利用するなりoffset関数に利用するなり。
値が数値以外が入っているとかの判定が必要なら、既に出来てますしね。
No.3
- 回答日時:
既に回答が付いているのかもですが。
年齢をユーザー関数で求めるほど複雑な内容ではないと思います。
どっちかと言えば『5歳刻み』にするって点は中学程度の数学で、年齢の範囲分類は可能ではないかなと。
まぁ、配列のインデックス(0 始まり)に使えるのでは?
先に14歳以下と40歳以上は除外する必要はあるでしょうけど。
気になるのは『地域』が他にもあって『1つの表』から各シートにも振り分け作業をするのかな?って所でしょうか。
No.2
- 回答日時:
こんにちは
Countifs関数を用いれば、普通に算出できる内容と思います。
わざわざ「わからないマクロ」などを利用するよりも、今後とも変更に対応できると思いますけれど?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
別シートから年齢別の件数をカウントしたいの続き
Visual Basic(VBA)
-
なぜこんな初歩的なVBAのIf文でエラーか発生して使えないのか、全く理解出来ません。誰か助けてくださ
Visual Basic(VBA)
-
ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています
Visual Basic(VBA)
-
4
VBAプログラム初心者です。 以下の問題のプログラムを表記してみたのですが、実行するためには、どこを
Visual Basic(VBA)
-
5
VBAでWorkbook.addの使い方
Visual Basic(VBA)
-
6
Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日
Visual Basic(VBA)
-
7
エクセルVBAで教えて頂きたいのですが?
Visual Basic(VBA)
-
8
A2セルの値が「100021_りんご01青森県」からInStrで「りんご」を抽出したい。 セルの値が
Visual Basic(VBA)
-
9
VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「"」付にならないよ
Visual Basic(VBA)
-
10
ExcelのVBAでシフト表を作っていますが、バグが出て困っています
Visual Basic(VBA)
-
11
Excel VBAでAA(BBB) → BBB.AA に置換したい
Visual Basic(VBA)
-
12
【VBAエラー】Nextに対するForがありません 対策について
Visual Basic(VBA)
-
13
excelVBAについて。
Visual Basic(VBA)
-
14
日付を重複させずに数えたい
Visual Basic(VBA)
-
15
数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct
Visual Basic(VBA)
-
16
Excel VBAのデバッグ
Visual Basic(VBA)
-
17
ListBox1をClickしたときのイベント
Visual Basic(VBA)
-
18
VBA初心者です。電話番号の数字の前に0を表示させたいです。
Visual Basic(VBA)
-
19
いつもお世話になります 下記のコード実行すると エラーになります わかるかた教えてくれませんでしょう
Visual Basic(VBA)
-
20
ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
楽天RSSからエクセルVBAを使用...
-
5
VBA オートフィルター繰り返し
-
6
マクロ実行後に別シートの残像...
-
7
VBA 実行時エラー1004 rangeメ...
-
8
ExcelのVBマクロを、バックグラ...
-
9
VBAで変数の数/変数名を動的に...
-
10
アクセスからエクセルへ出力時...
-
11
FindNextがうまくいかない
-
12
Excelのシート別でのセルのリン...
-
13
複数シートの複数列に入力され...
-
14
ExcelのVBAでグループ分けしたい
-
15
テキストボックスから、複数の...
-
16
オートフィルターとExcelマクロ...
-
17
VBA : エクセルの列を5列追加し...
-
18
【Excel関数】UNIQUE関数で"0"...
-
19
2つ目のコンボボックスが動作...
-
20
エクセルでセルをクリックする...
おすすめ情報
公式facebook
公式twitter
お考えいただきありがとうございます。途中まで変更しようとしましたが私のスキル不足ですいません。
10才 52才は不明でカウントしたいです。
tatsumaru77さん ありがとうございます。
アップした画像のレイアウトで無事転記できました。
しかし画像のレイアウトは私のスキル不足を補うため、ご教示いただく内容を理解するため単純化しています。勉強のため実際のレイアウトにあてはめコードを書き換えてみたところ、やはり正常には転記できませんでした。エラーは出ないのですがカウントした値を目視で確認したところ、相違していました。
単純化するため、マクロ実行前に省いていた抽出条件が2点あり、これが原因でしょうか。
_マクロ実行前に抽出した条件として
①状況シートB列の月「12月」で抽出、
②状況シートS列の条件1「あ」で抽出、この2点を手動で抽出後、下記マクロを実行しました。
この条件で修正箇所がどこなのか教えていただけませんでしょうか。お願いいたします。
Public Sub 年齢別カウント_横()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim maxrow1 As Long 'B列最終行
Dim row1 As Long
Dim row2 As Long
Dim col2 As Long
Dim rgs As String
Dim rgs1 As String
Dim rgs2 As String
Dim idx As Long
Dim bun As String
Set sh1 = Worksheets("状況")
Set sh2 = Worksheets("B表")
sh2.Range("G15:M18").ClearContents 'B表の値をクリア
maxrow1 = sh1.Cells(Rows.Count, "B").End(xlUp).Row '状況B列最終行
For row1 = 3 To maxrow1 '状況3行目~最終行まで
bun = sh1.Cells(row1, "U").Value '状況シートのC列分類1を選択
idx = GetBunrui(bun) '分類を取得
If idx < 0 Then
MsgBox ("分類1不正")
sh1.Select
sh1.Cells(row1, "U").Select '状況の分類列U
Exit Sub
End If
row2 = idx + 15 'B表 分類1毎の行番号
idx = GetAge(sh1.Cells(row1, "K").Value) '状況の年齢列K
col2 = idx + 8 'B表 年齢毎の列番号
sh2.Cells(row2, col2).Value = sh2.Cells(row2, col2).Value + 1
Next
For row2 = 15 To 25 'B表の分類C列の最初の行から最後の行 15To25
rgs = "H" & row2 & ":M" & row2 'B表の最初の年齢列H、最後の年齢列M
sh2.Cells(row2, "G").Formula = "=sum(" & rgs & ")" 'B表の計列G
Next
MsgBox ("完了")
End Sub
Private Function GetBunrui(ByVal bun As String) As Long
Dim buns As Variant
Dim i As Long
buns = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", " K")
For i = 0 To UBound(buns)
If bun = buns(i) Then
GetBunrui = i
Exit Function
End If
Next
GetBunrui = -1
End Function
Private Function GetAge(ByVal vage As Variant) As Long
Dim vals As Variant
Dim i As Long
Dim age As Long
vals = Array(15, 20, 25, 30, 35, 40)
GetAge = UBound(vals)
If IsNumeric(vage) = False Then Exit Function
age = Int(vage)
If age < vals(0) Or age >= vals(UBound(vals)) Then Exit Function
For i = 0 To UBound(vals) - 1
If age >= vals(i) And age < vals(i + 1) Then
GetAge = i
Exit Function
End If
Next
End Function
補足画像が添付できないので再度質問にてアップさせていただきます。