[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『貼り付け画像がずれる』(四苦八苦)
Dim dlgAnser As Boolean, Cancel As Boolean
Dim x As Object
Dim MyWidth As Single, MyHeight As Single
If Target.Columns.Count = 10 And Target.Rows.Count = 25 Then MyWidth = Target.Width MyHeight = Target.Height dlgAnser = Application.Dialogs(xlDialogInsertPicture).Show Application.ScreenUpdating = False For Each x In ActiveSheet.Shapes With x If .Width * ActiveCell.MergeArea.Height / .Height <ActiveCell.MergeArea.Width Then .Height = ActiveCell.MergeArea.Height Else .Width = ActiveCell.MergeArea.Width End If .Line.Visible = msoFalse .Top = .Top + ((MyHeight - .Height) / 2) .Left = .Left + ((MyWidth - .Width) / 2) End With Next Application.ScreenUpdating = True End If End Sub
Excel2003,2007,2010
例えば、MyWidthはTarget(その時点で選択されている結合セル)の幅、
x.widthはTargetとは関係ない物も含む、アクティブシートに配置された
Shapeのうちどれか、というのが「ずれ」の原因のような気はします。
ループは必要ですか?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim dlgAnser As Boolean, Cancel As Boolean Dim x As Object Dim MyWidth As Single, MyHeight As Single
If Target.Columns.Count = 10 And Target.Rows.Count = 25 Then MyWidth = Target.Width MyHeight = Target.Height dlgAnser = Application.Dialogs(xlDialogInsertPicture).Show If dlgAnser Then Set x = Selection ' Application.ScreenUpdating = False With x If .Width * ActiveCell.MergeArea.Height / .Height < ActiveCell.MergeArea.Width Then .Height = ActiveCell.MergeArea.Height Else .Width = ActiveCell.MergeArea.Width End If .ShapeRange.Line.Visible = msoFalse .Top = .Top + ((MyHeight - .Height) / 2) .Left = .Left + ((MyWidth - .Width) / 2) End With ' Application.ScreenUpdating = True End If End If End Sub [四苦八苦]さんのだと、.Line.Visible = msoFalse でもそのままスルーするのに、 Selectionでオブジェクト変数に入れちゃうと .ShapeRange.Line.Visible = msoFalse としないと「オブジェクトはプロパティをサポートしていません」になる。
どなたかこの理屈、説明してくれないかなぁ。
(みやほりん)(-_∂)b
互換性だと思いますよ!! ShapeオブジェクトとShapeオブジェクトがなかった以前との・・。
msgbox typename(x)
を Set 後に上記で調べるとわかると思いますよ!!
ichinose@昨日、東京駅の変わりようにビックリ、有料トイレにはまいった
本当にありがとうございました。
>.ShapeRange.Line.Visible = msoFalse .Border.LineStyle = xlNone
Rectangleオブジェクトのこんなプロパティからもアクセスできますね!!
ichinose
For Each x In ActiveSheet.Shapes ・・・・でセットしたもの
msgbox typename(x) ・・・Shape
Set x = Selection ・・・・でセットしたもの
msgbox typename(x) ・・・Picture という結果でした。 PictureオブジェクトがShape以前から対応しているオブジェクト、 Shapes コレクションから取得しているからShapeオブジェクトとして取得。 Selectionの場合はApplication.Dialogs(xlDialogInsertPicture)で挿入した オブジェクトなのでPictureオブジェクトとして取得。
と理解していいのかな。
Shapesコレクションのヘルプに以下の記述がありました。
「文書のオートシェイプだけを処理したり、選択した図形だけを処理する場合など、文書の図形のサブセットを処理する場合は、処理する図形を含む ShapeRange コレクションを作成する必要があります。」
(みやほりん)(-_∂)b
>理解していいのかな Selectionというプロパティが互換性を考慮した結果 だと言う事で 記述されたような結果が得られたのだと解釈しています。
私は、このDialogsオブジェクトについては、「卵くださいというと、ゆで卵をかえす出来の悪いオブジェクト」 だと言っているのですが、今回も本当は、返すのは選択したパス名だけでよいのに・・・。 これをShapeオブジェクトとして取得するか、以前のオブジェクトで取得するかは、 プログラマの判断でよいのですから・・・・
Selectionというプロパティで取得する図形のオブジェクトを旧オブジェクトに留めたのは、 当時は、仕方ないですよね!!
この互換性考慮がなければ、Excel95以前の図形関連のSelectionを使ったコードは、 大きな修正が必要だったかもしれませんから・・・。
もっとも、互換性をとるか、新しい技術で要らないものは捨てるか 難しい判断ですけどね!!
ichinose
>Rectangleオブジェクトのこんなプロパティ これは、私のテストデータでの話でした。失礼しました。
但し、Pictureでも Borderは使えます。
念のために・・・。
ichinose
>写真のアスペクト比の維持ができないと言っていました。
幅、または高さを調節するロジックなので、そうなるのかもしれません。
最初に貼り付けた時点での縦横比を求めておいて、
幅(高さ)が調節されたあと、縦横比から高さ(幅)を調節するという処理を
加えても良いかもしれません。
(みやほりん)
2行修正
Set x = Selection.ShapeRange
.Line.Visible = msoFalse
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.