Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6699 / 13644 ツリー ←次へ | 前へ→

【43583】"xxx"という名前のシェイプの存在確認方法 ひげくま 06/10/19(木) 14:45 質問[未読]
【43584】Re:"xxx"という名前のシェイプの... Jaka 06/10/19(木) 14:50 発言[未読]
【43596】Re:"xxx"という名前のシェイプの... ひげくま 06/10/19(木) 16:55 お礼[未読]
【43643】Re:"xxx"という名前のシェイプの... ごんぼほり 06/10/20(金) 19:16 回答[未読]
【43648】Re:"xxx"という名前のシェイプの... ひげくま 06/10/21(土) 12:20 お礼[未読]
【43642】Re:"xxx"という名前のシェイプ... yuu1 06/10/20(金) 17:31 回答[未読]
【43649】Re:"xxx"という名前のシェイプ... ひげくま 06/10/21(土) 12:24 お礼[未読]
【43651】Re:"xxx"という名前のシェイプ... ichinose 06/10/21(土) 17:47 発言[未読]
【43689】Re:"xxx"という名前のシェイプ... ひげくま 06/10/23(月) 9:17 お礼[未読]

【43583】"xxx"という名前のシェイプの...
質問  ひげくま  - 06/10/19(木) 14:45 -

引用なし
パスワード
   いつもお世話になっています。

さて、題名の通り、"xxx"という名前のシェイプ(実際には矢印)が存在するかどうかの確認方法について教えていただきたく、投稿しました。

現在は、

Dim shp As Object
Dim flagExist As Boolean

flagExist = False
For Each shp In ActiveSheet.Shapes
  If shp.Name = "xxx" Then
    flagExist = True
    Exit For
  End If
Next shp

If flagExist Then
  '存在したときの処理
Else
  '存在しなかったときの処理
End If

というやり方をしているのですが、
もし、

If 【Shapes("xxx")が存在すると判定】 Then
  '存在したときの処理
Else
  '存在しなかったときの処理
End If

という書き方があるのであれば、教えてください。
よろしくお願いします。

【43584】Re:"xxx"という名前のシェイプ...
発言  Jaka  - 06/10/19(木) 14:50 -

引用なし
パスワード
   他はエラートラップしかないと思います。

Dim ある As Shape
On Error Resume Next
Set ある = ActiveSheet.Shapes("xxxx")
Err.Clear
On Error GoTo 0
If ある Is Nothing Then
  MsgBox "ない"
Else
  MsgBox "ある"
End If

【43596】Re:"xxx"という名前のシェイプ...
お礼  ひげくま  - 06/10/19(木) 16:55 -

引用なし
パスワード
   ▼Jaka さん:
>他はエラートラップしかないと思います。

やはり、存在するかどうかをTrue/Falseで返してくれる関数は無いんですね。
エラートラップのコードも参考にさせていただきます。
回答ありがとうございました。

【43642】Re:"xxx"という名前のシェイプ...
回答  yuu1  - 06/10/20(金) 17:31 -

引用なし
パスワード
   こんにちは。
>If 【Shapes("xxx")が存在すると判定】 Then
>  '存在したときの処理
>Else
>  '存在しなかったときの処理
>End If
>
>という書き方があるのであれば、教えてください。

以下のようなかんじではどうでしょうか。
場合によっては不都合があるかもしれませんが。

 If VarType(Evaluate("xxx")) = vbObject Then
  Debug.Print "存在したときの処理"
 Else
  Debug.Print "存在しなかったときの処理"
 End If

【43643】Re:"xxx"という名前のシェイプ...
回答  ごんぼほり  - 06/10/20(金) 19:16 -

引用なし
パスワード
   >やはり、存在するかどうかをTrue/Falseで返してくれる関数は無いんですね。
>エラートラップのコードも参考にさせていただきます。

ないなら作る。そのためのVBAなのではないですか?
作るための方法が示されているのに...

Sub sample()

 Debug.Print ShapeExist(Sheet1, "xxx")

End Sub

Function ShapeExist(Sh As Worksheet, Name As String) As Boolean
Dim Chk As Shape
On Error Resume Next
 Set Chk = Sh.Shapes(Name)
On Error GoTo 0
ShapeExist = Not Chk Is Nothing
End Function

【43648】Re:"xxx"という名前のシェイプ...
お礼  ひげくま  - 06/10/21(土) 12:20 -

引用なし
パスワード
   ▼ごんぼほり さん:
>>やはり、存在するかどうかをTrue/Falseで返してくれる関数は無いんですね。
>>エラートラップのコードも参考にさせていただきます。
>
>ないなら作る。そのためのVBAなのではないですか?
>作るための方法が示されているのに...

回答ありがとうございます。
Jakaさんの回答で、そのような便利な関数がないことを知ったので、
ここには書きませんでしたが、すぐに自分で作りました。

【43649】Re:"xxx"という名前のシェイプ...
お礼  ひげくま  - 06/10/21(土) 12:24 -

引用なし
パスワード
   ▼yuu1 さん:
>以下のようなかんじではどうでしょうか。
>場合によっては不都合があるかもしれませんが。
>
> If VarType(Evaluate("xxx")) = vbObject Then
>  Debug.Print "存在したときの処理"
> Else
>  Debug.Print "存在しなかったときの処理"
> End If

回答ありがとうございます。
おぉ、私が求めていた形です。

実際にやってみて、上手く動作しました。

ただ、Evaluateの使い方がいまいち理解できていなくて、
「場合によっては不都合が…」というのがどういう場合なのか
まったく想像できません。
動作を把握していない関数を使うのは、後々大変なことになる
かもしれないので、動作を把握してから使おうと思います。

【43651】Re:"xxx"という名前のシェイプ...
発言  ichinose  - 06/10/21(土) 17:47 -

引用なし
パスワード
   ひげくま さん、yuu1 さん、こんばんは。

>>以下のようなかんじではどうでしょうか。
>>場合によっては不都合があるかもしれませんが。
>>
>> If VarType(Evaluate("xxx")) = vbObject Then
>>  Debug.Print "存在したときの処理"
>> Else
>>  Debug.Print "存在しなかったときの処理"
>> End If
>
これは、気が付きませんでした。
>
>実際にやってみて、上手く動作しました。
>
>ただ、Evaluateの使い方がいまいち理解できていなくて、
>「場合によっては不都合が…」というのがどういう場合なのか
>まったく想像できません。
>動作を把握していない関数を使うのは、後々大変なことになる
>かもしれないので、動作を把握してから使おうと思います。
上記のコードだとアクティブシートに対して有効です。
(又は、上記のコードを当該シートモジュールに配置した場合は、
 当該シートがアクティブでなくても有効です)


Sub test()
  If VarType(Worksheets("sheet1").Evaluate("四角形 2")) = vbObject Then
    MsgBox "exist"
  Else
    MsgBox "not exist"
    End If
End Sub

上記のようにシートオブジェクトのEvaluateメソッドを使うと、
標準モジュールでも又、アクティブシート以外でも
正しく作動してくれます。

ご参考までに!!

【43689】Re:"xxx"という名前のシェイプ...
お礼  ひげくま  - 06/10/23(月) 9:17 -

引用なし
パスワード
   ▼ichinose さん:
>上記のようにシートオブジェクトのEvaluateメソッドを使うと、
>標準モジュールでも又、アクティブシート以外でも
>正しく作動してくれます。
>
>ご参考までに!!

ありがとうございました。

6699 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free