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

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

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

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

Q&A

解決済

1回答

700閲覧

実行を押すたびに数値が増える

nanoko

総合スコア10

VBA

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

1グッド

0クリップ

投稿2023/05/12 05:05

編集2023/05/16 10:05

実現したいこと

前提

VBAの勉強を始めて間もないため初歩的な質問であることをご容赦ください。
Excelで作成したリストを基に同シート内に統計表を作成するためVBAを使用しています。
使用した変数は別のモジュールでも使用する可能性があるため「Public」ステートメントを使って宣言しているのですが、実行を押す度に統計結果の数値が増加してしまいます。
「Dim」を使用しているときは起こらなかった現象なのですが、原因がわかる方がいましたら教えていただけると幸いです。

【追記】
参考書で確認したところ「すべてのモジュールで有効な変数はブックを閉じたりモジュールの編集を行ったりしない限り、リセットされません。」との記載がありました。
リストに変更があった時のために作成したマクロを登録して更新ボタンを作成したいため、何か解決策がありましたらご教授ください。

【追記2】
諸事情によりコードは一部分を記載いたしました。
「○○」、「△△」の部分等は具体的な名称から変更しております。
非常に分かりにくいと思いますが、何かご指摘いただければ幸いです。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

vba

1Option Explicit 2 Public a, b, a1, b1 3 Public bosu As Integer '参照元(リスト)の母数 4 Public ○○ As Integer '○○の人数 5 Public △△ As Integer '△△の人数 6 7Sub エントリー者の進捗状況及び割合() 8  Dim x As Integer 9 10 bosu = 205 '200人まで反映されます 11 a = 5 '作成する表の起点位置(行) 12 b = 27 '作成する表の起点位置(列) 13 14 a1 = 6 '参照元の起点の位置(行) 15 b1 = 1 '参照元の起点の位置(列) 16 17 'セルを指定するときはすべてCells(a+2,b+1)、Cells(a1,b1+4)のように使用しています 18 19 Cells(a, b + 2).Value = "割合" 20 Cells(a, b + 1).Value = "人数(人)" 21 Cells(a + 1, b).Value = "○○の人数" 22 Cells(a + 2, b).Value = "△△の人数" 23 24 25 For x = a1 To bosu 26 27 If Cells(x, b1).Value <> "" Then 28 ○○ = ○○ + 1 29 Cells(a + 1, b + 1).Value = ○○ 30 31 End If 32 Next x '○○の人数 33 34 For x = a1 To bosu 35 36 If Cells(x, b1 + 2).Value = 1 Then 37 △△ = △△ + 1 38 Cells(a + 2, b + 1).Value = △△ 39 40 End If '△△の人数 41 Next x

試したこと

ClearContentsを使用して実行するたびにセルの数値を毎回リセットするようにしたのですが、結果は変わらず数値は増えるままでした。

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

ここにより詳細な情報を記載してください。

tatsu99👍を押しています

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

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

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

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

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

bebebe_

2023/05/12 06:23

想定されている処理が把握できてないので検討違いかもしれませんが処理の最初のほうでリセットする(0を代入する等)ではだめなんですか?
nanoko

2023/05/12 06:42

情報不足で申し訳ありません。 ClearContentsを使用して実行のたびにリセットを試みたのですが、改善されませんでした。 表を必要な時に移動できるように、表を置く位置のセルを「Public」で変数に置き換え、変数に数値を代入しているのですが、代入後にClearContentsを使用しています。そちらがおそらく改善されない原因なのだと考えておりますが、代入前ですとリセット対象のセルも変数を使用して呼び出しているため、そもそもコンパイルエラーになってしまいます。
sk.exe

2023/05/12 06:52

> Excelで作成したリストを基に同シート内に統計表を作成するためVBAを使用しています。 実際にモジュールに記述されているコードを明記して下さい。 > 使用した変数は別のモジュールでも使用する可能性があるため > 「Public」ステートメントを使って宣言している > 「Dim」を使用しているときは起こらなかった現象 モジュールレベルで宣言された変数とプロシージャレベルで宣言された変数とでは、スコープ(適用範囲)と有効期間が異なります。 https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/understanding-scope-and-visibility https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/understanding-the-lifetime-of-variables
nanoko

2023/05/15 01:06

諸事情によりコードはほんの一部分になってしまいますが記載いたしました。 非常に分かりにくいと思いますが、何かございましたらコメントいただけますと幸いです。 「Public」を使用する場合は「Dim」の使用時のように実行の際に数値を初期化することは絶対に不可能なのでしょうか。
guest

回答1

0

ベストアンサー

Public ○○ As Integer '○○の人数
Public △△ As Integer '△△の人数

bebebe_ さんがコメントされたように、これらの変数に0を代入するステートメントを最初のFor文より前に実行なさればよろしいでしょう。

vba

1○○ = 0 2△△ = 0

投稿2023/05/15 01:36

sk.exe

総合スコア732

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

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

nanoko

2023/05/16 01:05

ご回答ありがとうございます。 無事解決いたしました。 ClearContentsと直接変数に0を代入するのでは意味合いが違うことを理解しておりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問