目安箱 IV

目安箱投稿のルールはこちらをごらんください。
ご意見は電子メールで承っています。
「目安箱」は質問禁止です。技術的な質問はそれぞれの質問箱へどうぞ。

迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
67 / 118 ツリー ←次へ | 前へ→

【164】ちょっと気になる現象2 Is 演算子 ichinose 06/12/23(土) 22:25 Excel[未読]
【165】Re:ちょっと気になる現象2 Is 演算子 ichinose 06/12/23(土) 22:30 Excel[未読]

【164】ちょっと気になる現象2 Is 演算子
Excel  ichinose  - 06/12/23(土) 22:25 -

引用なし
パスワード
   Is演算子は、オブジェクトを比較する演算子ですが・・・。

新規ブックの標準モジュールに

'==================================================================
Sub main()
  Dim a As Object
  Dim b As Object
  MsgBox "まず" & vbCrLf & _
      "Application Is Application = " & _
      (Application Is Application)
  
  MsgBox "次に" & vbCrLf & _
      "ThisWorkbook Is ThisWorkbook = " & _
      (ThisWorkbook Is ThisWorkbook)

  MsgBox "さらに" & vbCrLf & _
      "ActiveSheet Is ActiveSheet = " & _
      (ActiveSheet Is ActiveSheet)
  MsgBox "と、ここまではコードと照らし合わせても" & vbCrLf & _
      "なんてことはないのですが・・・"
'
'
'
  MsgBox "ここからが問題現象" & vbCrLf & vbCrLf & _
      "Range(""a1"") Is Range(""a1"") = " & _
      (Range("a1") Is Range("a1")) & vbCrLf & "あれ?"
  Set a = Range("a1")
  Set b = Range("a1")
  MsgBox "これも" & vbCrLf & _
      "Dim a As Object,b As Object" & vbCrLf & _
      "Set a = Range(""a1"")" & vbCrLf & _
      "Set b = Range(""a1"")" & vbCrLf & _
      "a Is b = " & (a Is b) & vbCrLf & _
      "あらら・・"
  With ActiveSheet
    On Error Resume Next
    .Shapes("Rect1").Delete
    On Error GoTo 0
    With .Shapes.AddShape(msoShapeRectangle, [b10].Left, [b10].Top, _
              [b10].Width, [b10].Height)
     .Name = "Rect1"
     .Select
     End With
    DoEvents
    MsgBox "With .Shapes.AddShape(msoShapeRectangle, [b10].Left, [b10].Top, _" & vbCrLf & _
       "           [b10].Width, [b10].Height)" & vbCrLf & _
       "  .Name = ""Rect1""" & vbCrLf & _
       "  .Select" & vbCrLf & _
       "  End With" & vbCrLf & vbCrLf & _
       "で、Rect1という四角形を作成しましたが・・・"
    MsgBox "Shapes(""Rect1"") Is Shapes(""Rect1"") = " & _
       (.Shapes("Rect1") Is .Shapes("Rect1")) & vbCrLf & _
       "これもFalse"
    End With
End Sub

上記のコードを実行してみて下さい。

Application Is Application



ThisWorkbook Is ThisWorkbook

は、予想通りTrueとなるのに、

Range(“A1”) Is Range(“A1”)



Shapes(“Rect1”) Is Shapes(“Rect1”)

は、Falseになってしまいます。

不思議ではないですか?

【165】Re:ちょっと気になる現象2 Is 演算子
Excel  ichinose  - 06/12/23(土) 22:30 -

引用なし
パスワード
   VBAを長くやられている方は、既にお分かりだと思います。

私は、VBAをやり始めて一年ぐらいは理由が分かりませんでした。

Range("A1") Is Range("A1") の結果が Falseになるのは、

Range("A1")という記述が実行される度に

Rangeオブジェクトは別インスタンスが作られているからなのです。

よって、
Range("A1") Is Range("A1")
は別々のオブジェクトを比較しているので Falseとなるのです。

Range("a1").value=Range("a1").value

この記述では、ふたつのインスタンスが作成され、Valueプロパティの
代入処理を行っています。

With Range("A1")
  .Value=.Value
  End With

尚、このように記述すると、インスタンスはひとつしか作成されていません。

Shapeでの結果も同じ理由です。

実際に見えているセル = Rangeオブジェクト
実際に見えている図形 = Shapeオブジェクト

というように錯覚しがちですが(私は、最初はそう解釈していました)、

Rangeオブジェクトは、セルを操作する窓口であり、

Shapeオブジェクトは、図形を操作する窓口にすぎません。

ひとつのセル、ひとつの図形に対して、
複数の窓口を存在させる事が出来るのです。

同じ図形を見ていても、違う窓口(オブジェクト)であれば、

Is演算子は、Falseを返します。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
67 / 118 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:   
0
(SS)C-BOARD v3.8 is Free