電子書籍の厳選無料作品が豊富!

前回アップした画像のレイアウトで無事転記できました。みなさん ありがとうございます。
しかし画像のレイアウトは私のスキル不足を補うため、ご教示いただく内容を理解するため単純化しています。勉強のため実際のレイアウトにあてはめコードを書き換えてみたところ、
やはり正常には転記できませんでした。エラーは出ないのですがカウントした値を目視で確認したところ、相違していました。
単純化するため、マクロ実行前に省いていた抽出条件が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

「別シートから年齢別の件数をカウントしたい」の質問画像

質問者からの補足コメント

  • ご確認いただいた内容のお返事になります。
    1.状況シートの開始行は「3」行目からになります。
    2.状況シートの年齢は「K」列から取得になります。
    3.状況シートの分類2は「U」列から取得になり、分類1ではなく、「分類2」になります。
    4.B表の分類2はC列に定義され、15~25行までを(A~K)で使用し分類2はこれ以上増えません。
    5.B表のG列の計は、H列~M列の計を算出します。マクロで設定する範囲は、G15:M25で間違いありません。
    縦の合計H15~H25合計の算出は、続いて別の項目が入りますのでこの段階で必要ありません。

      補足日時:2023/01/24 11:15
  • ご質問頂いた回答になります。
    1.状況シートの開始行は「3」行目からになります。
    2.状況シートの年齢は「K」列から取得になります。
    3.状況シートの分類2は「U」列から取得になり、分類1ではなく、「分類2」になります。
    4.B表の分類2はC列に定義され、15~25行までを(A~K)で使用し分類2はこれ以上増えません。
    5.B表のG列の計は、H列~M列の計を算出します。マクロで設定する範囲は、G15:M25で間違いありません。
     縦の合計H15~H25合計の算出は、続いて別の項目が入りますのでこの段階で必要ありません。

      補足日時:2023/01/24 11:18

A 回答 (5件)

No3です。


>何故かB表G列の計は空欄のままです....

こちらの環境では表示されています。
G15をクリックするとfxの表示窓に=SUM(H15:M15)
と表示されるはずですが、そのようになってませんか。
(添付図の赤線で囲んだところです)

G15,H15の書式設定はどのようになっていますか。
ユーザー定義の G/標準"人" と理解したのですがそうではないのでしょうか。
「別シートから年齢別の件数をカウントしたい」の回答画像5
    • good
    • 1
この回答へのお礼

最後まで見ていただきありがとうございます。助かりました。

お礼日時:2023/01/25 11:26

・4.B表の分類2はC列に定義され、15~25行までを(A~K)で使用し分類2はこれ以上増えません。



これって事前に記載しておき且つDictionaryオブジェクトを用いれば、コード全体も半分で済むようにも感じますが、それだと理解が厳しいのでしょうか?
でもDictionaryオブジェクト自体をご存じなければ、それもまた理解が厳しいかもですから、専属のベテラン回答者様にお任せが良いですかね。

初心者ゆえかコードを把握するのは私も厳しいです。
元々どれだけ短くかけるか?で過去の回答者様にしごかれましたので、逆に長く書く方が辛いかな。
    • good
    • 1
この回答へのお礼

ありがとうございます。勉強させていただきます。

お礼日時:2023/01/24 17:51

下記にアップしました。


https://ideone.com/lztNwl
    • good
    • 1
この回答へのお礼

ありがとう

お示し頂いたコード '年齢を取得の"E"を"K"に変更し、目視と同じ転記ができました。何故かB表G列の計は空欄のままです....
↓こんなことができるのですね!
If sh1.Rows(row1).Hidden = True Then GoTo NEXT99
大変勉強になり助かりました。以前はオートフィルターを複数回重ねたコードで運用していましたが、今回の縦と横の項目を
Private Function GetBunruiとPrivate Function GetAgeに分け
Public Subに組み込む手法は、とても汎用性がありいろいろな場面で応用できるように感じました。
ド素人の私にここまでお付き合いいただきありがとうございます。

お礼日時:2023/01/24 17:50

前回回答者です。


前回のマクロは、そもそも、フィルターがかかっていない状態での処理す。
フィルターがかかった状態では、処理の方法が異なってきます。
質問時には、予め、フィルターがかかった状態であることを明記されると良いでしょう。

以下、確認点です。
1.状況シートのデータの開始行は何行からになりますか。
表示されている状態では216行ですが、非表示も含めた開始行です。
3行目からでしょうか。

2.状況シートの年齢はK列から取得であってますか。

3.状況シートの分類2はU列から取得であってますか。
前回は分類1でしたが、分類2が正しいということであってますか。

4.B表の分類2はC列に定義されていて15行~25行までを使用する。(A~K)この前提で良いでしょうか。
C15=A、・・・・C25=K
(分類2はこれ以上は増えない前提です)

5.B表のG列の計は、H列~M列の計を算出する。
従って、マクロで設定する範囲は、G15:M25 の範囲となりますが、間違いないでしょうか。
(縦の合計は算出しません。H15~H25の合計の算出などは行いません)
    • good
    • 0

抽出って事は『表示されている行・非表示の行』の判定が必要なのですが、それよりまず画像とコードの関係が繋がらない気がします。


何をどう努力してみたのかを出してみないと利用規約違反(作成依頼)になってしまいますよ。

調べる際には『可視セル』についてですかね。
https://vba-create.jp/vba-method-specialcells-vi …
この可視セル範囲についてだけ実行させないと、見えないセルのデータも利用してしまいます。
多分違いとしてはその値数じゃないでしょうか?
もしそうだとしたら上記が当てはまりますし、抽出条件が変動するのならコード内には書けませんよね?

あとB表のC列の項目は事前に入っているのですかね?
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!