プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております

下記のコードで一つおしえてくれませんでしょうか

下記のようにシート1 シート2があります。

名前    性別 血液型 生年月日
長田 聡美  女     A   2021/4/13
渋谷 角太郎 男     A  2021/4/14
野口 織枝  女     B  2021/5/5
神谷 俊康  男     O  2021/6/6
宮田 房実  女     A  2021/4/17
奥村 里香  女     O  2021/4/18
白川 照也  男     A  2021/4/19
福岡 亜里香 女     B  2021/4/20
 
下記のコードに
条件を付けたら
If .Cells(i, "D").Value = "男" Then
答えがあっていませんでした。

わかる方おしえてくれませんでしょうか


Sub sample()
Dim T(1 To 12), v, m
Dim shtNo As Long
Dim i As Long, N As Long
Const shtName = "集計"

For shtNo = 1 To 2


With Worksheets(shtNo)
If .Name <> shtName Then

N = Application.Max(.Cells(Rows.Count, 6).End(xlUp).Row - 2, 1)

v = .Cells(3, 6).Resize(N).Value

For i = 1 To N
If .Cells(i, "D").Value = "男" Then
m = v(i, 1)
End If

If IsDate(m) Then T(Month(m)) = T(Month(m)) + 1
Next i

End If
End With

Next shtNo

Worksheets(shtName).Range("C3:N3").Value = T
End Sub

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

  • うーん・・・

    やはり数があわないですね

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/12/19 21:09
  • シートの構成は添付ファイルのようになります。
    シート名 4月 5月
    左が4月 右が5月
    5月のなかに4月と6月もあります。

    「条件をつけてカウントする」の補足画像2
    No.2の回答に寄せられた補足コメントです。 補足日時:2021/12/19 22:46
  • 4月
    名前 性別 血液型 生年月日
    長田 聡美 女 A 2021/4/13
    野口 織枝 女 B 2021/4/15
    宮田 房実 女 A 2021/4/17
    奥村 里香 女 O 2021/4/18
    福岡 亜里香 女 B 2021/4/20
    渋谷 角太郎 男 A 2021/4/14
    神谷 俊康 男 O 2021/4/16
    白川 照也 男 A 2021/4/19

    5月
    名前 性別 血液型 生年月日
    長田 聡美 女 A 2021/4/13
    野口 織枝 女 B 2021/5/5
    宮田 房実 女 A 2021/4/17
    奥村 里香 女 O 2021/4/18
    福岡 亜里香 女 B 2021/4/20
    渋谷 角太郎 男 A 2021/6/5
    神谷 俊康 男 O 2021/6/6
    白川 照也 男 A 2021/4/19

      補足日時:2021/12/19 22:47
  • つらい・・・

    実行すると
    1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
    9 2

      補足日時:2021/12/19 22:49
  • 結果は添付しました。
    文字でやるとずれますので

    「条件をつけてカウントする」の補足画像5
      補足日時:2021/12/19 22:50
  • つらい・・・

    よろしくお願いいたします。
    言い方に語弊があるかもしれませんが
    でればなんでもよいです。
    おしえてくれませんでしょうか

      補足日時:2021/12/19 22:52

A 回答 (4件)

i はシートの行番号:3行目を 1 としているはずです。


なので
.Cells(i + 2, "D").Value = "男"
とか配列のインデックスとシートの行番号を一致させる補正が必要かと。
この回答への補足あり
    • good
    • 0

こんばんは。



最初に、失礼かもしれませんが、プログラムの書き方が、あまり見ない
様なかなり独特の感じの書き方に見えます。

どの様な処理をするプログラムなのでしょうか?
暫く見ていて、何となくですが、男性で、生年月日の月毎に、人数を集計
されたいという事でしょうか?

>やはり数があわないですね
→どの変数で、本来欲しい結果、今出力されている結果を教えて貰えない
でしょうか?

シートの構成は、
性別がD列、生年月日がF列になるのでしょうか?
この回答への補足あり
    • good
    • 0

こんばんは



以前にも書きましたが、ダメなコードを示す前に、まず、
・「なさりたいこと」をきちんと説明すること
・シートのレイアウトが(セル位置が)わかるようにすること
をきちんと示さないと、読む人には何もわからないと思われます。


さて、本題ですが、
「男性だけをカウントの対象にしたい」ということでしょうか?

であるなら、文言通りに、「男性の場合だけカウントする」ようにすれば良いでしょう。
カウントしているのは、
>If IsDate(m) Then T(Month(m)) = T(Month(m)) + 1
の部分です。

ご提示のコードでは、
・チェックしている値が、処理しようとしている値とはデータがずれている
・男性以外(=女性)の場合は異なった日付を用いてカウントしている
という2点が合わさっておかしなことになっています。
(両方を修正しないと求める結果は得られないでしょう)

セル値を参照する方式にするなら、全てをセル値を参照するようにした方がわかりやすいですし、配列を参照するなら配列を参照するように統一した方が間違えは少ないと思われます。
意味が分からない場合は、セルの値を参照する方式に統一したほうが宜しいと思います。

元の処理方法が、一度配列に読んでから処理を行っているのは、(メモリは使いますが)処理速度向上のためだけですから。
    • good
    • 5
この回答へのお礼

失礼いたしました。

お礼日時:2021/12/19 22:59

No.2の者です。



取り敢えず、何でも良いとの事で、私が作り易い様に作成してみました。
下記でどうでしょうか?

Option Explicit
Sub sample()
Dim T(1 To 12) As Long, myAllDat As Variant
Dim I As Long, shtNo As Long
Const shtName = "集計"
For shtNo = 1 To 2
Worksheets(shtNo).Select
myAllDat = Range("C2").CurrentRegion.Value
For I = 2 To UBound(myAllDat)
If myAllDat(I, 2) = "男" Then
T(Month(myAllDat(I, 4))) = T(Month(myAllDat(I, 4))) + 1
End If
Next I
Erase myAllDat
Next shtNo
Worksheets(shtName).Select
For I = 1 To 12
Cells(2, I + 2).Value = I & "月"
Cells(3, I + 2).Value = T(I)
Next I
End Sub
    • good
    • 0
この回答へのお礼

いろいろ 失礼いたしました。
うまくいきました。
Range("C2").CurrentRegion.offset(1).Value
にしないとなぜか+1になりましたので
本当すみませんです。

お礼日時:2021/12/20 07:27

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