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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

Q&A

解決済

2回答

1193閲覧

なぜ条件分岐になっているのか。

退会済みユーザー

退会済みユーザー

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

0グッド

0クリップ

投稿2021/06/03 06:06

編集2021/06/03 06:30

結論から申し上げます。
後述するコードにおいて、
単純に引数のデータを変数に入れているだけなのに、なぜ条件分岐になっているのでしょうか。

'重複しない地域名を取得
myDic.Add Key:=myList(i, 1), Item:=myList(i, 2)

これがどうして重複していない地域名の取得になるのでしょうか。
式の意味は、「myDicに追加しろ、引数はKeyとItemだ」
という単純な内容ですよね。
デバッグしてみるとなぜか、重複していなければ、
'売上金額を加算
のプログラムコードのルートを通りません。

しかし、重複データすなわち2件目の同じデータが見つかると、
プログラムコードのルートを通ります。
なぜでしょうか。
そして、どこでどのように重複データを削除しているのでしょうか。
挙動が上手く掴めません。

(※ちなみに、条件分岐に関してはJavaのイメージが先行しています。)

【実際のプログラムコード】

以下

VBA

1 2Sub 重複データを削除し合計を合算() 3 4Dim myDic As Object 5 6Dim myKey As Variant 7 8Dim myItem As Variant 9 10Dim myList As Variant 11 12Dim i As Long 13 14 15 Set myDic = CreateObject("Scripting.Dictionary") 16 17 'A列,B列のデータを配列に格納 18 myList = Range("A2", Range("A" & Rows.Count). _ 19 End(xlUp)).Resize(, 2).Value 20 21 '連想配列にデータを格納 22 For i = 1 To UBound(myList, 1) 23 24 '地域名が空欄かチェック 25 If Not myList(i, 1) = Empty Then 26 If Not myDic.exists(myList(i, 1)) Then 27 28 '重複しない地域名を取得 29 myDic.Add Key:=myList(i, 1), Item:=myList(i, 2) 30 Else 31 32 '売上金額を加算 33 myDic(myList(i, 1)) = myDic(myList(i, 1)) + myList(i, 2) 34 End If 35 End If 36 Next 37 38 '[都道府県] 重複していないリストを格納 39 myKey = myDic.keys 40 41 '[売上] 各都道府県の合計を格納 42 myItem = myDic.items 43 44 'リストを出力 45 For i = 0 To UBound(myKey) 46 Cells(i + 2, 5).Value = myKey(i) 47 Cells(i + 2, 6).Value = myItem(i) 48 Next 49 50 '開放 51 Set myDic = Nothing 52 53End Sub```

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

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

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

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

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

neconekocat

2021/06/03 06:16

ごく普通にIfで分岐してませんかね あとDictionaryについて調べれば重複については解決しますよ
meg_

2021/06/03 06:22

コードが読みにくいので、「コードの挿入」で記入してください。 質問のコードはどこかからの引用でしょうか?
退会済みユーザー

退会済みユーザー

2021/06/03 06:22

恐れ入りますが、 その「ごく普通」が分かりません。 myDic.Add Key:=myList(i, 1), Item:=myList(i, 2) これが条件式の部分に記述している事はわかります。 しかし、先述した通り、 式の意味は、「myDicに追加しろ、引数はKeyとItemだ」 という意味であり、Yes or Noに当たる意味ではない様に思います。 私の解釈に誤りがあるのでしたらご訂正願います。 ありがうございます。 Dictionaryを調べると良かったのですね。 ぜひ調べさせて頂きます。
neconekocat

2021/06/03 06:35

myDicに存在しないキーならキーと値を追加する 存在しているキーなら値を加算する ごく普通のIf文です
退会済みユーザー

退会済みユーザー

2021/06/03 06:42

なるほど… myDic.Add Key:=myList(i, 1), Item:=myList(i, 2) は条件が通った後の処理内容ですね。 ありがとうございます。 存在するキーすなわち重複しているキーかどうかという事ですね ありがとうございます
guest

回答2

0

ベストアンサー

ForNextの中身を、意味ごとにインデントを付けて書き直すと、以下のようになります。

vb

1For i = 1 To UBound(myList, 1) 2 '地域名が空欄かチェック 3 If Not myList(i, 1) = Empty Then 4 If Not myDic.exists(myList(i, 1)) Then 5 '重複しない地域名を取得 6 myDic.Add Key:=myList(i, 1), Item:=myList(i, 2) 7 Else 8 '売上金額を加算 9 myDic(myList(i, 1)) = myDic(myList(i, 1)) + myList(i, 2) 10 End If 11 End If 12Next

「売上金額を加算」のElseIf Not myDic.exists(myList(i, 1))に対するものですので、「重複しない地域名を取得」へ進んだ場合には通りません。

投稿2021/06/03 07:11

maisumakun

総合スコア146018

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

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

0

myDic.Add Key:=myList(i, 1), Item:=myList(i, 2)

これが条件式の部分に記述している事はわかります。

いいえ、

VB

1If Not myDic.exists(myList(i, 1)) Then 2 myDic.Add Key:=myList(i, 1), Item:=myList(i, 2) 3Else 4 myDic(myList(i, 1)) = myDic(myList(i, 1)) + myList(i, 2) 5End If

とありますので
Not myDic.exists(myList(i, 1))であれば
myDic.Add Key:=myList(i, 1), Item:=myList(i, 2)を実行します。

投稿2021/06/03 06:29

ozwk

総合スコア13553

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

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

退会済みユーザー

退会済みユーザー

2021/06/03 06:38

データが空ではなかった場合、 myDic.Add Key:=myList(i, 1), Item:=myList(i, 2)を実行すると思うのですが、 その後にあるコードはEnd if ではなくElseです。 従って、 myDic.Add Key:=myList(i, 1), Item:=myList(i, 2) が実行できなければ、 '売上金額を加算 myDic(myList(i, 1)) = myDic(myList(i, 1)) + myList(i, 2) に行くと思います。 しかし、この内容はYes or No の内容ではない為、必ず通るはずです。 これより、 重複しないデータの場合はなぜかEnd if に飛び、 重複しているデータは売上金額を加算のコードに入ります。 なぜですか。 問題の本質を解決したく思います
maisumakun

2021/06/03 07:06 編集

> しかし、この内容はYes or No の内容ではない為、必ず通るはずです。 そんなことはありません。If Not myDic.exists(myList(i, 1))の条件が成立しなかった場合「だけ」Elseの中身が実行されます。 このElseはIf Not myList(i, 1) = Emptyに対応するものではなく、If Not myDic.exists(myList(i, 1))に対応するものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問