エクセル(2013)VBAで、オートシェイプを移動させるためにSelectした際に、Excel2 007以降、オートシェイプに白い枠線とハンドルがついてしまうのですが、以前のエクセルのように枠線を表示させない方法があったら教えてください。
例1:
ActiveSheet.Shapes.Range("Picture 1").Select
For i=1 to 50
Selection.Left=i
Doevents
next
この場合はずっとハンドルがついたまま表示されます。
例2:
For i=1 to 50
ActiveSheet.Shapes.Range("Picture 1").Left=i
DoEvents
next
こうすればハンドルは表示されませんが、オブジェクトが変更になった都度変更の処置が必要です。
オートシェイプは数種類変更するので、Selection(例1)でやりたいのです。
ちょっとややこしい説明ですが、わかる方ご指導お願いします。
ちなみに、Excel2003までは例1の方法で枠線は出ません。
No.3ベストアンサー
- 回答日時:
想像で回答してます。
違ってたら読み捨てて下さい。選択したシェイプを一旦、オブジェクト変数に代入した後、適当なセルを選択することによりシェイプの選択を解除します。その後、シェイプを移動させます。
ActiveSheet.Shapes.Range("Picture 1").Select
Set sh = Selection
Range("A1").Select
For i = 1 To 50
sh.Left = i
DoEvents
Next
できました!!!
Set sh = Selection のアイディアが思いつきませんでした。
大変助かりました。今後ともよろしくお願いします。
ありがとうございました。
No.2
- 回答日時:
>For Nextで動かしたいのです。
>もしよければ再度、ご指導お願いします。
おそらく、ご質問の中で、私には分かっていない部分があるようです。
For Next って、オブジェクトを 1 から、50 の増加の過程が、なぜ必要なのか分かりません。もしかしたら、それは、記録マクロの方法ではありませんか?それとも、アニメーション化するつもりですか?それ以外に意味はないと思います。目で動きを確認するとか、目の訓練をするとかなら、それは別です。(動きを視覚化する方法は最後に書きます)
>オートシェイプは数種類変更するので、Selection(例1)でやりたいのです。
どうやらご質問の趣旨は、Selectionで行えるようなコードを教えてほしいというようですが、私の書いたコードは、意味が理解できなかったような気がします。
そもそも、.Left を50にするなら、これでもよいはずです。
ActiveSheet.Shapes.Range("Picture 1").Left= 50
現在の位置から、50なら、
With ActiveSheet.Shapes.Range("Picture 1")
.Left= .Left + 50
End With
>回答いただいたものは、ただ、指定しただけなので、それを動かす場合に支障が出ています。
それに、質問に対して、支障が出るようなコードを書いたつもりはありませんが……。
Selection を使うなら、すでに書いたはすでず。
VBAでは、何を選択しているかは分かりませんから、最初に、その選択しているオブジェクトをチェックします。そういうコードは不要だという方も時々いらっしゃるようです。ただ、そういう要求をする人には、もう私は不要だと思ってください。プログラミングの体をなさなくなりますから。
#1 で書いた、objectMoving2は、ダメなのでしょうか。
このように書き換えが可能です。
Sub objectMoving3()
Dim obj As Object
If TypeName(Selection) = "Picture" Then
Set obj = Selection
Else
MsgBox "オブジェクトを選択してください。", vbExclamation
Exit Sub
End If
With obj
.Left = .Left + 50
End With
ActiveCell.Select 'Selection状態を解除
End Sub
この程度は、お分かりになるはずです。
これではダメだというのなら、ご質問そのものを私は理解できていません。
以下のように、名称が決まっていない場合は、Pictures を使います。
(1) の中の数字は、Index と呼びますが、いわば、順序です。これは、Selection が不要ですし、Selection の中身のチェックもいりません。
With ActiveSheet.Pictures(1)
.Left = .Left + 50
.Top = .Top + 10
End With
セルの大きさは、Point でも表します。この表示している数字は、Point と呼んでいます。今のオブジェクトの位置もPoint とセルの位置と両方を持っています。どちらか、お好きなものを使えばよいと思います。
ActiveSheet.Shapes.Range("Picture 1").Select
For i=1 to 50
Selection.Left=i
'↑ここにi = 1が入れば、Left = 1 50が入れば、50
になります。
Next
例えば、左50 というよりも、B1 という位置のほうが分かりやすいはずです。
標準で、セルの横幅は、54 pointsです。
それに、ループで i =1 から、50 まで、アニメーション化するということ以外に必要性は考えられません。ほぼ、セルひとつ分横に動くことです。
また、現在の位置から、右にとか、左にとか、上にとか、下にという話でしたら、
With ActiveSheet.Shapes.Range("Picture 1")
.Left =.Left + 50 '右に50 逆はマイナス値です。
.Top = .Top + 10 '下に10
End With
とはなるのですが、For Next インクリメントにして、見せるなら、
Application.Wait Now() + TimeSerial(0, 0, 1)
を使うなり、
モジュールの最上行か、Option Explicit の下に
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
と置き、
コードの中で
Sleep 500 '0.5 秒
などと入れて上げればよいのです。
ちょっと書きすぎてしまいましたが、これは、たぶん、技術的な問題ではないような気がします。これでダメなら、別の人が書いてくれるはずです。
何回も詳しい説明をありがとうございました。
最初のこちらの説明が悪かったのでご理解いただけなかったのだと思いますが、まさに、アニメーションの作成です。したがって、オブジェクトを(任意の回数)移動させる際に起きる現象を改善(オブジェクトの周りの枠とハンドルを表示させない)したいだけなのです。例1と例2(Timer部分は省略)をやっていただければ、その違いがわかると思いますが・・・
いろいろとありがとうございました。
No.1
- 回答日時:
>Selection(例1)でやりたいのです。
単に、セルのどこかを、Select すれば、枠線は消えます。
ですが、まず関係がないことですが、お書きになっている Picture は、オートシェイプとは呼ばないと思います。オートシェイプとは、丸だの三角だのという用意された図形のことです。
次に、質問の例1、例2 両方のコードですが、たぶん記録マクロの方法ではないかと思います。実際のマクロのVBAコードでは、セルの位置を基準とします。
'オブジェクトを移動させる方法
Sub objectMoving()
With ActiveSheet.Shapes("Picture 1") 'Selection でも可
.Top = Range("D5").Top
.Left = Range("D5").Left
End With
ActiveCell.Select
End Sub
'オブジェクトを移動させる方法2(1を応用させた)
Sub objectMoving2()
Dim Rng As Range
Dim obj As Object
Set Rng = Range("D5")
If TypeName(Selection) = "Picture" Then
Set obj = Selection
Else
MsgBox "オブジェクトを選択してください。", vbExclamation
Exit Sub
End If
With obj
.Top = Rng.Top
.Left = Rng.Left
End With
ActiveCell.Select
End Sub
'//
このように、私は、エラー処理を加えて書いています。実際は、オートシェイプの時は、二段にチェックしないと特定はできません。
早速のご回答とご指摘、ありがとうございました。(オートシェイプの件、そうですね)
オートシェイプにしても、ピクチャーにしても、セル単位ではなくてビット(ピクセル?)単位で動かしたいのです。回答いただいたものは、ただ、指定しただけなので、それを動かす場合に支障が出ています。For Nextで動かしたいのです。
もしよければ再度、ご指導お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) Excel VBA 書式変更で困ってます。 オートフィルターの日付フィルターを用いて データの絞り込 2 2022/07/26 22:16
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/01/10 09:15
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Excel(エクセル) ExcelVBAで自動調整できますか? 3 2023/08/25 22:59
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントの画面がずれる
-
Excelで隠れてしまった図...
-
excelでチェックボックスが表示...
-
Excelにメールを添付する
-
パワーポイントにエクセルの表...
-
pdf xchange viewer オブジェク...
-
ExcelでB5をA4にしたい。
-
エクセルからワードへの表挿入...
-
エクセルに入力しようとすると...
-
【Excel】シートすべての画像(...
-
【エクセル】列を挿入しようと...
-
テキストボックスがないのに、...
-
画像編集ソフト「JTrim」、丸で...
-
エクセルに任意のページのワー...
-
Word2013 オブジェクト挿入 JPEG
-
Wordのオブジェットと図の違い...
-
EXCELのグラフのオブジェクト変...
-
文字の特定箇所に背景色をつけ...
-
Adobe IllustratorとCorel DRAW...
-
イラストレーターの面積を求める
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントの画面がずれる
-
Excelで隠れてしまった図...
-
Excelにメールを添付する
-
パワーポイントにエクセルの表...
-
excelでチェックボックスが表示...
-
pdf xchange viewer オブジェク...
-
テキストボックスがないのに、...
-
イラストレーターの面積を求める
-
文字の特定箇所に背景色をつけ...
-
Wordのオブジェットと図の違い...
-
ExcelでB5をA4にしたい。
-
エクセルに入力しようとすると...
-
エクセルからワードへの表挿入...
-
Wordのツールバーに常に数...
-
花子10の図形をワードやエク...
-
オートシェイプが消えたり出た...
-
EMBED関数について
-
Illustrator CS2 不透明100%な...
-
【エクセル】列を挿入しようと...
-
エクセルに任意のページのワー...
おすすめ情報