Excel VBA質問箱 IV

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

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


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

【66919】未定義の変数? あきなす 10/10/17(日) 6:49 質問[未読]
【66920】Re:未定義の変数? 補足 あきなす 10/10/17(日) 7:13 発言[未読]
【66921】Re:未定義の変数? 補足 teian 10/10/17(日) 7:43 発言[未読]
【66924】Re:未定義の変数? 補足 あきなす 10/10/17(日) 8:20 発言[未読]
【66923】Re:未定義の変数? ichinose 10/10/17(日) 8:07 発言[未読]
【66925】Re:未定義の変数? あきなす 10/10/17(日) 8:52 お礼[未読]

【66919】未定義の変数?
質問  あきなす  - 10/10/17(日) 6:49 -

引用なし
パスワード
   VBA初心者です。
色々調べてみたのですが、よく分からないので質問させてください。
Excelのバージョンは2003です。

テキストが設定されたオートシェイプと、設定されていないオートシェイプがあり、それらを判別しようと思っています。
文字列が設定されたオートシェイプのテキストフィールドへのアクセスは

Dim s As Shape

For Each s In ActiveSheet.Shapes
  If s.TextFrame.Characters.Text="Hogehoge" then
  :

でできます。これに対して、テキストフィールドに文字が設定されていない場合、ウォッチウィンドウでみてみると、Text変数自体が未定義?となっているため、上記のコードではエラーが出てしまいます。質問は、Text変数が定義されているか否かを判定する方法があるかどうかです。

IsNull(s.TextFrame.Characters.Text)

では型が違うとおこられてしまいます。こういうときはどうすればいいんでしょうか?

もちろん、回避策としてs.AlternativeTextが使えますが、Excel2007に持っていった時につかえなくなってしまったため、根本的な解決策をとりたいと思った次第です。

OnErrorを使う手もありますが、将来エラーでなくなったとき(そんなことはないのか?)修正が必要になりそうなのと、スパゲティ化(プロシージャへの切り分けがすすでいるので、めちゃくちゃにはならないけども)が嫌という、まあ、気分的なもので避けたいのです。あと、可読性もわるそうな気がします。(といいながら、OnError版は作ってしまいました)。

20年くらい前にN88-BASICを触って以来のBASICだったので、懐かしい感じをうけつつも、オブジェクト化がずいぶん進んで、隔世の感です。N88-BASIC時代は、3000行も書けば、わけがわからなくなってたのを思い出しました(笑)

【66920】Re:未定義の変数? 補足
発言  あきなす  - 10/10/17(日) 7:13 -

引用なし
パスワード
   次のものは試しましたが、すべてダメでした

s.TextFrame.Characters.Text Is Nothing
IsEmpty(s.TextFrame.Characters.Text)
IsError(s.TextFrame.Characters.Text)

方法はあると思うんだけど・・・うーむ

【66921】Re:未定義の変数? 補足
発言  teian  - 10/10/17(日) 7:43 -

引用なし
パスワード
   質問の意味を正しく理解してないかもしれませんが、

>For Each s In ActiveSheet.Shapes
  If s.Type = msoTextBox Then
>  If s.TextFrame.Characters.Text="Hogehoge" then

と、TextBoxに限定してから判定に入ればいいてっこと?

意味が違ったら、無視して下さい。

【66923】Re:未定義の変数?
発言  ichinose  - 10/10/17(日) 8:07 -

引用なし
パスワード
   おはようございます。

>
>テキストが設定されたオートシェイプと、設定されていないオートシェイプがあり、それらを判別しようと思っています。

>
>IsNull(s.TextFrame.Characters.Text)
>
>では型が違うとおこられてしまいます。こういうときはどうすればいいんでしょうか?

IsNull(s.TextFrame.Characters.Font.Name)

では?


また、

>OnErrorを使う手もありますが、将来エラーでなくなったとき(そんなことはないのか?)修正が必要になりそうなのと、スパゲティ化(プロシージャへの切り分けがすすでいるので、めちゃくちゃにはならないけども)が嫌という、まあ、気分的なもので避けたいのです。あと、可読性もわるそうな気がします。(といいながら、OnError版は作ってしまいました)。

将来エラーでなくなるという仕様変更まで言及すると??ですが、
>スパゲティ化
一例ですが

Function HasText(shp As Shape) As Boolean
'HasText true ---テキストあり
'    false---テキストなし
  On Error Resume Next
  Dim g0 As Long
  HasText = False
  g0 = shp.TextFrame.Characters.Count
  If Err.Number = 0 Then
    If g0 > 0 Then
     HasText = True
    End If
  End If
  On Error GoTo 0
End Function

なんて作成しておいて、

メインプロシジャーでは、

Sub test()
  Dim shp As Shape
  Dim txt As Characters
  For Each shp In ActiveSheet.Shapes
    MsgBox shp.Name & "  " & IIf(HasText(shp), "テキストあり", "テキストなし")
  Next
End Sub

このように引用すれば、可読性が悪いとは思いませんよ!!

個人的な感想は、Functionの中のコードはともかく、Functionを使ってラップした方が

IsNull(s.TextFrame.Characters.Font.Name)

これより、意味はわかりやすいですが・・・。

検討してみてください。

【66924】Re:未定義の変数? 補足
発言  あきなす  - 10/10/17(日) 8:20 -

引用なし
パスワード
   どうもありがとうございます。
少し混乱させてしまったでしょうか。
テキストフィールドの文字列と言ったのは、オートシェイプに表示されている文字列のことです。四角形の内部に文字列がある場合と、ない場合の判別をしたいと思ってます。

【66925】Re:未定義の変数?
お礼  あきなす  - 10/10/17(日) 8:52 -

引用なし
パスワード
   貴重な情報ありがとうございます

IsNull(s.TextFrame.Characters.Font.Name)

はいけそうですね。Functionプロシージャを使う方法、とっても参考になります。
ただ、判定できる関数はないのかなぁ。。
それがもっともシンプルでいいと思うんだけど、仕様なんですかねぇ。他にも、こんなケースがありそうだけど、その度にFunctionプロシージャを作らないといけなくなりますかね。

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

ちなみにExcel2007では、テキストがないオートシェイプでも
  s.TextFrame.Characters.Text=""
と定義されてました。2003でもしといてくれればいいのに〜(笑)

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