こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ExcelVBA複数条件一致後別シートに結果表示

初めて質問させていただきます。VBAとマクロを勉強中なのですが、数値だけのcsvデータ(3万行くらい)をマクロで処理するように指示されて困っています。

●ファイルの内容(概要)
<Sheet1>
A列:性別(男性:1、女性:2でコード化)
B列:死因コード(数値5~6桁)
C列:年齢
D列:市町村(3桁でコード化「201」等)

<Sheet2>
・「セルA1」に表にしたい市町村コードをあらかじめ入力しておく

・セルB1~セルEC1まで死因コード
・セルA2~セルA132まで年齢0~130
・セル範囲B2~EC132に市町村1の男性の値が入る

・セルB133~セルEC133まで死因コード
・セルA134~A264まで年齢0~130
・セル範囲B134~EC264に市町村1の女性の値が入る

Sheet2にはあらかじめ表を作成しておき、行と列の値を参照してSheet1で一致する値が、列と行が交わるところの空白セルに入力した市町村コードと一致していることもふるいにかけられ、表で結果としてカウントされるときには男女別に分かれるようにしたいのですが可能でしょうか?

ややこしくて申し訳ありません。繰り返しあらかじめ作成された表にカウント結果を入力させる記述はヒントを頂ければ頑張ります。

なので、4つの条件に一致した場合にカウントして別シートに返すにはどうしたらいいのか助けていただけますと幸いです。

それと、シート1の最終行は決まっていません。

投稿日時 - 2013-11-21 16:23:10

QNo.8356291

すぐに回答ほしいです

質問者が選んだベストアンサー

Sheet1のデータ(レコード)のうち、sheet2のa1セルの市町村コードに該当するものを、
縦軸(年齢)、横軸(死因)で、性別ごとに集計する、と理解しました。

*************************************************************
Sub zzz()

Dim r As Long
Dim i As Integer, j As Integer, k As Integer
Dim Wsf As Object
Dim SCode As Range, Nenrei As Range
Dim Ws1 As Worksheet, Ws2 As Worksheet
Set Ws1 = Worksheets("sheet1")
Set Ws2 = Worksheets("sheet2")
Set Wsf = Application.WorksheetFunction

Application.ScreenUpdating = False

Ws2.Range(Ws2.Cells(2, 2), Ws2.Cells(132, 133)).ClearContents
Ws2.Range(Ws2.Cells(134, 2), Ws2.Cells(264, 133)).ClearContents

With Ws2
Set SCode = .Range(.Cells(1, 1), .Cells(1, 133))
End With

r = 2
Do While Ws1.Cells(r, 1).Value <> ""
If Ws1.Cells(r, 4).Value = Ws2.Cells(1, 1).Value Then

If Ws1.Cells(r, 1).Value = 1 Then
i = 1
ElseIf Ws1.Cells(r, 1).Value = 2 Then
i = 134
End If

With Ws2
Set Nenrei = .Range(.Cells(i, 1), .Cells(i + 130, 1))
End With

j = i + Wsf.Match(Ws1.Cells(r, 3).Value, Nenrei, 0) - 1
k = Wsf.Match(Ws1.Cells(r, 2).Value, SCode, 0)

Ws2.Cells(j, k).Value = Ws2.Cells(j, k).Value + 1
Else
End If

r = r + 1
Loop

Application.ScreenUpdating = True
Set Scode = Nothing
Set Nenrei = Nothing
Set Wsf = Nothing
Set Ws1 = Nothing
Set Ws2 = Nothing

End Sub
******************************************************************************
(簡単に補足)
変数rを整数型で宣言
変数i,j,k を整数型で宣言
変数Wsf をオブジェクトで宣言
変数Scode,Nenrei をレンジで宣言
変数Ws1,Ws2 をワークシートで宣言

Ws1にSheet1をセット
Ws2にSheet2をセット
Wsfにエクセルのワークシート関数をセット

画面更新を止める

Sheet2の男性用入力エリアをクリア
Sheet2の女性用入力エリアをクリア

Scode に、死因コードの範囲をセット

rは2です。(シート1のレコード、2行目から始める)

Sheet1のA列のセルが空白になるまでループさせる。
    もし、レコードの市町村コードが、シート2のA1セルと同じだった場合、
        もし、性別コードが1(男性)だった場合、
            i は1
  もし、性別コードが2(女性)だった場合、
            i は 134

     変数Nenrei に 年齢の範囲をセット (上で決めたiによって、男女の区別をしてセット)

     j は、年齢の該当する行 (をMatch関数で求めている)
     k は、死因コードの該当する行  (同上)

     j,k で決まったセルに1を加算(カウント)

   もし、レコードの市町村コードが、シート2のA1セルと異なる場合、
         なにもしない

   r に1を足して
ループ。

画面更新を復活させる

変数の開放

終わり。

投稿日時 - 2013-11-22 00:13:32

お礼

お礼が遅くなりまして申し訳ありません。データが会社だったので、そのデータで試させていただいてからと思っていたら数日経ってしまいました。
試してみたところ、希望通りの結果になりました!しかもコードがシンプルで初心者の私にもわかりやすく書いていただき、補足もとても丁寧に書いて下さったので、後は自力でできそうです。某質問サイトで希望の光を見いだされたと思ったらテストコードとやらで改良もできないあてにならないコードを掴まされ、「後はお金がかかる」的なことまで書かれ失望していました(そんな人には絶対に頼みませんが)。
そんな私に希望の光を下さいました!数日頭を抱えていたのですが、解決してみると意外とシンプルでした。迷路に入っていると、そのシンプルな答えにたどり着けないのですが、本当にありがとうございました。感激で感謝の気持ちでいっぱいです。

投稿日時 - 2013-11-25 11:39:08

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問