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

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

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

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

Q&A

解決済

2回答

157閲覧

VBAの型エラーについて

shinyakita

総合スコア39

VBA

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

0グッド

0クリップ

投稿2018/09/26 02:47

VBAにて条件一致したものを合計するコードを作成しております。
if分の中のsum = sum + Cells(i,11)で型エラーを起こしてしまいます。
debug.print VarType(Cells(2,11))で該当セルの型を表示させ変数sumの型を合わせました。
お知恵をお貸しください。

VBA

1Sub test() 2Dim i As Long 'forループ用変数 3Dim sum As Variant '合計格納用 4Dim lastCell As Long '右下終端セル格納用変数宣言(数値型) 5Dim dataSheet As Excel.Worksheet 6 Set dataSheet = ActiveWorkbook.Worksheets.Item("明細") '元データ(sheet「明細」)を変数に代入 7 8lastCell = dataSheet.Cells(Rows.Count, 1).End(xlUp).Row '右下終端セル検索 9Debug.Print lastCell 10 11dataSheet.Activate 12Debug.Print Cells(2, 11) 'セル内容確認 13Debug.Print VarType(Cells(2, 11)) 'セル型確認 14 15For i = 2 To lastCell 16 If Cells(i, 18).Value = "IY" Then 17 sum = sum + Cells(i, 11) 18 End If 19 Next 20 21Debug.Print sum 22 23End Sub

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

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

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

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

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

ExcelVBAer

2018/09/26 03:51

型をちゃんと勉強してから出直してきなよ。 話はそれからだね。
shinyakita

2018/09/26 04:01 編集

はい。sumは数値を入れる変数なので、当初longにしてました。(Integerだと桁数が足りない )しかしエラーがでるのでVariantに変更しました。それでもエラーがでるのでcellsの型を確認したところDoubleだったのでsumをDoubleに変更しました。それでもエラーが出るので調べたのですがわからずでした。
ExcelVBAer

2018/09/27 00:17

数値の計算でデバッグが起きるという事は、セルの値が数値(Int,Long,Double等)じゃないってことですよ。つまり、数値に変換できない文字列か、数式等によるエラー(#N/A)ってこと。セルの値を文字列型の変数に格納して、IsNumericでTrueなら合算、Falseなら Stop するようにしてみれば?
shinyakita

2018/09/27 01:24

ご教授ありがとうございます。元データの数値列の一部に文字列が存在していることを気が付かなく、想定外だった為エラーでした。初歩的な事ですね。上記のコードを参考にさせて頂きエラー時対処方法を検討します。
ExcelVBAer

2018/09/27 01:34 編集

補足ですが、当初・・・の流れでInteger → Long → Variant → Double と変わっていますが、小数点以下が含まれる時点でDouble型、Currency型等を検討すべきかと。そういう計算には詳しくないので、こちらを参考にhttps://thom.hateblo.jp/entry/2015/07/04/232318
shinyakita

2018/09/27 07:12

参考ページありがとうございます。助かります。
guest

回答2

0

自己解決

for分コードを以下のように変更しイミディエイトウィンドウで確認したころ途中に文字列が存在している事がわかり
ました。
元データのエラー対象行を削除したところうまく動きました。
コードの問題ではなく、元データの精度の問題でした。

VBA

1For i = 2 To lastCell 2 If Cells(i, 18).Value = "IY" Then 3 Debug.Print VarType(Cells(i, 11)) 'セル型確認 4 Debug.Print i '対象行 5 sum = sum + Cells(i, 11) 6 End If 7 Nextコード

投稿2018/09/26 04:20

編集2018/09/26 05:47
shinyakita

総合スコア39

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

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

退会済みユーザー

退会済みユーザー

2018/09/26 05:11

上で私は「セル内容確認、セル型確認の位置はsum = sum + Cells(i, 11)の直前に持ってこないと意味がないですよ。」と言いましたが、それはデバッグ中の場合の話です。Debug.PrintはForの中で処理させると地味に重いのでプログラムが遅くなります。したがって完成形ではIf IsNumeric(Cells(i, 11).Value) Thenで機械的に検査した上で出力させるとかon error goto labelでエラーを検知した場合のみに出力するようにしたほうが良いですよ。(遅くなると言っても数千回以上回さないと体感出来ないかもしれませんが)
shinyakita

2018/09/26 05:39

ありがとうございます。 はい。ものすごく時間がかかりました。 本番ではコメントアウトしておきます。 エラー処理としては、先に検査しエラーの原因となっている元データを修正する警告を出す等必要ですね。 元データに不具合がある事を想定しておりませんでした。
guest

0

セル内容確認、セル型確認の位置はsum = sum + Cells(i, 11)の直前に持ってこないと意味がないですよ。

たとえば、こうすると異常箇所で停止するので分かりやすいです。

VBA

1 For i = 2 To lastCell 2 If Cells(i, 18).Value = "IY" Then 3 If IsNumeric(Cells(i, 11).Value) Then 4 Sum = Sum + Cells(i, 11).Value 5 Else 6 Cells(i, 11).Select 7 MsgBox Cells(i, 11).Address & "のデータ型(" & TypeName(Cells(i, 11).Value) & ")が異常!" 8 Exit Sub 9 End If 10 End If 11 Next

投稿2018/09/26 03:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shinyakita

2018/09/26 04:01

ありがとうございます。 試してみます。
shinyakita

2018/09/26 04:16

元データの途中で文字列になっているものが存在しました。 その為そこでエラーで止まっていました。 文字列になっている行をスキップするコードを考えないとなりません。
sazi

2018/09/26 04:22

スキップじゃなくて、元を正さないと、別なところでも発生する可能性が残ったままですよ。
退会済みユーザー

退会済みユーザー

2018/09/26 05:05

元データが数値でないものを発見した時にどうするかを考えて欲しくて、上記コードでは問題箇所でプログラムが止まるようにしています。 本当にスルーして良いなら、Elseの中をコメントアウトしてしまえば良いですし、数値でない場合に元データの修正を(マクロ実行者に)指示するのであれば上記のまま残すと良いでしょう。解決した方法として記載された方法でも良いですが、エラーが出たらデバッグに入る想定でコーディングする場合は、Exit SubをStopに変えるとか、Debug.Assert IsNumeric(Cells(i, 11).Value)でマクロを一旦停止させるのが無難だと思います。
shinyakita

2018/09/26 05:45

元データが原因でエラーが出るケースをすべて想定できないので実行者にアラートを出して元データを修正して頂く形がスマートでしょうか? まさか数値列の中に文字列が含まれていたとは想定外でした。
退会済みユーザー

退会済みユーザー

2018/09/26 06:21

そうですね。機械的に判断出来ないようなデータの異常は利用者に修正を促すしかないと思います。あまりにエラー箇所が多くなる場合はその場でメッセージを出すのではなく、背景色を塗り潰してカウントアップしていき、処理が終わってから何件のエラーが有りましたので赤色のセルのデータを修正して下さい。と指示するのも手ですね。
shinyakita

2018/09/26 10:00

ありがとうございます。 元データを実行前に異常チェックするプログラムを作ってアラート出すようにしてみようかと思います。 目的のプログラムよりもエラーチェックの方が手前がかかりそうですが、これも勉強ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問