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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
文字列からタブコードを取り除...
-
EXCELで=より左の文字を一括で...
-
エクセルで文字列をtxtファイル...
-
Left関数とRight関数を合わせた...
-
VBAでの Replace関数で、ワイル...
-
VBA2005 16進を2桁で表示したい。
-
Excelで3E8を3.00E+8にしない方...
-
【Excel VBA】複数ある特定の文...
-
SQL の Update文(?) と ...
-
MS SQLServer のSQLで文字列の...
-
CSV書込みの際、カンマで位置が...
-
C言語の勉強しています。すみま...
-
ACCESSのSQLでのカンマ’認識に...
-
Msgboxの×が押されたとき
-
同一セル内に関数と文字列を同...
-
Excelで指数表現しないようにす...
-
16進数を10進数に簡単に変換す...
-
NULLの定義について
-
エクセルで文字列の最大値を抽...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
Left関数とRight関数を合わせた...
-
同一セル内に関数と文字列を同...
-
アクセスで特定の数字以外(複...
-
MS SQLServer のSQLで文字列の...
-
エクセルで文字列の最大値を抽...
-
VBA2005 16進を2桁で表示したい。
-
ORCLEでの小数の表示方法の変更...
-
エクセル 数値データを桁をそ...
-
VBの「As String * 128」とは?
-
CStringの文字列検索&抜き出し...
-
エクセルでセル内の文字列の最...
-
Msgboxの×が押されたとき
おすすめ情報