![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.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
回答ありがとうございます。(回答遅れてすいません)
>エラーを出さないことだけを目的にしたらいかがでしょうか?
No2さんの If IsNumeric(aValue) Then と言うことですよね。私もこれが良いと思いました。
>Val("1件")
これ便利ですね!知りませんでした。
>複雑な場合は、私などは正規表現で数値を抜き出します。
確かに、そうですね。私もそうすると思います。
>ちょっと微妙な気がします
変数が増えるなぁと思い微妙と感じました。
どうせするなら、No2さんのようにIsNumericでチェックしてからの方が良いかと思い・・・
>基本2
はやり、一番スマートに思えました。
>実際は、Excel上の数値はみなDouble型
一つ謎が残ったのは、セル数値がDouble型なのに、なぜLong型を使う傾向があるのか不思議に思いました。
No.2
- 回答日時:
合致しないデータが入ってきた時にただ何もせずすっ飛ばしたいのなら
If IsNumeric(aValue) Then
intValue = aValue
End If
程度でもいいだろうし。
整数型のチェック部分にこれ以上の判断材料も含まれてくるのであれば Function プロシージャに独立させてしまうとか。
Function IsCnforms(aValue As Variant) As Boolean
' 型チェック
' その他の業務ルールチェック
' ・・・
' ルールに合致していれば
IsConforms = True
' 合致していなければ
IsConforms = False
End Function
とか。
そもそもセルの値が人の手によって入力されるものだったら、シート側でセルに「データの入力規則」の設定をかけて入力値の種類を「整数」にし、その業務で有効と考える範囲の最小値と最大値を設定しちゃう。
回答ありがとうございます。(回答遅れてすいません)
型チェックを独立させた方がシンプルそうな気がしました。
すっ飛ばすと、初期値の0が入るので、セルから0を取得したのか判断が付かないので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Excel(エクセル) Excelの関数についておしえてください。 3 2023/04/20 18:36
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- Excel(エクセル) countif関数について質問 4 2022/06/14 12:11
- Visual Basic(VBA) 列を指定して値を左から5文字にそろえる 1 2022/06/10 20:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
String""から型'Double'への変...
-
UserForm1.Showでエラーになり...
-
On ErrorでエラーNoが0
-
マクロで"#N/A"のエラー行を削...
-
お助けください!VBAのファイル...
-
VBでSQL文のUPDATE構文を使った...
-
【Access】Excelインポート時に...
-
Excel vbaについての質問
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
実行時エラー 438 の解決策をお...
-
ExecuteNonQueryメソッドの戻り値
-
ActiveCell.FormulaR1C1の変数
-
VB.NETでMessageBoxが表示され...
-
文字列内で括弧を使うには
-
エクセルVBAで今まで使えていた...
-
【VBAエラー】Nextに対するFor...
-
VBA データ(特定値)のある最...
-
Excel VBA のFunctionプロシー...
-
ApplicationとWorksheetFunctio...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
文字列内で括弧を使うには
-
実行時エラー 438 の解決策をお...
-
On ErrorでエラーNoが0
-
お助けください!VBAのファイル...
-
VBA データ(特定値)のある最...
-
インポート時のエラー「データ...
-
実行時エラー'-2147467259(8000...
-
ACCESSで値を代入できないとは?
-
VB.net 重複チェックがしたいです
-
ActiveCell.FormulaR1C1の変数
-
ApplicationとWorksheetFunctio...
-
「実行時エラー '3167' レコー...
-
【VB.NET】 パワポ操作を非表示で
-
フランスの生年月日(jj/mm/aaaa)
-
【マクロ】 IFERROR関数をマク...
おすすめ情報