Dim rng As Range, txtbox As Shape
Set rng = Range("A1")
Set txtbox = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 1, 1, 100, 30)
text.Name = rng + "d"
この場合最後の行で変数 rng は無視されてテキストボックスの名前は「d」となります。
text.Name = Range("A1") + "d"
とか
text.Name = Cells(1,1) + "d"
とすると
名前は「(A1の内容)d」
となります。
この違いってどういうものなのでしょう。Range型変数を用いて「(A1の内容)d」とすることはできないのでしょうか。
もう1点だけ。
変数の型について
https://www.moug.net/tech/exvba/0150065.html
にあるObject型というのは
あらゆる種類のオブジェクトを格納できる、オブジェクトに関してはVariant的な存在なのでしょうか。
No.1
- 回答日時:
txtbox.name は名前ですから、文字列型 string でないといけません。
rng は range 型ですから、そりゃダメですよ。
ところで、あなた + って書いてるけど & の間違い?
object 型は、変数の型の一種ですが、variant 型と違って、もっと厳密です。
テキストボックスや、チェックボックスや、グラフ、グラフの軸のような、実体を持った何かがオブジェクトであって、その固有 id が object 型の定数変数になります。例えば、あるグラフの id を、関数の引数として渡してあげたいような時に object 型の変数を使います。
text.Name = rng.value & "d"
としても無視される、なぜだ、これなら文字列の結合のはず
と思ったら
&が+になっていたというミスも重なっていたのですね。
先が思いやられる。
では例えばShape型はObject型より扱えるオブジェクトが限られているということですね。
どうもありがとうございました。
No.2
- 回答日時:
こんにちは
既回答の通りなのですが、理解なさっていないようですので・・・
>text.Name = rng + "d"
多分、text ← txtbox、 + ← & の間違えと想定します。
まず、変数rngはRangeオブジェクトです。
>これなら文字列の結合のはず
オブジェクトなので、厳密に言えば文字列ではありません。
ただし、処理中にVBAのエンジンが値の文字列を参照してくれる場合があるので、誤解を生じているものと思われます。
例えば、ご提示のテキストボックス(txtbox)はshapeオブジェクトであって、内容のテキスト(文字列)と等価ではありませんよね?
オブジェクトの属性の一つとしてテキストの文字列を持ってはいますが、
msgbox txtbox
として、内容の文字列が表示されるのを期待しても、エラーになるだけです。
txtbox.Text
などとすることで、始めてそのテキストを参照することができます。
Rangeオブジェクトも同様で、内容の値は勿論、セル範囲・位置、表示書式、連結の状態等々の様々な情報を有しています。(なぜならRange「オブジェクト」だから)
ですので、値を参照したい時には、エンジンまかせにせずに、きちんと
Range.Value
などのように明示的に記述するようにしておけば、間違えは少なくなることでしょう。
>オブジェクトに関してはVariant的な存在なのでしょうか。
オブジェクトはあくまでもオブジェクトです。
(オブジェクト型に数値等は代入できませんが、Variantは可能です。)
その意味では、Variantは型をあまり意識しなくても良いように作成された「お便利型」の変数と言えるかも知れません。(これが却って不便になるケースも存在すると思いますが)
https://docs.microsoft.com/ja-jp/office/vba/lang …
少し理解が進みました。
どうもありがとうございました。
でも
Dim rng As Range, txt As Shape
Set shp = ActiveSheet.Shapes("Picture 1")
Set rng = Range("A2")
txt.DrawingObject.Formula = "=A2" ←この行
は動作
=がなくとも動作
text.DrawingObject.Formula = "=rng"
は動作せず
Integer型 i = 2として
text.DrawingObject.Formula = "A" & i
これも動作
text.DrawingObject.Formula = "=" & rng
これは動作せず
text.DrawingObject.Formula = rng
ついでにこれも動作せず
A2とrngは参照という点で等価な気がしますが、難しい。
No.3
- 回答日時:
もしかしたら、親オブジェクト(モジュール)についてミスしているかもしれません。
① Set rng = Range("A1")
② Set txtbox = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 1, 1, 100, 30)
片方には、ActiveSheet を入れて、もう片方には入れていません。
それで、同じ所を指しているだろうか、ということです。もしかしたら、違う所を指しているのではないか、と思います。これが成立するのは標準モジュールのみです。
>この場合最後の行で変数 rng は無視されてテキストボックスの名前は「d」となります。
text.Name = rng + "d"
これは、成立しています。無視されていません。
A1に値が入っていなければ、"d" になりますね。ところが、A1の親オブジェクトがわかっていないと、無視されているように思うかもしれません。そのコードは、まず「標準モジュール」に書くべきものだということです。
つまり、Rng の親は、ActiveSheet でなくてはならないけれども、そのモジュールをシートモジュールに書いてしまうと、Worksheets("Sheet1").Range("A1") とでもしないと、その書いたモジュールの親を示してしまいます。
厳密には、Excel.ThisWorkbook.Sheets("Sheet1").Range ("A1") とでもいうのですが、いくつか省略が可能だということです。[全部を書くのをコンテナー型といいます。それはいくつかは省略できるわけです。]
text.Name = rng + "d"
のプラス(+)については、VB6/VBAでは、「+」を文字結合に使ってはいけないという「暗黙のルール」があります。そうしないと、数値+数値の時は、計算してしまって、文字の時は、文字の連結ではややこしくてしょうがないからです。
また、Object型というのはのは、設計の段階で、いろんな要素(オブジェクト・プロパティ)を設けることです。それをまとめて、一体として存在を表しているものです。今回は、オブジェクトは、Shape を示しています。
オートシェイプのTextBox では、直接、TextやValueのプロパティがありません。VBAの入門でいきなり、そこで思うようにしたいと言っても、古いオブジェクトで、インテリセンスに出てこないプロパティについては、テキストをみるなり、改めて相談してください。
言い換えれば、TxtBox.Text も TxtBox.Value も、この場合はエラーになります。
ご返答ありがとうございます。勉強になりました。
rng.valueが無視されていると思ったのは参照先のセルが空白だったからでした。
VBEとにらめっこしすぎてワークシートがお留守になっていました。お騒がせしました。
テキストボックスのプロパティが追加されてもいい気がしますね。
No.4ベストアンサー
- 回答日時:
No2です。
>A2とrngは参照という点で等価な気がしますが、難しい。
一方はオブジェクト、他方はセル位置を示す文字情報ですので、等価ではありません。
「Rangeはオブジェクトである」ということを忘れないでください。
>text.DrawingObject.Formula = "=rng" は動作せず
>text.DrawingObject.Formula = "=" & rng これは動作せず
>text.DrawingObject.Formula = rng ついでにこれも動作せず
いずれも関数式を設定するセンテンスで、右辺は関数式を意味する「文字列」である必要があります。
上記のうち、"=rng"は文字列ではありますが、そのまま "=rng"という意味になるので、関数式として理解されない可能性が高いです。
(エクセルはrngという名前の定義を探しますが、定義が見つからなければエラーになります)
その他は、オブジェクトを文字列であるかのように勘違いをしていると思われる記述になっていて、機械には解釈できない記述になっています。
なさりたいことは、Rangeオブジェクトが有しているセル位置の情報を文字列化した「A2」($A$2)を右辺に設定することではないでしょうか?
ですので、右辺を
"=" & rng.Address
等とすることで、動作するようになると思います。
(rngオブジェクトが保持しているセル位置属性を明示的に示している)
>「Rangeはオブジェクトである」ということを忘れないでください。
ありがとうございます。
Range型の変数は他のオブジェクトと異なって、Range型を宣言した時点でセル参照のみを示している
つまりAddressプロパティなしでrng.Addressが持つ情報と同じものだと誤解していました。
前にも(それまでよりは)理解が進んだと記しましたが、No.2にて頂いたご回答の意味がまた少し理解できてきました。
ただ依然どこかに誤解が解消されていない気もします。1か所だけならまだしも複数潜在していると、試行錯誤でうまく動作するパターンを見つけて学習するという作業が飛躍的に難しくなってしまうのですよね。
こういう場合は外部が示す基礎基本に忠実に則った学習が効果を生むはずですが、理解できていないことを認識できていないと独学の重点的なターゲットになりにくいというのがネックです。
誤解している部分が多すぎて今後も学習が進みづらい予感がします。
そんな中にあって理解の深い方からのアドバイス、非常に助かりました。重ねてお礼申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) findメソッドの変数について 6 2023/06/23 08:01
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Excel(エクセル) VBA 1 2023/04/27 13:37
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Excel(エクセル) シート名を簡単に書く方法があれば教えてください。 4 2023/08/24 12:40
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル初心者です 関数の入れ...
-
Microsoft1Officeの互換ソフト...
-
Excel ピボットテーブルで日付...
-
エクセル関数を教えてください
-
【マクロ】その時、その時で変...
-
【マクロ】読取専用のファイル...
-
LOOKUP関数を使えばいいのでし...
-
エクセル 白黒印刷で白線を印刷...
-
【関数】先頭だけにある、半角...
-
【関数】適切な文字数の数字を...
-
Excelのチェックボックスの使い...
-
エクセルでの作業計算方法について
-
Excelのpivotについて質問です
-
WPS OFFICEでの縦書きについて
-
時間によってファイル名が変わ...
-
エクセルのセルに同じ大きさの...
-
Aというブックの1というシート...
-
エクセルの順位別一覧表の自動...
-
西暦や和暦の表示をyyyymmdd表...
-
【マクロ】エクセルにかいてあ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報