- 締切済み
VBA セルの値13が数値だったり文字列だったり
セルに入った「13」が数値の場合でも文字列の場合でも処理出来る方法はありませんか? 例えば If Range("A1").Value=13 Then 処理 Endif セルの値が文字列"13"の場合、同じと認識してくれません。 いい方法はないでしょうか?
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- WindFaller
- ベストアンサー率57% (465/803)
#2の回答者です。 >左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか? その通り文字列ですが、理屈としては、#2で書いた話は生きていますが、いっそうややこしい話になったと思います。 実務的に解決するには、[データ]タブの[区切り位置]を使うのがてっとり早いのですが、ここは、あくまで、マクロでの話に集約させていただきます。 いわゆるシングルクォーテーション(')でも、書式文字列(旧ロータス123の書式)として成り立っている場合と、そうでない場合があって、 その選別は、 セル上に、(')が見えるのか、 それとも、 数式バーだけに現れているのか、 その違いがあります。昔、ロータス123を扱っていた人なら、すぐに分かります。 セル上にシングルクォーテーション(')が現れているのを、「不活性化」と呼んでいます。これを活性化するのは、一般的には[区切り位置]を使います。この状態になるのは、例えば、Access からデータを自動で呼び出した時などで、手入力では、このような現象は現れません。 '// セル上の文字をいじらない場合 Sub Test1() Dim num As Variant num = Range("A1").Value If InStr(1, num, "'", vbBinaryCompare) > 0 Then num = Replace(Range("A1").Value, "'", "", 1, , vbBinaryCompare) End If If num = 13 Then MsgBox num & "です!", vbInformation ElseIf IsNumeric(num) = False Then MsgBox "数値ではありません。", vbExclamation End If End Sub '//区切り位置と同様に、一旦、セル上の書式文字列を活性化させ、(')をプリフィックス文字に変える '//コードとしては多少不十分かもしれません。 Sub Test2() Dim num As Variant Range("A1").Value = Range("A1").Value ' ←区切り位置と同じ意味 num = Range("A1").Value If num = 13 Then MsgBox num & "です!", vbInformation ElseIf IsNumeric(num) = False Then MsgBox "数値ではありません。", vbExclamation End If End Sub '// '//おまけ-数値かどうかチェックする Sub Test3() Dim msg As String Set a = Range("A1") If Range("A1").PrefixCharacter = "'" Then 'プリフィックス文字の判定 msg = "書式文字列が入っています。" Else msg = "書式文字列が入っていません。" End If If IsNumeric(Range("A1").Value) Then msg = msg & vbNewLine & "これは数値です。" Else msg = msg & vbNewLine & "これは数値ではありません。" End If MsgBox msg, vbInformation End Sub
- MackyNo1
- ベストアンサー率53% (1521/2850)
> A1がアポストロフィー付 '13 この時に認識エラーになります。 基本的に、例示のコードならExcelのバージョンにかかわらずアポストロフィー付きの文字列でも数字でも同じ値として認識されますが、どうして認識エラーと判断されたのでしょうか? 実際に「処理」が行われないということであれば、IF条件のセルが正しいセル番地を参照しているか、あるいは同じ値が入力されているかどうかなど、もう一度確認されたほうが良いと思います。
- kkkkkm
- ベストアンサー率66% (1719/2589)
バージョンがわからないのですがファイルが壊れているかもしれませんので「開いて修復する」を試してみてはいかがでしょう。 2007以前 http://pctrouble.lessismore.cc/running/repair_excelfile.html 2007 http://www.eurus.dti.ne.jp/~yoneyama/Excel2007/FAQ/syufuku.html 2010以降 http://www.microsoft.com/ja-jp/atlife/tips/archive/office/tips/086.aspx
- kkkkkm
- ベストアンサー率66% (1719/2589)
> A1がアポストロフィー付 '13 この時に認識エラーになります。 > セルの左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか? 文字列で正解です。2013だとそれでも質問のコードで正しく認識されます。 ところで、No3のコードでもエラーになりますか?
- kkkkkm
- ベストアンサー率66% (1719/2589)
2013だと文字でも前後に空白があっても全角でも If Range("A1").Value=13 Then で認識してくれましたが、とりあえず If Val(StrConv(Trim(Range("A1").Value), vbNarrow)) = 13 Then にしてみてはいかがでしょう。
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは。 "13" そのものはダメです。それは、「"」 ダブルクォーテーションという文字が入っているからです。簡単な方法では、Excelのシート上で行うなら、まず、「"」を置換して、取り払ってしまえばよいと思います。 '// Sub Test1() Dim num As Variant num = Range("A1").Value If IsNumeric(num) Then If num = 13 Then MsgBox num End If Else MsgBox "数字ではありません。", 48 End If End Sub '// >セルに入った「13」が数値の場合でも文字列の場合でも処理出来る方法はありませんか? 理屈では、「"」 ダブルクォーテーションの文字列を取ればということでしょう。「"」が、数字の前にいくつ入っているか、また、その次が数字であるという約束は、上記のコード・パターンでは取り出せません。以下のように、"" をマクロで取り除く方法もあります。 '// Sub Test2() Dim num As Variant num = Range("A1").Value If InStr(1, num, """", vbBinaryCompare) = 1 Then num = Replace(num, """", "", 1, , vbBinaryCompare) num = Val(num) '←少し無理があります。文字列は、「0」になってしまいます。 If num = 13 Then MsgBox num End If End If End Sub '// 文字列から数字を抜き出すというような場合は、正規表現(VBScript.RegExp 等)で抜き出すほうがベターだと私は考えます。しかし、今回の場合は、少し大げさなコードだとは思います。 '// Sub Test3() Dim num As Variant Dim Matches As Object Dim i As Long With CreateObject("VBScript.RegExp") If Range("A1").Value <> "" Then num = Range("A1").Value .Global = True .Pattern = "(\d+)" Set Matches = .Execute(Range("A1").Value) For i = 1 To Matches.Count If Matches(i - 1).SubMatches(0) = 13 Then MsgBox Matches(i - 1).SubMatches(0) End If Next End If End With End Sub '// どういう方針を立てるかは、ご質問者自身です。
お礼
ありがとうございます。 よく調べたところ、質問が誤ってました。 A1がダブルクォーテーション"ではなく、アポストロフィー '13 この時に認識エラーになります。セルの左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか?
- MackyNo1
- ベストアンサー率53% (1521/2850)
提示されたコードなら、そのままでも数値と文字列の13は同じものとして認識すると思うのですが、A1セルは本当に文字列の「13」なのでしょうか?
お礼
ありがとうございます。 よく調べたところ、質問が誤ってました。回答の通りA1は文字列でも標準でも数値でも認識しました。 A1がアポストロフィー付 '13 この時に認識エラーになります。 セルの左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか?
お礼
ありがとうございます。 よく調べたところ、質問が誤ってました。回答の通りA1は文字列でも標準でも数値でも認識しました。 A1がアポストロフィー付 '13 この時に認識エラーになります。 セルの左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか?