- ベストアンサー
エクセルVBA For~Nextについての質問
初めまして、よろしくお願いします。 最近VBAを見よう見まねで入力している超初心者です。 C1からC10までにA1+B1の計算結果を入力するVBAで Sub TEST() Dim myCnt As Long For myCnt = 1 To 10 Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value Next myCnt End Sub というVBAが有りますが、このA1からA10、B1からB10の間に未入力などが有ると計算の途中でエラーになってしまうようです。エラーにならない対策方法を教えていただきたく、よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 分かっている人は分かっているとは言うものの、実践的に使おうとすると、こういうものは難しいです。だから、練習用では、あまりイレギュラーなものは使わないほうがよいです。たぶん、"" (長さ0文字列)があるからだと思います。 Sub TEST() Dim myCnt As Long For myCnt = 1 To 10 If IsNumeric(Cells(myCnt, 1)) And IsNumeric(Cells(myCnt, 2)) Then Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value End If Next myCnt End Sub 例えば、こんな書き方もありますが、やっぱりすっきりとしてきませんね。 理由は、ワークシートの処理は、やはり、関数が優れているように思います。(この場合は、SUM関数) Sub TEST2() Dim i As Long Dim a As Double Dim b As Double For i = 1 To 10 a = Val(Cells(i, 1).Value) b = Val(Cells(i, 2).Value) Cells(i, 3).Value = a + b Next i End Sub i は、increment(増加) の 'i' です。
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
>未入力などが有ると計算の途中でエラーになってしまうようです。エラーにならない対策方法を教えていただきたく ある程度のレベルの人は、ご質問のようなコードはExcelでは書きませんから、あくまでも、練習用として見ています。また、実際の場では、ワークシート関数を利用したほうが良いと思います。ですから、あまり先ばしって書いても意味がないかもしれませんが、エラー処理するというのは、エラーの発生原因が分かって処理することです。 今回、未入力でエラーになるとおっしゃっていますが、実際は、そのようなことはありません。どのようになると、エラーになるのか、良く研究してみてほしいと思います。 他の方もおっしゃるように、文字が含まれているというのは、経験のある方なら、想像つくはずです。そうであるかもしれませんし、そうでないかもしれません。いずれにしても、その時どうするか、その方法は、いくつかあるはずですが、まず、原因になるものが何かを理解しないと、次の段階には進みません。いや、そんな上達する気持ちはないですよ、というなら、それはそれまでです。結果オーライならそれでよいと思います。掲示板で質問を丸投げしてしまうのを、私は否定しません。ロジカルな質問さえ出来ればよいと思います。 人にはいろいろな考え方がありますが、開発するとき、あらゆるエラーの発生を想像し、それに対処する方法を備えるのが上級者やプロの立場です。それでも、対処できないエラーも存在します。その時に、エラー・トラップを使いますが、それは上級レベルで学びます。 VBAは、多くはプライベートで使うものですから、ナンセンスかもしれませんが、VBAの書き方の作法とか、あってないような暗黙のルールやらもあります。それらは、市販のテキストでも良いのですが、ある程度のレベルになると、MSDNのMicrosoft 側が提供するサンプルコードで学んでいきます。(今は、もうMSDNの日本語サイトにはなくなって、英語のみになっています。)
お礼
回答ありがとうございます。回答文を拝見し、確かに納得致します。
- argument
- ベストアンサー率63% (21/33)
こんばんわ kei__2000 さん 最近寒いですね、どうやら風邪をひきました。 風邪に気づく様なのでどうやら私は馬鹿ではないようです。 さておき、ちらほら回答を拝見しましたが、皆様なんという優等生でしょう。 そうですね、エラーとは事前に起きぬように対処すべきであり、ifによって出来得る限りその可能性とあるものをを除外するべきす。 まして仕事で使うとなれば事前の対処とは大変大切です。 ですが、あえて私はそんな面倒な回答を記述したくありませんでした。 必要がないか又は面倒のどちらかだからです(そうですね、私はただの面倒臭がりなのでしょう)。 >エラーにならない対策方法を教えていただきたく、よろしくお願いします。 と、あるようにこの問題の要点はいかなるエラーが出ようとも計算できるものは計算し、できないものは無視をするという事です。 さて、ここで私があらゆるエラーに対しと言った時点で「on error go to」なんてものが頭に浮かぶのならば、それは上級者でしょう。 ですが、ここでより簡潔にこの問題を解決するのは「On Error Resume Next」です。 私はあなたのサンプルに他の回答者よりより簡潔に一行追加し、条件をクリアした回答を提示しましょう。 Sub TEST() On Error Resume Next Dim myCnt As Long For myCnt = 1 To 10 Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value Next myCnt End Sub どうでしょうか?実行してみたでしょうか? On Error GoTo 0など後に知る必要があるかもしれません。ですがいまそれをここで説明する必要は無いでしょうし、必要ならば自分で調べればいい。 ただ、今回の質問は「エラーにならない対策方法」であり、「On Error Resume Next」この一行追加するのみで良いという最も分かり易く簡潔な答えはないかとおもいます。 ポイントなんてものはいりません。ほかの方へどうぞ。 処理違い、補足等があるならばどうぞ。
お礼
回答ありがとうございます。 argument さんは風邪をひかれたそうで、体には十分気をつけてください。 回答していただきましたVBAですが、エラー表示はでなくはなりましたが、エラー後の計算がされなくなってしまうようです。
- hallo-2007
- ベストアンサー率41% (888/2115)
エラーは未入力ではなくて 文字列とか数値でも全角とかではないでしょうか? Sub TEST() Dim myCnt As Long For myCnt = 1 To 10 On Error Resume Next Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value Next myCnt End Sub
お礼
回答ありがとうございます。”On Error Resume Next”を”For myCnt = 1 To 10”の後に入れればうまく表示できました。大変助かりました。
- xls88
- ベストアンサー率56% (669/1189)
B列は、IF式で、""を返しているのでしょうか? Sub TEST2() Dim myCnt As Long For myCnt = 1 To 10 If Cells(myCnt, 2).Value = "" Then Cells(myCnt, 3).Value = Cells(myCnt, 1).Value Else Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value End If Next myCnt End Sub
お礼
回答ありがとうございます。回答VBAを参考に入力してみたところ同じように Cells(myCnt, 3).Value = Cells(myCnt, 1).Value + Cells(myCnt, 2).Value 部分でエラーがでてしまいました。
- web2525
- ベストアンサー率42% (1219/2850)
試したけどエラーになりません? A列、B列ともに未入力、方列のみ入力、両列入力、文字列の入力ともに正常終了 文字列と数字の加算のみエラーになります、未入力に見えて実はスペースが入ってたとか?
お礼
回答ありがとうございます。大変失礼しました。実際は”質問”でのVBAを参考にしたものがエラーになってしまったので、参考にしたVBAをのせたのですが、確かにこのBAではエラーにはならないようです。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>エラーにならない対策方法 通常はIF文で処理します。 空白チェックなら、IsNull(Cells(myCnt, 1)) で判断出来ます。 http://officetanaka.net/excel/vba/function/IsNull.htm
お礼
回答ありがとうございます。参考にさせていただきたいと思います。
お礼
回答ありがとうございます。回答VBAを参考に入力してみたところ、”Sub TEST()”回答はうまくできました。大変助かりました。ありがとうございます。