• 締切済み

VBA セルの値13が数値だったり文字列だったり

セルに入った「13」が数値の場合でも文字列の場合でも処理出来る方法はありませんか? 例えば If Range("A1").Value=13 Then 処理 Endif セルの値が文字列"13"の場合、同じと認識してくれません。 いい方法はないでしょうか?

みんなの回答

回答No.7

#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)
回答No.6

> A1がアポストロフィー付 '13 この時に認識エラーになります。 基本的に、例示のコードならExcelのバージョンにかかわらずアポストロフィー付きの文字列でも数字でも同じ値として認識されますが、どうして認識エラーと判断されたのでしょうか? 実際に「処理」が行われないということであれば、IF条件のセルが正しいセル番地を参照しているか、あるいは同じ値が入力されているかどうかなど、もう一度確認されたほうが良いと思います。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.5

バージョンがわからないのですがファイルが壊れているかもしれませんので「開いて修復する」を試してみてはいかがでしょう。 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)
回答No.4

> A1がアポストロフィー付 '13 この時に認識エラーになります。 > セルの左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか? 文字列で正解です。2013だとそれでも質問のコードで正しく認識されます。 ところで、No3のコードでもエラーになりますか?

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

2013だと文字でも前後に空白があっても全角でも If Range("A1").Value=13 Then で認識してくれましたが、とりあえず If Val(StrConv(Trim(Range("A1").Value), vbNarrow)) = 13 Then にしてみてはいかがでしょう。

High_Score
質問者

お礼

ありがとうございます。 よく調べたところ、質問が誤ってました。回答の通りA1は文字列でも標準でも数値でも認識しました。 A1がアポストロフィー付 '13 この時に認識エラーになります。 セルの左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか?

回答No.2

こんばんは。 "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 '// どういう方針を立てるかは、ご質問者自身です。

High_Score
質問者

お礼

ありがとうございます。 よく調べたところ、質問が誤ってました。 A1がダブルクォーテーション"ではなく、アポストロフィー '13 この時に認識エラーになります。セルの左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか?

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

提示されたコードなら、そのままでも数値と文字列の13は同じものとして認識すると思うのですが、A1セルは本当に文字列の「13」なのでしょうか?

High_Score
質問者

お礼

ありがとうございます。 よく調べたところ、質問が誤ってました。回答の通りA1は文字列でも標準でも数値でも認識しました。 A1がアポストロフィー付 '13 この時に認識エラーになります。 セルの左上に緑三角が表示されてます。これは文字列と思ってましたが、違うのですか?

関連するQ&A