![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?08b1c8b)
VBAについての質問です。
下記のように、結合したセルをダブルクリックした場合に、セルの大きさに合わせて画像を張り付けられるようなコードを作成したのですが、縦長の写真の場合うまくいきません。
どのように修正したらよいでしょうか?
詳しい方よろしくお願い致します。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'セル選択判定
'条件①結合セル②セル高さ100以上③セル幅100以上
If Target.MergeCells And Target.Height >= 100 And Target.Width >= 100 Then
Cancel = True
'画像挿入
Call PasteImage(Target)
End If
End Sub
Public Sub PasteImage(ByVal Target As Range)
Dim fileNm As String
Dim shp As Object
Dim rng As Range
Dim myRange As Range
Dim pWidth As Single
Dim pHeight As Single
Dim pLeft As Single
Dim pTop As Single
Dim mWidth As Integer
Dim mHeight As Integer
Dim rX As Single
Dim rY As Single
Dim objShape As Shape
'画像選択
fileNm = Application.GetOpenFilename _
("jpg bmp tif png gif,*.jpg;*.bmp;*.tif;*.png;*.gif", , "画像の選択", , False)
If fileNm = "False" Then
MsgBox "画像を選択してください"
Exit Sub
End If
'セル内の画像削除
For Each shp In ActiveSheet.Pictures
Set rng = Range(shp.TopLeftCell, shp.BottomRightCell)
If Not (Intersect(rng, Selection) Is Nothing) Then
shp.Delete
End If
Next
mWidth = 2 '左右余白
mHeight = 15 '上下余白
Set myRange = Target
Application.ScreenUpdating = False
'表示位置の取得
With ActiveSheet.Pictures.Insert(fileNm).ShapeRange
'左上隅の位置取得
pLeft = .Left
pTop = .Top
'一旦画像を削除する
.Delete
End With
'画像サイズの取得
Set objShape = ActiveSheet.Shapes.AddPicture( _
Filename:=fileNm, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=0, _
Top:=0, _
Width:=0, _
Height:=0)
With objShape
.LockAspectRatio = msoTrue
.ScaleHeight 1, msoTrue
.ScaleWidth 1, msoTrue
'画像サイズをセルの幅、高さに合わせる
rX = myRange.Width / .Width
rY = myRange.Height / .Height
If rX > rY Then
.Height = .Height * rY - mHeight
.Width = .Width - mWidth
Else
.Height = .Height - mHeight
.Width = .Width * rX - mWidth
End If
pWidth = .Width
pHeight = .Height
'表示位置をセルの幅、高さに合わせる
pLeft = pLeft + (myRange.Width - .Width) / 2
pTop = pTop + (myRange.Height - .Height) / 2
'一旦画像を削除する
.Delete
End With
'画像の貼り付け
Set objShape = ActiveSheet.Shapes.AddPicture( _
Filename:=fileNm, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=pLeft, _
Top:=pTop, _
Width:=pWidth, _
Height:=pHeight)
Application.ScreenUpdating = True
End Sub
No.5ベストアンサー
- 回答日時:
こんにちは
>縦長の写真の場合うまくいきません。
想像するところ、原因はNo2様のご指摘にある通りではないかと思います。
WとHを入替えれば済むと思いますが、回転角がピッタリ90度の倍数でないと上手くいきません。
入替えの判定をするのも面倒なので、一般化して、回転している画像の外枠(=いわゆるBounding Box)のW、Hに換算してしまえば、回転角が45度や30度でも対応可能になりますし、一律の計算ですむものと考えられます。
また、ご質問には直接関係ありませんが、
>mWidth = 2 '左右余白
>mHeight = 15 '上下余白
と余白を設定しているにも関わらず、比率の計算は
>rX = myRange.Width / .Width
>rY = myRange.Height / .Height
のように、余白を考慮していないので誤差が生じることになると思われます。
また、コメントの上下と左右が、実際には入替わって計算されていませんか?
さらには、No3様のご指摘にもあるように、同じ画像を何度も描画したり消したりする必要性も感じられません。
・・・ということで、余白の設定以降を以下のようにしてみてはいかがでしょうか?
※ fileNm 等必要な変数は設定済みとします。
※ 追加した変数は、新たに宣言してあります。
(ご提示の変数とは変えてありますので、不要な変数がでます)
※ 画像の回転は通常の回転だけを考慮していますので、エクセルの「3D回転」などの回転には対応していません。(多分、他のソフトでこのような設定はされないと思いますので)
Dim iW As Single, iH As Single
Dim rS As Double, rC As Double
With ActiveSheet.Shapes.AddPicture(Filename:=fileNm, _
LinkToFile:=False, SaveWithDocument:=True, _
Left:=0, Top:=0, Width:=0, Height:=0)
' 一旦実寸化
.LockAspectRatio = msoTrue
.ScaleHeight 1, msoTrue
.ScaleWidth 1, msoTrue
' 画像の外枠を計算
rS = .Rotation * Atn(1) / 45
rC = Cos(rS)
rS = Sin(rS)
iW = Application.Max(Abs(.Width * rC - .Height * rS), Abs(.Width * rC + .Height * rS))
iH = Application.Max(Abs(.Width * rS + .Height * rC), Abs(.Width * rS - .Height * rC))
' サイズ・位置を調整
.Width = .Width * Application.Min( _
(Target.Width - 2 * mWidth) / iW, (Target.Height - 2 * mHeight) / iH)
.Left = Target.Left + (Target.Width - .Width) / 2
.Top = Target.Top + (Target.Height - .Height) / 2
End With
No.3
- 回答日時:
こんばんは
なぜ何度も同じ画像を貼ったりdelしたりするのでしょう?
なんか2度手間3度手間では無いでしょうか・・・
試していないので頭が混乱していますが、
>縦長
rX = myRange.Width / .Width
rY = myRange.Height / .Height
If rX > rY Thenの否定なので
単純に
Else
.Height = .Height * rY - mHeight
.Width = .Width * rX - mWidth
ではダメかな?
見当違いならごめんなさい
No.2
- 回答日時:
実行してみました。
中身を全部見たわけではないですが、現象がおきるのは
縦長の画像 ではなく 元の画像を回転したもの だと思われます。
正常に貼れる横長の画像のコピーを作って、90度回転して貼り付けてみてください。
おかしくなると思います。
これね、
私も、画像貼り付けマクロを作った際に頭を悩ませたところです。
回転した画像を貼り付けた場合、その画像のTop,Leftは、
見えてる画像のTop,Leftではなく、
『回転する前の状態の画像のTop,Leftになる!!』
という。
Width,Heightも入れ替わります。
画像を.Rotateプロバティで回転角度を取得し、
90度、270度回転している場合に、それを意識した処理をする必要があります。
詳しくはこちらの記事が参考になるでしょう。
↓
【Excel】回転させた画像をシートに貼り付ける
https://atsumitm.iobb.net/it/it-025.php
(添付画像もこちらから)
画質気にしなければ、貼り付けた瞬間に、Cut、Pasteすれば、
見たままのTop,Leftとして処理できたはず。
![「【VBA】写真の貼り付けコードがうまく機」の回答画像2](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/d/742241_6310869f5a2fc/M.png)
No.1
- 回答日時:
丸投げじゃなくて、どの部分で処理がおかしくなるかくらい絞り込みましょうよ。
ステップイン(F8)で処理を順に追えば、どこまで処理がうまくいってるかわかるでしょ?
それから、正常動作が確認されないうちから
Application.ScreenUpdating = False
つかっちゃ駄目。
これは仕上げに付け足すもの。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Excel(エクセル) Excel2019 マクロを使用し画像を貼り付けした際のリンク切れについて 2 2022/11/15 16:14
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
おすすめの美術館・博物館、教えてください!
美術館・博物館が大好きです。みなさんのおすすめをぜひお聞きしたいです。
-
もし10億円当たったら何に使いますか?
みなさんの10億円プランが知りたいです!
-
テレビやラジオに出たことがある人、いますか?
テレビやラジオに取材されたり、ゲスト出演したことある方いますか?
-
集中するためにやっていること
家で仕事をしているのですが、布団をはじめ誘惑だらけでなかなか集中できません。
-
【VBA】写真の縦横比を変えずに貼り付ける
Visual Basic(VBA)
-
エクセルVBAで縦向きの画像の挿入・回転
Excel(エクセル)
-
VBAエクセルに貼り付けた画像をセルにあった大きさにしたい(等倍)
Excel(エクセル)
-
-
4
VBAで写真を設定したフレームに挿入しようとしたが、Rotation=90の場合うまくいかない
Excel(エクセル)
-
5
エクセル(2013)VBA-図の縦横比を変えずにセルにおさまる最大限の大きさにする
Excel(エクセル)
-
6
Excel 画像貼り付けのVBAについて
Excel(エクセル)
-
7
マクロを実行すると画像がズレてしまいます
その他(Microsoft Office)
-
8
VBA 写真の挿入 回転
その他(Microsoft Office)
-
9
【EXCEL VBA】ダブルクリックでセルのサイズに合わせて画像を挿入に機能を追加したいです。
Visual Basic(VBA)
-
10
EXCELのVBAで画像を選んだ順に貼り付ける方法
Excel(エクセル)
-
11
EXCEL2007で、回転された図を任意の場所に設定できない
Visual Basic(VBA)
-
12
VBAでエクセルのシート上の画像のリサイズと配置を行いたい
Excel(エクセル)
-
13
エクセル: セルの枠を超えて表示
Excel(エクセル)
-
14
画像を結合セルの大きさで貼付(以前に回答されたマクロについて)
PowerPoint(パワーポイント)
-
15
エクセルvbaでの図形のカット(コピー)ペーストについて
Excel(エクセル)
-
16
セルをダブルクリックで、画像を選択、挿入したい時
Excel(エクセル)
-
17
VBAで「エクセルに写真を貼り付け、外のセルに撮影月日を『和暦』で自動記載」させたい
Excel(エクセル)
-
18
エクセル 画像のプロパティで縦横比を固定する。 これをVBAでコードにできますか? 知ってる方おられ
Visual Basic(VBA)
-
19
エクセルのセルに指定画像(.jpg)を自動で貼り付けたいです。
Excel(エクセル)
-
20
Excel マクロ 画像をリンクせずかつ圧縮して貼りつける方法を教えてください
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel UserForm の表示位置
-
VBAマクロ実行時エラーの修正に...
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
関数の引数でrangeを指定したとき
-
特定の色のついたセルを削除
-
VBA:日付を配列に入れ別セルに...
-
VBA 特定のセルからoffsetされ...
-
【ExcelVBA】値を変更しながら...
-
Excel VBA 同じ処理を複数回行...
-
エクセル VBA ボタンをクリック...
-
For~Next ループ内でUnionメソ...
-
VBA にて、条件付き書式で背景...
-
【Excel VBA】マクロで書き込ん...
-
マクロ初心者です。 マクロで範...
-
【VBA】【ユーザーフォーム_Lis...
-
下記のマクロの説明(意味)を...
-
エクセル、マクロで番号を読込...
-
[Excel VBA] このコードでは行...
-
MS Accessのウインドウ内の右端...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
特定の色のついたセルを削除
-
【Excel VBA】一番右端セルまで...
-
【VBA】【ユーザーフォーム_Lis...
-
EXCEL VBA 文中の書式ごと複写...
-
VBA:日付を配列に入れ別セルに...
-
C# DataGridViewで複数選択した...
-
Excel UserForm の表示位置
-
入力規則のリスト選択
-
Excel 範囲指定スクショについ...
-
エクセル、マクロで番号を読込...
-
DataGridViewでグリッド内に線...
-
Excel VBAで特定の範囲の空白セ...
-
CellEnterイベント仕様について
-
Excel VBAでCheckboxの名前を変...
-
【ExcelVBA】値を変更しながら...
-
データグリッドビューの結合セ...
-
下記のマクロの説明(意味)を...
おすすめ情報
ありがとうございます。
処理自体は正常に完了するのですが、縦長の画像の場合、セルの中央に配置されずアスペクト比が横長の画像になってしまうので直したいです。