
前回アップした画像のレイアウトで無事転記できました。みなさん ありがとうございます。
しかし画像のレイアウトは私のスキル不足を補うため、ご教示いただく内容を理解するため単純化しています。勉強のため実際のレイアウトにあてはめコードを書き換えてみたところ、
やはり正常には転記できませんでした。エラーは出ないのですがカウントした値を目視で確認したところ、相違していました。
単純化するため、マクロ実行前に省いていた抽出条件が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も見ています
-
【初月無料キャンペーン実施中】オンライン健康相談gooドクター
24時間365日いつでも医師に健康相談できる!詳しくはコチラ>>
-
別シートから年齢別の件数をカウントしたい
Visual Basic(VBA)
-
なぜこんな初歩的なVBAのIf文でエラーか発生して使えないのか、全く理解出来ません。誰か助けてくださ
Visual Basic(VBA)
-
excelVBAについて。
Visual Basic(VBA)
-
4
Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日
Visual Basic(VBA)
-
5
ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています
Visual Basic(VBA)
-
6
VBAプログラム初心者です。 以下の問題のプログラムを表記してみたのですが、実行するためには、どこを
Visual Basic(VBA)
-
7
VBAでWorkbook.addの使い方
Visual Basic(VBA)
-
8
再質問、VBA シート間の転記で、条件の追加コードの書き方について教えて下さい。
Visual Basic(VBA)
-
9
A2セルの値が「100021_りんご01青森県」からInStrで「りんご」を抽出したい。 セルの値が
Visual Basic(VBA)
-
10
データのある範囲を選択するVBAについて
Visual Basic(VBA)
-
11
マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」
Visual Basic(VBA)
-
12
日付を重複させずに数えたい
Visual Basic(VBA)
-
13
エクセルVBAで教えて頂きたいのですが?
Visual Basic(VBA)
-
14
WordのVBAについて
Visual Basic(VBA)
-
15
特定の文字を条件に指定範囲のデータを貼り付けるVBA
Visual Basic(VBA)
-
16
このマクロの説明文を教えてほしいです。
Visual Basic(VBA)
-
17
VBAの繰り返し処理表記と複数の処置条件について
Visual Basic(VBA)
-
18
他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range(A3")の"
Visual Basic(VBA)
-
19
visual basic初心者です。 visual studioで電卓を作成しています。 実行時にテ
Visual Basic(VBA)
-
20
VBAで列を削除
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
VBAで指定範囲内の空白セルを左...
-
5
VBAで10行おきにセルの下に罫線...
-
6
Cellsのかっこの中はどっちが行...
-
7
VBマクロ 色の付いたセルを...
-
8
VBAを使って検索したセルをコピ...
-
9
VBAで、特定の文字より後を削除...
-
10
期限を超えた日付に警告のメッ...
-
11
VBAのFind関数で結合セルを検索...
-
12
Changeイベントでの複数セルの...
-
13
C#で複数列をもつデータソース...
-
14
セルに入力されたら日付が出る...
-
15
難問 VBA 今日の日付より前に対...
-
16
データグリッドビューの一番最...
-
17
VBA 列が空白なら別のマクロへ...
-
18
VBAの構文 3列置きにコピーし...
-
19
rowsとcolsの意味
-
20
エクセルVBA intersect colu...
おすすめ情報
公式facebook
公式twitter
ご確認いただいた内容のお返事になります。
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合計の算出は、続いて別の項目が入りますのでこの段階で必要ありません。