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

No.4
- 回答日時:
・4.B表の分類2はC列に定義され、15~25行までを(A~K)で使用し分類2はこれ以上増えません。
これって事前に記載しておき且つDictionaryオブジェクトを用いれば、コード全体も半分で済むようにも感じますが、それだと理解が厳しいのでしょうか?
でもDictionaryオブジェクト自体をご存じなければ、それもまた理解が厳しいかもですから、専属のベテラン回答者様にお任せが良いですかね。
初心者ゆえかコードを把握するのは私も厳しいです。
元々どれだけ短くかけるか?で過去の回答者様にしごかれましたので、逆に長く書く方が辛いかな。
No.3
- 回答日時:
お示し頂いたコード '年齢を取得の"E"を"K"に変更し、目視と同じ転記ができました。何故かB表G列の計は空欄のままです....
↓こんなことができるのですね!
If sh1.Rows(row1).Hidden = True Then GoTo NEXT99
大変勉強になり助かりました。以前はオートフィルターを複数回重ねたコードで運用していましたが、今回の縦と横の項目を
Private Function GetBunruiとPrivate Function GetAgeに分け
Public Subに組み込む手法は、とても汎用性がありいろいろな場面で応用できるように感じました。
ド素人の私にここまでお付き合いいただきありがとうございます。
No.2
- 回答日時:
前回回答者です。
前回のマクロは、そもそも、フィルターがかかっていない状態での処理す。
フィルターがかかった状態では、処理の方法が異なってきます。
質問時には、予め、フィルターがかかった状態であることを明記されると良いでしょう。
以下、確認点です。
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の合計の算出などは行いません)
No.1
- 回答日時:
抽出って事は『表示されている行・非表示の行』の判定が必要なのですが、それよりまず画像とコードの関係が繋がらない気がします。
何をどう努力してみたのかを出してみないと利用規約違反(作成依頼)になってしまいますよ。
調べる際には『可視セル』についてですかね。
https://vba-create.jp/vba-method-specialcells-vi …
この可視セル範囲についてだけ実行させないと、見えないセルのデータも利用してしまいます。
多分違いとしてはその値数じゃないでしょうか?
もしそうだとしたら上記が当てはまりますし、抽出条件が変動するのならコード内には書けませんよね?
あとB表のC列の項目は事前に入っているのですかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
B列の最終行までA列をオート...
-
Changeイベントでの複数セルの...
-
IIF関数の使い方
-
複数の列の値を結合して別の列...
-
URLのリンク切れをマクロを使っ...
-
【VBA】2つのシートの値を比較...
-
VBAで文字列を結合
-
Cellsのかっこの中はどっちが行...
-
VBAで、離れた複数の列に対して...
-
DataGridViewに空白がある場合...
-
VBAを使って検索したセルをコピ...
-
Excel VBA 初心者です 近似値を...
-
VBA 何かしら文字が入っていたら
-
【Excel VBA】カンマと改行コー...
-
複数処理 Worksheet_Change(ByV...
-
VBAでのリスト不一致抽出について
-
データグリッドビューの一番最...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
Worksheets メソッドは失敗しま...
-
vba 2つの条件が一致したら...
-
B列の最終行までA列をオート...
-
IIF関数の使い方
-
Cellsのかっこの中はどっちが行...
-
【VBA】2つのシートの値を比較...
-
VBAのFind関数で結合セルを検索...
-
URLのリンク切れをマクロを使っ...
-
文字列の結合を空白行まで実行
-
VBA 何かしら文字が入っていたら
-
VBAを使って検索したセルをコピ...
-
【Excel VBA】 B列に特定の文字...
-
VBAで指定範囲内の空白セルを左...
-
Changeイベントでの複数セルの...
-
VBAで、離れた複数の列に対して...
-
VBAでのリスト不一致抽出について
-
データグリッドビューの一番最...
-
rowsとcolsの意味
-
DataGridViewに空白がある場合...
おすすめ情報
ご確認いただいた内容のお返事になります。
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合計の算出は、続いて別の項目が入りますのでこの段階で必要ありません。
ご質問頂いた回答になります。
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合計の算出は、続いて別の項目が入りますのでこの段階で必要ありません。