質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1643閲覧

VBAでカウント数0がシートに反映されない

1004

総合スコア74

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/02/12 06:43

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
VBAで都道府県の性別内訳をカウントするシステムを作っています。
性別をカウントする機能を実装中に「宮城県」の性別が0として反映されず空白のままになってしまいます。

該当のソースコード

Option Explicit '和歌山県 Dim male_wakayama Dim female_wakayama '神奈川県 Dim male_kanagawa Dim female_kanagawa '鹿児島県 Dim male_kagoshima Dim female_kagoshima '北海道 Dim male_hokkaido Dim female_hokkaido '青森県 Dim male_aomori Dim female_aomori '岩手県 Dim male_iwate Dim female_iwate '宮城県 Dim male_miyagi Dim female_miyagi '秋田県 Dim male_akita Dim female_akita Sub 都道府県性別カウント() i = 2 '和歌山県 male_wakayama = 0 female_wakayama = 0 '神奈川県 male_kanagawa = 0 female_kanagawa = 0 '鹿児島県 male_kagoshima = 0 female_kagoshima = 0 '北海道 male_hokkaido = 0 female_hokkaido = 0 '青森県 male_aomori = 0 female_aomori = 0 '岩手県 male_iwate = 0 female_iwate = 0 '宮城県 male_miyagi = 0 female_miyagi = 0 '秋田県 male_akita = 0 female_akita = 0 Do While Worksheets(1).Cells(i, 6).Value <> "" '和歌山県、鹿児島県、神奈川県の3つだけをチェック If Left(Worksheets(1).Cells(i, 6).Value, 4) = "和歌山県" Then If Worksheets(1).Cells(i, 6).Offset(0, -3) = 1 Then male_wakayama = male_wakayama + 1 Else female_wakayama = female_wakayama + 1 End If Worksheets(2).Cells(60, 3).Value = male_wakayama Worksheets(2).Cells(61, 3).Value = female_wakayama ElseIf Left(Worksheets(1).Cells(i, 6).Value, 4) = "神奈川県" Then If Worksheets(1).Cells(i, 6).Offset(0, -3) = 1 Then male_kanagawa = male_kanagawa + 1 Else female_kanagawa = female_kanagawa + 1 End If Worksheets(2).Cells(28, 3).Value = male_kanagawa Worksheets(2).Cells(29, 3).Value = female_kanagawa ElseIf Left(Worksheets(1).Cells(i, 6).Value, 4) = "鹿児島県" Then If Worksheets(1).Cells(i, 6).Offset(0, -3) = 1 Then male_kagoshima = male_kagoshima + 1 Else female_kagoshima = female_kagoshima + 1 End If Worksheets(2).Cells(92, 3).Value = male_kagoshima Worksheets(2).Cells(93, 3).Value = female_kagoshima 'それ以外の県を転記 '北海道 ElseIf Left(Worksheets(1).Cells(i, 6).Value, 3) = "北海道" Then If Worksheets(1).Cells(i, 6).Offset(0, -3) = 1 Then male_hokkaido = male_hokkaido + 1 Else female_hokkaido = female_hokkaido + 1 End If Worksheets(2).Cells(2, 3).Value = male_hokkaido Worksheets(2).Cells(3, 3).Value = female_hokkaido '青森県 ElseIf Left(Worksheets(1).Cells(i, 6).Value, 3) = "青森県" Then If Worksheets(1).Cells(i, 6).Offset(0, -3) = 1 Then male_aomori = male_aomori + 1 Else female_aomori = female_aomori + 1 End If Worksheets(2).Cells(4, 3).Value = male_aomori Worksheets(2).Cells(5, 3).Value = female_aomori '岩手県 ElseIf Left(Worksheets(1).Cells(i, 6).Value, 3) = "岩手県" Then If Worksheets(1).Cells(i, 6).Offset(0, -3) = 1 Then male_iwate = male_iwate + 1 Else female_iwate = female_iwate + 1 End If Worksheets(2).Cells(6, 3).Value = male_iwate Worksheets(2).Cells(7, 3).Value = female_iwate '宮城県 ElseIf Left(Worksheets(1).Cells(i, 6).Value, 3) = "宮城県" Then If Worksheets(1).Cells(i, 6).Offset(0, -3) = 1 Then male_miyagi = male_miyagi + 1 Else female_miyagi = female_miyagi + 1 End If Worksheets(2).Cells(8, 3).Value = male_miyagi Worksheets(2).Cells(9, 3).Value = female_miyagi '秋田県 ElseIf Left(Worksheets(1).Cells(i, 6).Value, 3) = "秋田県" Then If Worksheets(1).Cells(i, 6).Offset(0, -3) = 1 Then male_akita = male_akita + 1 Else female_akita = female_akita + 1 End If Worksheets(2).Cells(10, 3).Value = male_akita Worksheets(2).Cells(11, 3).Value = female_akita 'Worksheets(2).Cells(i, 1).Value = Left(Worksheets(1).Cells(i, 6).Value, 3) End If i = i + 1 Loop End Sub

試したこと

dimでの宣言を確認、初期値0を確認しましたがうまくいきません。
元のデータには「宮城県」が含まれておらず、シートに0と反映されるのが正解です。

補足情報(FW/ツールのバージョンなど)

excel 2016

分かる方、ご教示お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

元のデータには「宮城県」が含まれておらず

とのことから
ElseIf Left(Worksheets(1).Cells(i, 6).Value, 3) = "宮城県" Then
の中の文が実行されず、
セルの中身が初期状態から一切変更されないのが原因ではないでしょうか?

対策としては、実行前に一度初期化するのが良いかもしれません

vba

1'カウント結果の初期化方法例 2 3'都道府県の数 4Const JPN_PREFECTURE_COUNT = 47 5 6'カウント結果を出力しているシート 7Dim rsltWs As Excel.Worksheet 8Set rsltWs = Excel.ThisWorkbook.Worksheets.Item(2) 9 10'例1 普通にループ 11With rsltWs.Cells 12 Dim r As Long 13 For r = 2 To 2 + JPN_PREFECTURE_COUNT * 2 - 1 14 .Item(r, 3).Value() = 0 15 Next r 16End With 'rsltWs.Cells 17 18'例2 まとめて初期化 19rsltWs.Range("C2").Resize(JPN_PREFECTURE_COUNT * 2).Value() = 0

蛇足

Worksheets()~と何度も参照している箇所ですが

  • どちらのシートを参照しているのかぱっと見でわかりにくい
  • 文字数が増えて見にくい
  • 入力補完が効かないので修正しにくい
  • (ほぼ無視できますが)処理速度も遅くなる

となるため、変数に入れた方が良いと思います。

またLeft(Worksheets(1).Cells(i, 6).Value, 4)およびLeft(Worksheets(1).Cells(i, 6).Value, 3)も何度も同じ記述が出てきますので、
Select Case文や変数を使った方が見やすく、修正しやすくなると思います。

投稿2018/02/12 07:25

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1004

2018/02/12 07:36

ご回答ありがとうございます。セルの中身が初期状態から一切変更されていないのであれば、 '宮城県 male_miyagi = 0 female_miyagi = 0 が効いて0がシートに反映されるはずがされません。
1004

2018/02/12 07:36

ご回答ありがとうございます。セルの中身が初期状態から一切変更されていないのであれば、 '宮城県 male_miyagi = 0 female_miyagi = 0 が効いて0がシートに反映されるはずがされません。
imihito

2018/02/12 07:51

その`male_miyagi`はただの変数、VBAの中だけで持っている値です。シートには関連付けられていません。ではそれを実際のシートに反映しているのはどこですか?
1004

2018/02/12 07:56

ElseIf Left(Worksheets(1).Cells(i, 6).Value, 3) = "宮城県" Then の中で実際のシートに反映していると思います。確かにこの行をスルーすると0が効かないですね。
imihito

2018/02/12 08:01

元のデータには「宮城県」が含まれていない、ということはその行の中身は実行されませんよね?
1004

2018/02/12 08:02

はい。「宮城県」が含まれていない場合の処理を新たに書くことにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問