dポイントプレゼントキャンペーン実施中!

エクセル(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の方法で枠線は出ません。

A 回答 (3件)

想像で回答してます。

違ってたら読み捨てて下さい。

選択したシェイプを一旦、オブジェクト変数に代入した後、適当なセルを選択することによりシェイプの選択を解除します。その後、シェイプを移動させます。

ActiveSheet.Shapes.Range("Picture 1").Select
Set sh = Selection
Range("A1").Select
For i = 1 To 50
sh.Left = i
DoEvents
Next
    • good
    • 1
この回答へのお礼

助かりました

できました!!!
Set sh = Selection のアイディアが思いつきませんでした。
大変助かりました。今後ともよろしくお願いします。
ありがとうございました。

お礼日時:2016/07/18 10:36

>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 秒

などと入れて上げればよいのです。

ちょっと書きすぎてしまいましたが、これは、たぶん、技術的な問題ではないような気がします。これでダメなら、別の人が書いてくれるはずです。
    • good
    • 0
この回答へのお礼

何回も詳しい説明をありがとうございました。
最初のこちらの説明が悪かったのでご理解いただけなかったのだと思いますが、まさに、アニメーションの作成です。したがって、オブジェクトを(任意の回数)移動させる際に起きる現象を改善(オブジェクトの周りの枠とハンドルを表示させない)したいだけなのです。例1と例2(Timer部分は省略)をやっていただければ、その違いがわかると思いますが・・・
いろいろとありがとうございました。

お礼日時:2016/07/18 06:53

>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
'//


このように、私は、エラー処理を加えて書いています。実際は、オートシェイプの時は、二段にチェックしないと特定はできません。
    • good
    • 0
この回答へのお礼

早速のご回答とご指摘、ありがとうございました。(オートシェイプの件、そうですね)
オートシェイプにしても、ピクチャーにしても、セル単位ではなくてビット(ピクセル?)単位で動かしたいのです。回答いただいたものは、ただ、指定しただけなので、それを動かす場合に支障が出ています。For Nextで動かしたいのです。
もしよければ再度、ご指導お願いします。

お礼日時:2016/07/17 21:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!