Excel VBA質問箱 IV

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

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


2282 / 13646 ツリー ←次へ | 前へ→

【68984】テキストボックスの値取得 komarinko 11/5/5(木) 17:35 質問[未読]
【68986】Re:テキストボックスの値取得 kanabun 11/5/5(木) 17:50 発言[未読]
【68988】Re:テキストボックスの値取得 kanabun 11/5/5(木) 20:18 発言[未読]
【68989】Re:テキストボックスの値取得 kanabun 11/5/5(木) 20:28 発言[未読]
【68990】Re:テキストボックスの値取得 kanabun 11/5/5(木) 20:36 発言[未読]
【68987】Re:テキストボックスの値取得 UO3 11/5/5(木) 19:11 発言[未読]
【68995】Re:テキストボックスの値取得 komarinko 11/5/6(金) 0:48 お礼[未読]

【68984】テキストボックスの値取得
質問  komarinko  - 11/5/5(木) 17:35 -

引用なし
パスワード
   エクセルのシートに存在するテキストボックスの値をVBAで取得しようとしています。
まず、テキストボックスに値を入れる操作をマクロで記録して以下のコードを得ました。

Sub Macro17()
  Sheets("グラフ").Select
  ActiveSheet.Shapes("buf").Select
  Selection.Characters.Text = "+10000000"
  With Selection.Characters(Start:=1, Length:=18).Font
    .Name = "MS Pゴシック"
    .FontStyle = "標準"
    .Size = 11
    .Strikethrough = False
    .Superscript = False
    .Subscript = False
    .OutlineFont = False
    .Shadow = False
    .Underline = xlUnderlineStyleNone
    .ColorIndex = xlAutomatic
  End With

このコードから、シート「グラフ」のシェイプス「buf」のCharacters.Textを拾えばいいのだと考え、aという変数に、シェイプス「buf」の値を代入するという以下のコードを作ってみました。

Sub test()
Dim a
a = Sheets("グラフ").Shapes("buf").Characters.Text = "+10000000"
End Sub

ところが、「インデックスが有効範囲にありません」というエラーが出ました。
なにがいけないのか教えていただけないでしょうか。

【68986】Re:テキストボックスの値取得
発言  kanabun  - 11/5/5(木) 17:50 -

引用なし
パスワード
   ▼komarinko さん:

>このコードから、シート「グラフ」のシェイプス「buf」のCharacters.Textを
> 拾えばいいのだと考え、aという変数に、シェイプス「buf」の値を代入する
> という以下のコードを作ってみました。
>
>Sub test()
>Dim a
>a = Sheets("グラフ").Shapes("buf").Characters.Text = "+10000000"
>End Sub
取得ですから、
>a = Sheets("グラフ").Shapes("buf").Characters.Text
と書こうとしたのでしょうね?

>ところが、「インデックスが有効範囲にありません」というエラーが出ました。

INDEXエラーなら、bufという名前のTextBoxがなかったとか?

こちらでは、
-----------------------------
実行時エラー '438':
オブジェクトは、このプロパティまたはメソッドをサポートしていません
-----------------------------
というえらーになります。

以下のように してみてください。

Sub test2() 'ShapesクラスのTextFrameプロパティから取得
 Dim ss As String
 ss = Sheets("グラフ").Shapes("buf").TextFrame.Characters.Text
End Sub

もっと簡単なのは、以下です

Sub test3()   'TextBoxesコレクションの Characters.Text として取得
 Dim ss As String
 ss = Sheets("グラフ").TextBoxes("buf").Characters.Text
End Sub

【68987】Re:テキストボックスの値取得
発言  UO3  - 11/5/5(木) 19:11 -

引用なし
パスワード
   ▼komarinko さん:

基本的には a = b = c という構文は間違っていますよね?

ともあれ、kanabunさんから2つほどコード例がでていますが、そのほか

Sub test4() 'ShapesクラスのDrwingObjectsから取得
 Dim ss As String
 ss = Sheets("グラフ").Shapes("buf").DrwingObject.Caption
End Sub

といったものでも取得できますね。

【68988】Re:テキストボックスの値取得
発言  kanabun  - 11/5/5(木) 20:18 -

引用なし
パスワード
   ご存知のように、マクロの記録の修正の基本は
Select  Selection を取ることです。

-------------------------------------------------
たとえば、マクロの記録結果が以下のようであるとき、
 Range("B2").Select
 Selection.Copy
 Sheets("Sheet2").Select
 Range("B2").Select
 ActiveSheet.Paste
 Sheets("Sheet1").Select
 Application.CutCopyMode = False

修正したコードは、次のようになります。
 Range("B2").Copy Worksheets("Sheet2").Range("B2")


-------------------------------------------------
図形(TextBox)にテキストを登録する作業を記録すると、
以下のような記録コードが得られます。
 ActiveSheet.Shapes("buf").Select
 Selection.Characters.Text = "abc"

Selectすることが目的ではなく、図形にテキストを登録することが
目的なので、前のセルのコピー&ペィストと同じ方式で、
1行目の .Selectと 2行目の Selection を取って、
 ActiveSheet.Shapes("buf").Characters.Text = "abc"
と修正して、実行すると、エラーになってしまいます。

これは、
> ActiveSheet.Shapes("buf").Select
で選択したオブジェクトと、
2行目の
> Selection
の正体が、実は異なっているからです。

記録マクロのコードの
> ActiveSheet.Shapes("buf").Select
の次に、
  MsgBox TypeName(Selection)
を挿入して、確認してみてください。オブジェクトの型は Shape
ではなく、 TextBox オブジェクトに変わっています。
 Shapes のメンバを選択すると、
 選択されたものは Excelオブジェクト(Rectangleとか Ovalとか
 Picture とか ChartObject とか... TextBoxなど)になるのです。
 Excelオブジェクトというのは昔からある図形関係のオブジェクト
 のことです。 Shape のほうは あとでExcelオブジェクトとその他
 図形関係のコメントFrameとかオートフィルタの▼マークなどを
 十把ひとからげにまとめた新しいオブジェクトです。

図形のばあい、 .Select、Selectionをとって、1行で書く方法は
すでに例示しましたように、
Selection の正体であるTextBoxオブジェクトを使って、

 ActiveSheet.TextBoxes("buf").Characters.Text = "abc"

とするか、

ShapeオブジェクトとCharactersオブジェクトの間に TextFrame
オブジェクトを介在させて(このTextFrameオブジェクトが Shape
グループをExcel図形オブジェクトの一つであるTextBoxオブジェクト
に変換してくれます)、一行で書くことです。

 ActiveSheet.Shapes("buf").TextFrame.Characters.Text = "abc"

Selectされたオブジェクトが必ずしも Selection であるとは限らない
ことに注意してください
(渡辺ひかるさん『実用サンプルコレクション』 より (^^)

【68989】Re:テキストボックスの値取得
発言  kanabun  - 11/5/5(木) 20:28 -

引用なし
パスワード
   ↑のことは
ht tp://www.clayhouse.jp/vba/vba03.htm
にくわしく書いてあります。

●図形のレガシーオブジェクト

> ExcelVBAのヘルプによれば、図形(描画オブジェクト)は、
> 基本的にShapeオブジェクトおよびShapesコレクション
>(またはShapeRangeコレクション)を使用して操作すると
> いうことになっています。
> しかし、実際には、Shape/Shapesでは実現できない処理が存在しています。
> このような処理には、Shape/Shapesではなく、ヘルプにも載っていない
> レガシーな(旧時代の)オブジェクトを使用する必要があります。
>
> •DrawingObjectsコレクションについて
> •オブジェクトの相互変換
> •特定の種類の図形を表すオブジェクト
> •特定の種類のコントロールを表すオブジェクト

いちど、最初から「最後まで」読んでみてください。

【68990】Re:テキストボックスの値取得
発言  kanabun  - 11/5/5(木) 20:36 -

引用なし
パスワード
   補足です
>Selection の正体であるTextBoxオブジェクトを使って、
>
> ActiveSheet.TextBoxes("buf").Characters.Text = "abc"

これは、Excelオブジェクトの総称である

 Sheets("グラフ").DrawingObjects("buf").Text = "abc"

でも、もちろんいいですね

【68995】Re:テキストボックスの値取得
お礼  komarinko  - 11/5/6(金) 0:48 -

引用なし
パスワード
   komarinkoさん、UO3さん、回答ありがとうございます。
オブジェクトが思っていたような構造でなく、ちょっと複雑で驚きましたが、理解できました。

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