プロが教える店舗&オフィスのセキュリティ対策術

素人質問ですみません。

Dim TMP As Variant
Range("A1") = 12345
TMP = Split("12345,あいう,abcd", ",")
If TMP(0) = Range("A1") Then MsgBox "同じ" Else MsgBox "違う"

TMP(0) = Range("A1")
とならないのはなぜでしょうか?

A 回答 (2件)

「Range("A1") = 12345」でA1セルに数字として「12345」が入ります。


「TMP = Split("12345,あいう,abcd", ",")」でTMPに文字列として「12345」が入ります。
つまり、同じものではなくなります。
「If TMP(0) = Range("A1") Then MsgBox "同じ" Else MsgBox "違う"」を、試しに「If TMP(0) = CStr(Range("A1")) Then MsgBox "同じ" Else MsgBox "違う"」とすれば「同じ」と表示されます。
    • good
    • 1
この回答へのお礼

ありがとうございます。
実際は比較するものが数字だったり文字列だったりと混在していて、悩んでいました。
CStr関数で解決できました。

お礼日時:2016/11/08 23:12

こんにちは。



回答は出ていますが、

>TMP = Split("12345,あいう,abcd", ",")
今回は、文字列の中の数字ですから、それはそれでよいとしますが、そうばかりではないので、この種の問題って、悩ませますね。
Split 関数全体が、文字列の切り分けだったはずです。

主に、VBAでは、1次元配列が多いのに、配列の一括変換の時に、Array関数以外は、数値の扱いさせるものはありません。Array関数は、入力が面倒だというのが難点です。

それで、別の質問にありましたが、数値比較の時に、Val関数を使うという方法がありますが、今回は、それも感心しません。

他の方法として、以下のようなものがあります。セルのプロパティからText 値を取る方法です。こういう所で、Rangeオブジェクトのプロパティの違いが出て来るわけです。他にも、Rangeオブジェクトには、いくつかのプロパティが使われます。一度は、こういう部分を研究してみると、後々、重宝します。ただし、やってみないと覚えませんね。
ですから、Rangeオブジェクトというものは、プロパティを省略しないで書くということも、大事なことなのです。

'//
Sub Test1()
 Dim tmp As Variant
 Dim a, b
 Const strTxt As String = "12345,あいう,abcd"
 tmp = Split(strTxt, ",")
 a = Range("A1").Text
 b = tmp(0)
 If a = b Then
  MsgBox "Same", 64
 Else
  MsgBox "Wrong", 16
 End If
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございます。
今回、CStr関数で解決したのですが、「.Text」でも同様に処理できるんですね。
勉強になります。

お礼日時:2016/11/08 23:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!