
Range("A1")に数式が入っています。
Select Caseで
エラーだった場合
計算結果が正数だった場合
計算結果が負数だった場合
計算結果が"特定の文字"だったばあい
その他
で分岐したいのですが、どのように記述すればよいのでしょうか?
以下、わたしの失敗例です。AAAでもプラスと出てしまいます。エラー値の判別がわかりません。
Sub TEST()
Select Case Cells(1, 1)
Case Is > 1: MsgBox "プラス"
Case Is < 0: MsgBox "マイナス!"
Case "AAA": MsgBox "AAA"
Case Else: MsgBox "やり直し"
End Select
End Sub
No.4ベストアンサー
- 回答日時:
こんにちは。
Wendy02です。私の回答は、あまり、merlionXXさんご自身の問題解決には役に立たないような気がしますが、これは、参考程度に読んでくださいね。
>Case Is >= Chr(0)で文字列と判定できるという理解でよいのでしょうか?
そうです。それ以下はありませんね。現実には、ワークシート上の文字、コード31(x1F) ぐらいだったと思います。それ以下は、制御文字になってしまいます。
「値0の文字列」というのは、私も詳しくはありませんが、お調べになったように、vbNullChar の空の文字列 (")です。
例えば、Window プロパティのCaption に文字列を設定する場合は、違いがありませんが、Excel.Application 上では、以下のような違いがあります。
Application.Caption = vbNullChar 'Chr(0) 'Caption のMicrosoft Excel が消える
Application.Caption = "" 'Caption は消えない=設定できない。
>計算結果がエラー値の場合はどうSlelect Caseのなかに取り込めるでしょうか?
単に、エラー値を数字に変えればよいのですが、数字との比較が先にありますから、文字列にして、接頭辞を与えました。
If IsError(myValue) Then
myValue = "#" & Str(CInt(myValue))
End If
エラーは、この時点で捕まえていますが、それを更に厳密に分類したりする場合は、この数字を使えばよいです。ワークシート関数にも、ERR.TYPE関数がありますが、VBA側だけにしました。# をつける理由は特にありませんが、文字列の数字であっても、分類する必要があるような気がしました。
文字列比較なら、Text プロパティで取れば、例えば、 "#VALUE!"と出すことも出来ます。
#NULL! 2000
#DIV/0! 2007
#VALUE! 2015
#REF! 2023
#NAME? 2029
#NUM! 2036
#N/A 2042
コードとしては、もうありえない段階に入っているような気がしますが、実験的に、こういうものって、こちらもやっていて発見があります。
Sub Test4()
Dim myValue As Variant
myValue = Cells(1, 1).Value2
If IsError(myValue) Then
myValue = "#" & Str(CInt(myValue))
End If
If myValue = "" Then MsgBox "やり直し!": Exit Sub
Select Case myValue
Case "AAA": MsgBox "AAA"
Case "# 2000" To "# 2042": MsgBox "エラーです。"
Case Is >= Chr(0): MsgBox "やり直し" '^@を含む、それ以上
Case Is > 0: MsgBox "プラス"
Case 0: MsgBox "ゼロ"
Case Is < 0: MsgBox "マイナス!"
End Select
End Sub
No.6
- 回答日時:
皆さん、こんにちは。
データ型判定するなら、ベーシックに TypeName 関数で分岐処理すれば良い
と思います。下記のようなコードでセルが取りうるデータ型は全て網羅できます。
余談ですが、IsNumeric 関数は、
「数値として評価できるか?」
を ブール値(True/False)で返すだけで、実際のデータ型判定をしている
わけではありません。例えば、イミディエイトウインドウで、
? IsNumeric("1")
とすると True が返ってきますので注意が必要です。
諸事情によりまた暫らく消えます(´・ω・`)が、ご参考までに。では。
Option Explicit
Sub TEST()
Dim strMsg As String
With ActiveCell
Select Case UCase$(TypeName(.Value))
Case "STRING"
strMsg = "文字列"
' 特定文字判定(大文字・小文字区別しない)
' InStr で vbTextCompare でも判定できます
If StrComp(.Value, "AAA", vbTextCompare) = 0 Then
strMsg = "AAA"
End If
Case "DOUBLE"
If InStr(.NumberFormat, ":") > 0 Then
strMsg = "日付/時刻"
Else
If .Value = 0 Then: strMsg = "ゼロ"
If .Value > 0 Then: strMsg = "正数"
If .Value < 0 Then: strMsg = "負数"
End If
Case "DATE": strMsg = "日付"
Case "BOOLEAN": strMsg = "ブール値"
Case "ERROR": strMsg = "エラー値"
Case "EMPTY": strMsg = "空"
End Select
End With
MsgBox strMsg
End Sub
> 例えば、イミディエイトウインドウで、
? IsNumeric("1")
イミディエイトウインドウの使い方がよくわからないので
Sub TEST()
MsgBox IsNumeric("1")
End Sub
としたらTrue が返ってきました!勉強になりました。
ありがとうございます。
No.5
- 回答日時:
質問はあくまでも文字列、数値等の比較の勉強のためだろうと推測します。
先にも書きましたが、文字列、数値、エラー値は別物ですからそれぞれに比較するべきです。
そのほうが簡単明瞭ですし。
また皆さんがその回答を参考にされるであろうWendy02さんもそう仰っていますから。
興味があれば、セルA1の表示形式を「文字列」にして、Wendy02さんのコードを試して見てください。
新しい発見があると思われます。
No.3
- 回答日時:
こんばんは。
一応、念のために、変数に代入しました。
文字も数字も、同じデータとして、文字と数字の区切りライン(Chr(0))をつければよいのではないでしょうか? なお、大文字・小文字を同じにさせるために必要でしたら、TextCompare モードの Option Compare Text にするか、StrConv で変換します。
なお、セルには、エラー値は入らないものとしています。また、#1さんのご指摘の日付比較は、シリアル値に対し行うように、Value2 プロパティにしました。通常は、私は、文字列比較と数値比較は別けますが、質問の中のコードに合わせて一緒にしてみました。
'Option Compare Text
Sub Test3()
Dim myValue As Variant
myValue = Cells(1, 1).Value2
If myValue = "" Then MsgBox "やり直し!": Exit Sub
'長さ0の文字列と空白-0とは扱わない
Select Case myValue
Case "AAA": MsgBox "AAA"
Case Is >= Chr(0): MsgBox "やり直し" '^@を含む、それ以上
Case Is > 0: MsgBox "プラス"
Case 0: MsgBox "ゼロ"
Case Is < 0: MsgBox "マイナス!"
' Case Else: MsgBox "やり直し" 'おそらくは要りません
End Select
End Sub
Wendy02さん、いつも助けていただきありがとうございます。
Chr(0)???調べたら「値 0を持つ文字」ということらしいのですが意味がわかりません。
Case Is >= Chr(0)で文字列と判定できるという理解でよいのでしょうか?
Value2プロパティも初めて知りました!これは調べて納得です。ありがとうございました。
計算結果がエラー値の場合はどうSlelect Caseのなかに取り込めるでしょうか?
No.2
- 回答日時:
文字列 > 数値 だからです。
何れにしろ、文字列と数値(数字)は別々に比較すべきものです。
特に今回のような場合は。
-----------------------------------------------
Sub test()
If IsNumeric(Cells(1, 1)) Then
Select Case Cells(1, 1)
Case Is >= 0
MsgBox "ぷらす"
Case Else
MsgBox "まいなす"
End Select
Else
Select Case Cells(1, 1)
Case "AAA"
MsgBox "AAA"
Case Else
MsgBox "やり直し"
End Select
End If
End Sub
------------------------------------------------
No.1
- 回答日時:
こんなんでどうでしょう??
Sub TEST()
'セルが空白かどうか判定
If Not IsEmpty(Cells(1, 1).Value) Then
'セル内が数値の場合
If IsNumeric(Cells(1, 1).Value) Then
Select Case Cells(1, 1).Value
Case Is >= 0: MsgBox "プラス"
Case Is < 0: MsgBox "マイナス!"
End Select
'セル内が日付の場合
ElseIf IsDate(Cells(1, 1).Value) Then
MsgBox "日付です。"
'セル内が日付、数値以外(たぶんテキストの場合)
Else
Select Case Cells(1, 1).Value
Case Is = "AAA": MsgBox "aaa"
Case Else: MsgBox "やり直し"
End Select
End If
Else
MsgBox "空白です。"
End If
End Sub
ここまで分類していただきありがとうございます。
やはり文字と数値は分けて判定になるのですね。
エラー値の場合はどうしたらよいのでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) いつもお世話になります 下記のコード実行すると エラーになります わかるかた教えてくれませんでしょう 6 2022/12/17 15:01
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- Excel(エクセル) エクセルVBA Msgboxでの変数の活用 4 2023/07/23 08:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
エクセルで文字列の最大値を抽...
-
Access2000 (VBA) ' & "など...
-
【Teratermマクロ】文字列の分...
-
aaa.bbb.ccc という、「ドット...
-
ユニークな文字列を順次, 生成...
-
vbsからバッチファイル実行時の...
-
countif関数について質問
-
MS SQLServer のSQLで文字列の...
-
Excelで3E8を3.00E+8にしない方...
-
Excel(エクセル) 特定の複数の...
-
エクセルでSQLでいうところの「...
-
VB6.0のString関数に代わるVB20...
-
エクセル 数値データを桁をそ...
-
漢数字に変換するプログラム
-
無意味つづり の出し方
-
初歩的で申し訳ないですが…ADO...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報