Excel VBA質問箱 IV

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

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


1081 / 13645 ツリー ←次へ | 前へ→

【76412】VBAについて ゆっきーな 14/11/27(木) 18:03 質問[未読]
【76413】Re:VBAについて カリーニン 14/11/27(木) 20:32 発言[未読]
【76418】Re:VBAについて ichinose 14/11/28(金) 8:39 発言[未読]
【76419】Re:VBAについて ichinose 14/11/28(金) 8:50 発言[未読]
【76420】Re:VBAについて カリーニン 14/11/28(金) 9:35 発言[未読]
【76423】Re:VBAについて ichinose 14/11/28(金) 12:56 発言[未読]
【76426】Re:VBAについて ゆっきーな 14/11/28(金) 13:13 発言[未読]
【76428】Re:VBAについて ゆっきーな 14/11/28(金) 13:46 お礼[未読]
【76431】Re:VBAについて カリーニン 14/11/28(金) 21:07 お礼[未読]
【76424】Re:VBAについて ゆっきーな 14/11/28(金) 13:09 発言[未読]
【76427】Re:VBAについて ゆっきーな 14/11/28(金) 13:40 お礼[未読]
【76414】Re:VBAについて カリーニン 14/11/27(木) 20:51 発言[未読]
【76416】Re:VBAについて カリーニン 14/11/27(木) 23:13 発言[未読]
【76417】Re:VBAについて 通りすがり 14/11/28(金) 4:27 発言[未読]
【76425】Re:VBAについて ゆっきーな 14/11/28(金) 13:12 発言[未読]
【76429】Re:VBAについて ゆっきーな 14/11/28(金) 13:47 お礼[未読]

【76412】VBAについて
質問  ゆっきーな  - 14/11/27(木) 18:03 -

引用なし
パスワード
   シート上に”図1”というシェイプが存在する場合は、
メッセージで”あります”、無い場合は”無いです”を表示させたいのですが、
色々と試行錯誤してやってはみてるのですが、勉強不足で・・・
ご親切な方、教えて頂けないでしょうか。

excelは2013です。
元々シェイプカウントでIfを作っていたのですが、画像を追加してしまうと
対応出来ない為、シェイプの名前を指定した方が早いのではと思いました。

宜しくお願い致します。

【76413】Re:VBAについて
発言  カリーニン  - 14/11/27(木) 20:32 -

引用なし
パスワード
   エラー番号で判定するサンプルです。

Sub test()
Dim spnm As String
Dim dumyflg As Boolean
Dim spexists As Boolean
 spnm = "aa"
 On Error Resume Next
 Err.Clear
 dumyflg = IsObject(ActiveSheet.Shapes(spnm))
 If Err.Number = 0 Then
   MsgBox spnm & vbCrLf & "有る"
 Else
   MsgBox spnm & vbCrLf & "無い"
 End If
 On Error GoTo 0
End Sub

【76414】Re:VBAについて
発言  カリーニン  - 14/11/27(木) 20:51 -

引用なし
パスワード
   ↑の

Dim spexists As Boolean

は不要でした。

【76416】Re:VBAについて
発言  カリーニン  - 14/11/27(木) 23:13 -

引用なし
パスワード
   まじめに指定のシェイプが存在するか否かを判定する方法です。

VBAで特定のワークブック/ワークシート/オートシェイプ(図形)が存在するかチェックする
ht tp://d.hatena.ne.jp/sumihira1989/20140626/1403786010

【76417】Re:VBAについて
発言  通りすがり  - 14/11/28(金) 4:27 -

引用なし
パスワード
   ▼ゆっきーな さん:

過去に↓のような回答もありました。

Sub Test() '図の存在チェック
 If IsObject(Evaluate("図1")) Then
  MsgBox "存在します"
 Else
  MsgBox "存在しません"
 End If
End Sub

オリジナル出展はk窓 E00M079
h tp://www2.aqua-r.tepm.jp/~kmado/ke_m8.htm

【76418】Re:VBAについて
発言  ichinose  - 14/11/28(金) 8:39 -

引用なし
パスワード
   Sub test1()
  Dim shp As Shape
  Const nf = -2147024809
  On Error Resume Next
  Set shp = ActiveSheet.Shapes("図1")
  If Err.Number = 0 Then
    MsgBox "存在します"
  ElseIf Err.Number = nf Then
    MsgBox "指定のシェイプは、ありません"
  Else
    MsgBox "その他のエラー" & Err.Description
  End If
  On Error GoTo 0
End Sub

エラートラップを拾うカリーニンさんの最初の投稿が
良いと思いますけどねえ・・・。


コレクションをぐるぐる回す方法は、シート内の貼り付ける図形の数なんて
たかが知れていますから、大したことはないですけど、図形名の順次検索ですよね?

Shapes("図1") とすれば、たぶん、ハッシュ法を採用しているはずですから、
検索は速いと思ますよ!!
そうでなければ、コレクションにする意味がないですよね


因みに
通りすがりさんの投稿の場合、

>if IsObject(Evaluate("図1")) Then

セルに図1 という名前を付けても反応してしまいますけどねえ

【76419】Re:VBAについて
発言  ichinose  - 14/11/28(金) 8:50 -

引用なし
パスワード
   追伸

私の投稿の趣旨は、

On Error Resume Nextは、使い方次第で様々な個所で利用できるという事です。
あまり使わない方がよいという投稿をたまに目にしますが、
正しい(うまい)使い方を研究することだと思います。

使い方を間違えると、バグが発見できなかったりしますが、
うまく使えば、強力なステートメントですよね!!

【76420】Re:VBAについて
発言  カリーニン  - 14/11/28(金) 9:35 -

引用なし
パスワード
   逆に、私は最初、シェイプを選択したら名前ボックスにシェイプの名前が出る
ので、そこで判定できるかも、と考えたのですが、定義した名前の一覧に
シェイプの名前が出てこなかったので使えませんでした。

【76423】Re:VBAについて
発言  ichinose  - 14/11/28(金) 12:56 -

引用なし
パスワード
   ▼カリーニン さん:
>逆に、私は最初、シェイプを選択したら名前ボックスにシェイプの名前が出る
>ので、そこで判定できるかも、と考えたのですが、定義した名前の一覧に
>シェイプの名前が出てこなかったので使えませんでした。
これは、Shapesコレクションをグルグル回す(For Each等で)と、
既定名(名前ボックスの名)では、検索できない という意味ですよね?

既定名で運用すると、二つの名前を持ってしまいますからねえ!!

Excelを起動した直後に 新規ブックの標準モジュールに

Option Explicit
Sub test()
  Dim rect As Object
  With ActiveSheet
    Set rect = .Rectangles.Add(50, 50, 50, 50)
    MsgBox .Shapes("正方形/長方形 1").Name
    Debug.Print .Shapes("正方形/長方形 1").Name
    rect.Name = "ichinose"
    MsgBox .Shapes(rect.Name).Name
    MsgBox .Shapes("正方形/長方形 1").Name
    MsgBox .Shapes("Rectangle 1").Name
  End With
  Set rect = Nothing
End Sub


上記のコードを実行してみると、わかるように
新規に作成した四角形には 正方形/長方形 1 なんて名前が命名されます。
これのVBAで参照可能な既定名は Rectangle 1 になります。

この四角形の名前を ichinose に代えた後も
正方形/長方形 1 や Rectangle 1 という既定名でもオブジェクトを取得できてしまいます。

この辺りの事を考慮すると、仕様をどのようにするのか ということも結構重要になってきますね

【76424】Re:VBAについて
発言  ゆっきーな  - 14/11/28(金) 13:09 -

引用なし
パスワード
   ▼カリーニン さん:
>エラー番号で判定するサンプルです。
>
>Sub test()
> Dim spnm As String
> Dim dumyflg As Boolean
> Dim spexists As Boolean
> spnm = "aa"
> On Error Resume Next
> Err.Clear
> dumyflg = IsObject(ActiveSheet.Shapes(spnm))
> If Err.Number = 0 Then
>   MsgBox spnm & vbCrLf & "有る"
> Else
>   MsgBox spnm & vbCrLf & "無い"
> End If
> On Error GoTo 0
>End Sub


回答ありがとうございます。
いくつか投稿を頂いているので、全て試したいと思います。
シェイプの名前”図1”はあくまで例です。
実際には、任意の名前をシェイプに付けます。
そうすれば、他の方が画像やシェイプを挿入された時でも
エラーが出ないと思われますので!
検証終わりましたら、再度ご連絡致します!

【76425】Re:VBAについて
発言  ゆっきーな  - 14/11/28(金) 13:12 -

引用なし
パスワード
   ▼通りすがり さん:
>▼ゆっきーな さん:
>
> 過去に↓のような回答もありました。
>
>Sub Test() '図の存在チェック
> If IsObject(Evaluate("図1")) Then
>  MsgBox "存在します"
> Else
>  MsgBox "存在しません"
> End If
> End Sub
>
>オリジナル出展はk窓 E00M079
>h tp://www2.aqua-r.tepm.jp/~kmado/ke_m8.htm


回答ありがとうございます。
いくつか投稿を頂いているので、全て試したいと思います。
またご連絡致しますので、宜しくお願い致します。

【76426】Re:VBAについて
発言  ゆっきーな  - 14/11/28(金) 13:13 -

引用なし
パスワード
   ▼ichinose さん:
>▼カリーニン さん:
>>逆に、私は最初、シェイプを選択したら名前ボックスにシェイプの名前が出る
>>ので、そこで判定できるかも、と考えたのですが、定義した名前の一覧に
>>シェイプの名前が出てこなかったので使えませんでした。
>これは、Shapesコレクションをグルグル回す(For Each等で)と、
>既定名(名前ボックスの名)では、検索できない という意味ですよね?
>
>既定名で運用すると、二つの名前を持ってしまいますからねえ!!
>
>Excelを起動した直後に 新規ブックの標準モジュールに
>
>Option Explicit
>Sub test()
>  Dim rect As Object
>  With ActiveSheet
>    Set rect = .Rectangles.Add(50, 50, 50, 50)
>    MsgBox .Shapes("正方形/長方形 1").Name
>    Debug.Print .Shapes("正方形/長方形 1").Name
>    rect.Name = "ichinose"
>    MsgBox .Shapes(rect.Name).Name
>    MsgBox .Shapes("正方形/長方形 1").Name
>    MsgBox .Shapes("Rectangle 1").Name
>  End With
>  Set rect = Nothing
>End Sub
>
>
>上記のコードを実行してみると、わかるように
>新規に作成した四角形には 正方形/長方形 1 なんて名前が命名されます。
>これのVBAで参照可能な既定名は Rectangle 1 になります。
>
>この四角形の名前を ichinose に代えた後も
>正方形/長方形 1 や Rectangle 1 という既定名でもオブジェクトを取得できてしまいます。
>
>この辺りの事を考慮すると、仕様をどのようにするのか ということも結構重要になってきますね


回答ありがとございます。
いくつか投稿を頂いているので、全て試したいと思います!
またご連絡致しますので、宜しくお願い致します。

【76427】Re:VBAについて
お礼  ゆっきーな  - 14/11/28(金) 13:40 -

引用なし
パスワード
   ▼ゆっきーな さん:
>▼カリーニン さん:
>>エラー番号で判定するサンプルです。
>>
>>Sub test()
>> Dim spnm As String
>> Dim dumyflg As Boolean
>> Dim spexists As Boolean
>> spnm = "aa"
>> On Error Resume Next
>> Err.Clear
>> dumyflg = IsObject(ActiveSheet.Shapes(spnm))
>> If Err.Number = 0 Then
>>   MsgBox spnm & vbCrLf & "有る"
>> Else
>>   MsgBox spnm & vbCrLf & "無い"
>> End If
>> On Error GoTo 0
>>End Sub
>
>
>回答ありがとうございます。
>いくつか投稿を頂いているので、全て試したいと思います。
>シェイプの名前”図1”はあくまで例です。
>実際には、任意の名前をシェイプに付けます。
>そうすれば、他の方が画像やシェイプを挿入された時でも
>エラーが出ないと思われますので!
>検証終わりましたら、再度ご連絡致します!


早速試してみました!
無事エラーも出ず、私の思うように動いております!
本当に助かりました!!
ちなみにシェイプの名前は”人数情報”というのに指定してみました。
他にも画像を入れたりしてチェックしてみます!
本当に感謝致します。

【76428】Re:VBAについて
お礼  ゆっきーな  - 14/11/28(金) 13:46 -

引用なし
パスワード
   ▼ゆっきーな さん:
>▼ichinose さん:
>>▼カリーニン さん:
>>>逆に、私は最初、シェイプを選択したら名前ボックスにシェイプの名前が出る
>>>ので、そこで判定できるかも、と考えたのですが、定義した名前の一覧に
>>>シェイプの名前が出てこなかったので使えませんでした。
>>これは、Shapesコレクションをグルグル回す(For Each等で)と、
>>既定名(名前ボックスの名)では、検索できない という意味ですよね?
>>
>>既定名で運用すると、二つの名前を持ってしまいますからねえ!!
>>
>>Excelを起動した直後に 新規ブックの標準モジュールに
>>
>>Option Explicit
>>Sub test()
>>  Dim rect As Object
>>  With ActiveSheet
>>    Set rect = .Rectangles.Add(50, 50, 50, 50)
>>    MsgBox .Shapes("正方形/長方形 1").Name
>>    Debug.Print .Shapes("正方形/長方形 1").Name
>>    rect.Name = "ichinose"
>>    MsgBox .Shapes(rect.Name).Name
>>    MsgBox .Shapes("正方形/長方形 1").Name
>>    MsgBox .Shapes("Rectangle 1").Name
>>  End With
>>  Set rect = Nothing
>>End Sub
>>
>>
>>上記のコードを実行してみると、わかるように
>>新規に作成した四角形には 正方形/長方形 1 なんて名前が命名されます。
>>これのVBAで参照可能な既定名は Rectangle 1 になります。
>>
>>この四角形の名前を ichinose に代えた後も
>>正方形/長方形 1 や Rectangle 1 という既定名でもオブジェクトを取得できてしまいます。
>>
>>この辺りの事を考慮すると、仕様をどのようにするのか ということも結構重要になってきますね
>
>
>回答ありがとございます。
>いくつか投稿を頂いているので、全て試したいと思います!
>またご連絡致しますので、宜しくお願い致します。


早速試してみました。
カリーニン様のご投稿頂いた内容で、無事に動きました。
”図1”ですと、ありきたりだと思うので、
”人数情報”という名前を指定する事に致しました。
今のところは動いておりますが、画像を沢山挿入したりして検証したいと
思います!
ご回答誠に有難うございます!

【76429】Re:VBAについて
お礼  ゆっきーな  - 14/11/28(金) 13:47 -

引用なし
パスワード
   ▼ゆっきーな さん:
>▼通りすがり さん:
>>▼ゆっきーな さん:
>>
>> 過去に↓のような回答もありました。
>>
>>Sub Test() '図の存在チェック
>> If IsObject(Evaluate("図1")) Then
>>  MsgBox "存在します"
>> Else
>>  MsgBox "存在しません"
>> End If
>> End Sub
>>
>>オリジナル出展はk窓 E00M079
>>h tp://www2.aqua-r.tepm.jp/~kmado/ke_m8.htm
>
>
>回答ありがとうございます。
>いくつか投稿を頂いているので、全て試したいと思います。
>またご連絡致しますので、宜しくお願い致します。


全て検証を終えました。
上記の内容でも私は問題がありませんでしたが、カリーニン様の
内容にて今回は運用しようと思います。
ご回答本当にありがとうございました。

【76431】Re:VBAについて
お礼  カリーニン  - 14/11/28(金) 21:07 -

引用なし
パスワード
   勉強になります。ありがとうございました。

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