
前回アップした画像のレイアウトで無事転記できました。みなさん ありがとうございます。
しかし画像のレイアウトは私のスキル不足を補うため、ご教示いただく内容を理解するため単純化しています。勉強のため実際のレイアウトにあてはめコードを書き換えてみたところ、
やはり正常には転記できませんでした。エラーは出ないのですがカウントした値を目視で確認したところ、相違していました。
単純化するため、マクロ実行前に省いていた抽出条件が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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
別シートから年齢別の件数をカウントしたい
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
A列に重複した番号の行を条件を指定して削除
Visual Basic(VBA)
-
10
マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」
Visual Basic(VBA)
-
11
日付を重複させずに数えたい
Visual Basic(VBA)
-
12
エクセルVBAで教えて頂きたいのですが?
Visual Basic(VBA)
-
13
WordのVBAについて
Visual Basic(VBA)
-
14
特定の文字を条件に指定範囲のデータを貼り付けるVBA
Visual Basic(VBA)
-
15
このマクロの説明文を教えてほしいです。
Visual Basic(VBA)
-
16
VBAの繰り返し処理表記と複数の処置条件について
Visual Basic(VBA)
-
17
他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range(A3")の"
Visual Basic(VBA)
-
18
VBAで列を削除
Visual Basic(VBA)
-
19
visual basic初心者です。 visual studioで電卓を作成しています。 実行時にテ
Visual Basic(VBA)
-
20
あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
このカテゴリの人気Q&Aランキング
-
4
VBA シートのボタン名を変更し...
-
5
グラフの交点の求め方(Excel)
-
6
Application.ScreenUpdating = ...
-
7
マクロについて教えてください。
-
8
Excel マクロ VBA プロシー...
-
9
VBA 変数名に変数を使用したい。
-
10
String""から型'Double'への変...
-
11
VBAのコマンドボタンの文字列の...
-
12
VBAでの Replace関数で、ワイル...
-
13
特定のPCだけ動作しないVBAマク...
-
14
マクロについて教えてください。
-
15
VBA シートをコピーする際に Co...
-
16
フルパスから最後のディレクト...
-
17
エクセルのマクロについて教え...
-
18
VB.NETで DataRow()を利用して...
-
19
65536は2の何乗なのでしょうか?
-
20
マクロで"#N/A"のエラー行を削...
おすすめ情報
公式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合計の算出は、続いて別の項目が入りますのでこの段階で必要ありません。