電子書籍の厳選無料作品が豊富!

VBAでinteger型変数へセルの文字列代入する際に、エラー処理を入れているのですが、出来れば各値を代入(取得)する関数と、各値のチェック関数を別にした方がキレイな感じがするので、そうしたいと思っていましたが、代入時にエラーが発生する為、出来ません。

みなさんはどのようにプログラムを書かれていますか?スマートな方法などあれば教えて頂けるとありがたいです。

A 回答 (3件)

こんにちは。



私は、他の掲示板で、「エラーがでなくて、結果が出れば、それで良しとしなさい」と書いたら、初級を終えられた方でしょうか、何か気に食わなかったのでしょうか、これに対して、非常に失礼な中傷的なレスがつきました。ただ、その人のコードをみれば、まだ、初歩的なミスをする、きちんとしたコードを書けない状態でした。

>エラー処理を入れているのですが、出来れば各値を代入(取得)する関数

具体的なコードも見せられないので、なんともいいようがありませんが、スマートか言わないで、まず、エラーを出さないことだけを目的にしたらいかがでしょうか?

エラーというのは、本来、対処療法です。
つまり、コーディングでは、エラー対処は、後付のことが多いからです。初めから、こうするというような便利なものはありません。決まった型の数値だけしか入れないと約束した所に、他を入れる事自体が間違いなら、それは設けないのです。

>integer型変数へセルの文字列代入する際
セルではなく、VBA上では、間違って混入することがありますが、セル上からは、余程のことがない限りは、エラーになるとは思えないのです。

>みなさんはどのようにプログラムを書かれていますか?スマートな方法などあれば教えて頂けるとありがたいです。

あなたの言う「スマート」の概念は分かりませんが、以下のコードでは、2番目が一番多用されます。
また、ネットなどのログは、数値・文字がセットになっていますから、「1件」となっているなら、1番目のように、Val("1件")で、数値を取出します。あまり複雑な場合は、私などは正規表現で数値を抜き出します。

>代入とチェックを分けずにスマートに出来れば良いのかも知れません

どの程度、VB/VBAを精通しているのかは分かりませんが、それぞれの代入値おいて、暗黙の了解が守られない限りは、プログラミング上では、かならずデータの事前のチェックをしなくてはなりません。掲示板では、時々、それを怠ったマクロを見せられますが、そういう人は、いつまで経っても上達しない要因だと思っています。典型的な例が、年数や時間に関わるDate型の扱いです。

#1様のおっしゃっているのは、完璧な回答だと思います。あなたの「ちょっと微妙な気がします」というこだわりは、あまり、考え過ぎないことです。VB/VBAにも、決まったパターンというものがあって、ある程度、使えるようになると、それを取っ替え引っ替え使っているだけで、いわゆる、将棋や囲碁の「定石」というものです。「定石くずし」という言葉もありますが、簡単な「定石」以外の方法で行うというのは、かなり上達してからでないと、無理なのです。

掲示板は、得てして、「定石」を教えるところではありませんから、実際の生のコードを見せられることもありますが、それはそれで参考にしたら良いと思います。概ね、この3つのパターンを使いこなしています。

基本1
Sub ValueTyepTest()
Dim num As Long 'Integer は、特殊な場合です。
 num = Val(ActiveCell.Value) 'ここが数値であろうが、数字であろうが入りますが、あえて正数なら、エラーは避けられます。
End Sub

基本2
Sub ValueTyepTest2()
Dim num As Long
 If IsNumeric(ActiveCell.Value) Then
  num = ActiveCell.Value
 End If
End Sub

基本3
Sub ValueTyepTest()
Dim num As Double '実際は、Excel上の数値はみなDouble型
 If VarType(ActiveCell) = vbDouble Then
  num = ActiveCell.Value
 End If
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。(回答遅れてすいません)

>エラーを出さないことだけを目的にしたらいかがでしょうか?
No2さんの If IsNumeric(aValue) Then と言うことですよね。私もこれが良いと思いました。

>Val("1件")
これ便利ですね!知りませんでした。

>複雑な場合は、私などは正規表現で数値を抜き出します。
確かに、そうですね。私もそうすると思います。

>ちょっと微妙な気がします
変数が増えるなぁと思い微妙と感じました。
どうせするなら、No2さんのようにIsNumericでチェックしてからの方が良いかと思い・・・

>基本2
はやり、一番スマートに思えました。

>実際は、Excel上の数値はみなDouble型
一つ謎が残ったのは、セル数値がDouble型なのに、なぜLong型を使う傾向があるのか不思議に思いました。

お礼日時:2015/07/27 23:45

合致しないデータが入ってきた時にただ何もせずすっ飛ばしたいのなら


If IsNumeric(aValue) Then
  intValue = aValue
End If
程度でもいいだろうし。
整数型のチェック部分にこれ以上の判断材料も含まれてくるのであれば Function プロシージャに独立させてしまうとか。

Function IsCnforms(aValue As Variant) As Boolean
  ' 型チェック
  ' その他の業務ルールチェック
  ' ・・・  
  ' ルールに合致していれば
  IsConforms = True
  ' 合致していなければ
  IsConforms = False
End Function
とか。

そもそもセルの値が人の手によって入力されるものだったら、シート側でセルに「データの入力規則」の設定をかけて入力値の種類を「整数」にし、その業務で有効と考える範囲の最小値と最大値を設定しちゃう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。(回答遅れてすいません)
型チェックを独立させた方がシンプルそうな気がしました。
すっ飛ばすと、初期値の0が入るので、セルから0を取得したのか判断が付かないので。

お礼日時:2015/07/27 23:21

一旦Variant型変数で受けてInteger型として有効かチェック・・・でしょうか。


スマートかどうかは不明。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ちょっと微妙な気がします。かと言って他に思い浮かびません。
そもそも代入とチェックを分けずにスマートに出来れば良いのかも知れません・・・。

お礼日時:2015/07/07 23:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!