|
▼Ned さん:
返事が遅くなって申し訳ありませんでした。
あれこれトライしている内に時間がたってしまいました。
まだ、解決に至っていませんが途中経過を報告します。
>まずは、For Each...Next ステートメントなどの基本構文は理解されてますか?
これまで一般的な表計算、検索、別シートに結果を記入や、入門書によく記載されている空白行の削除、重複削除などをアンチョコを見ながらマクロを作って来ました。
但し、最初に書いたように図形に関しては今回が初めてです。
ループは For〜Nextを多用してきましたが、本にFor Each〜の方が処理速度が速いと書いていたので、少しづつ使うようにしています。
またWithステートメントを掲示板でよく見るので少しづつ勉強中です。
【検討したこと】
[1]Nedさんの提示してくれたSample2〜4の理解する
・Sample2と3は同じことを意味している
・取得される値はA1セルの上左端を基点とした指定セルの座標
・Sample4は図形の位置をA1セルの上左端を基点とした座標を取得
(違ってたらご教授願います)
[2]最初に教えて頂いたコードを指定範囲でループさせる
Sub 練習1()
Dim r As Range
Dim i As Integer
For i = 1 To 5
With ActiveSheet.Shapes(i)
.Left = Cells(19 + i).Left + 10
.Top = Cells(19 + i).Top + (Cells(19 + i).Height - .Height) / 2
End With
Next
End Sub
上記コードでやったら図形が消えてしまいました。
色々やっていたら、図形位置が変わらなかったり、部分的に消えたりで・・・・
>インデックス(順番)で指定するのか、名前+数値の変数で指定するのか。
>
>>
>または、既に大まかに配置したShepeの微調整なら、セル範囲を指定せずに、
>ShepeのTopLeftCell プロパティでShape自身の左上セルを取得して
>そのセルの位置情報を元にShapeの位置を微調整する方法もあります。
このアドバイスから
図形が消えたり加えたりでインデックスが変更されているのでは思い、教えて頂いたTopLeftCellと共に調べて見ました。
その結果、下記コードでインデックスが適正でないことが分かり(こんなことも知りませんでした)、図形のセル位置の取得も出来ました。
Sub 練習2()
MsgBox Selection.Name
MsgBox Selection.TopLeftCell.Address
End Sub
【検討したこと2】
・処理を2回に分けて、図形1個づつを指定場所へ移動・・・・取りあえずうまくいきました
(1) MsgBox Selection.Name で図形のインデックスを取得
(2) 以下のコードに取得したインデックス番号を入力
Sub 練習3()
Dim r As Range
Dim myZuban As Integer
myZuban = Application.InputBox("図形の番号を入力")
Set r = ActiveCell
With ActiveSheet.Shapes(myZuban)
.Left = r.Left + 10
.Top = r.Top + (r.Height - .Height) / 2
End With
Set r = Nothing
End Sub
【検討したこと3】
・前記の(1)と(2)を一括で処理する
これまでの試行錯誤で、MsgBox Selection.Name の結果は「Oval 3」と表示されていたのに
練習3では「3」だけを入力して正常稼動したので、数字だけをShapes()の中に入れなければと思っていますが、現在やり方が分からない状況です。
やったことは下記の通しです。
Sub 練習4()
Dim r As Range
Dim myZuban As Integer
MsgBox Selection.Name ’表示は Oval 3
myZuban = Right(Name, 1)
MsgBox myZuban ’表示は 0
MsgBox Selection.TopLeftCell.Address ’図形のあるセル番地を表示
Set r = Selection.TopLeftCell
With ActiveSheet.Shapes(myZuban) ’ここでエラー(原因は0のため?)
.Left = r.Left + 10
.Top = r.Top + (r.Height - .Height) / 2
End With
Set r = Nothing
End Sub
結局は
With ActiveSheet.Shapes(変数)
の書き方に戻ってしまいました。
|
|