質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

1862閲覧

画像ファイルサイズアップ防止 VBA

jabe

総合スコア43

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/09/23 12:18

編集2020/09/25 10:49

前提・実現したいこと

大事なところが抜けていた為、追記させていただきます。△1部分

excel VBAでセルの大きさに合わせて、画像をリサイズ挿入したいです。
<手順>
①所定セルをダブルクリック(添付画像:B4)
②予め指定したフォルダのダイアログボックスが開く
③画像を選択し開く
④セルの大きさに収まった大きさで画像が貼り付けられる。
△1.貼付画像の保管先が変更されると、”リンク先されたイメージを表示できません。”となる為、
貼付画像の保管先が変更されても影響されないようにしたいと考えております。
△1
イメージ説明

発生している問題・エラーメッセージ

セルに合わせて画像が貼り付けられるのですが、excelファイルサイズが画像ファイルサイズの倍以上のファイルサイズになってしまう為、ファイルサイズアップを防ぎたいです。

VBA

1Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ 2Cancel As Boolean) 3Dim myPic 4Dim myRange As Range 5Dim rX As Double, rY As Double 6 7Dim myPath As String 8myPath = "C:\画像" 9 10With CreateObject("WScript.Shell") 11 .CurrentDirectory = myPath 12End With 13 14 15myPic = Application.GetOpenFilename("画像ファイル,*.jpg;*.jpeg;*.gif;*.tif") 16If VarType(myPic) = vbBoolean Then Exit Sub 17 18Set myRange = Target 19 20 21Application.ScreenUpdating = False 22With ActiveSheet.Pictures.Insert(myPic) 23 24 25 rX = myRange.Width / .Width 26 rY = myRange.Height / .Height 27 If rX > rY Then 28 .Height = .Height * rY 29 Else 30 .Width = .Width * rX 31 End If 32 33 .Left = .Left + (myRange.Width - .Width) / 2 34 .Top = .Top + (myRange.Height - .Height) / 2 35 36 .CopyPicture 37 .Delete 38End With 39 40ActiveSheet.Paste 41 42Application.ScreenUpdating = True 43Cancel = True 44End Sub 45 46

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/09/23 12:56

マクロは完成しているのですね。質問タイトルが紛らわしいので修正してください。
jabe

2020/09/24 12:26

アドバイスありがとうございます。タイトル名を変更しました。 画像貼り付け時にファイルサイズが大きくなるのを防止したいのですが、やり方が分からないのでご教示していただけるとありがたいです。
guest

回答3

0

ベストアンサー

”リンク先されたイメージを表示できません。”

AddPictureを使いましょう

VBA

1Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 2 3 Dim myPic 4 Dim myRange As Range 5 Dim rX As Double, rY As Double 6 Dim myShape As Shape 7 8 Dim myPath As String 9 myPath = "C:\画像" 10 11 With CreateObject("WScript.Shell") 12 .CurrentDirectory = myPath 13 End With 14 15 myPic = Application.GetOpenFilename("画像ファイル,*.jpg;*.jpeg;*.gif;*.tif") 16 If VarType(myPic) = vbBoolean Then Exit Sub 17 18 Set myRange = Target 19 20' ' セルのサイズに合わせるだけならこちらでだけでOK 21' Set myShape = ActiveSheet.Shapes.AddPicture( _ 22' Filename:=myPic, _ 23' LinkToFile:=True, _ 24' SaveWithDocument:=True, _ 25' Left:=myRange.Left, _ 26' Top:=myRange.Top, _ 27' Width:=myRange.Width, _ 28' Height:=myRange.Height) 29 30 ' 画像の比率は残したままセルに合わせるならこちら 31 Set myShape = ActiveSheet.Shapes.AddPicture( _ 32 Filename:=myPic, _ 33 LinkToFile:=True, _ 34 SaveWithDocument:=True, _ 35 Left:=myRange.Left, _ 36 Top:=myRange.Top, _ 37 Width:=0, _ 38 Height:=0) 39 40 With myShape 41 .ScaleHeight 1, msoTrue 42 .ScaleWidth 1, msoTrue 43 .LockAspectRatio = True 44 rX = myRange.Width / .Width 45 rY = myRange.Height / .Height 46 If rX > rY Then 47 .Height = .Height * rY 48 Else 49 .Width = .Width * rX 50 End If 51 End With 52 53 Set myShape = Nothing 54 55End Sub

投稿2020/09/25 20:40

kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jabe

2020/09/28 12:05

コードありがとうございます。 狙い通りに動作しました。助かりました。 AddPictureメソッド初めて知りました。これを機に勉強していきます。
guest

0

.Topまでで画像への処理が終わっているので下記は不要です。
コメントアウトしています。

VBA

1' .CopyPicture 2' .Delete 3End With 4 5'ActiveSheet.Paste

Pasteすることによって該当セルの左上を起点に貼り付けられているので、
.Leftと.Topで位置指定していたのが無意味になっています。
上記のようにすることによってファイルサイズは小さいですし、位置も真ん中になります。

投稿2020/09/25 00:40

radames1000

総合スコア1923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jabe

2020/09/25 10:44

説明ありがとうございます。 大事なところが抜けていましたので追加させてください。 元々の方法の場合、貼付画像の保管先が変更されると、”リンク先されたイメージを表示できません。”となる為、貼付画像の保管先が変更されても影響されないようにしたいと考えております。
guest

0

VBA

1 .CopyPicture 2 .Delete 3 4ActiveSheet.Paste

ファイルサイズが大きくなるのはここのコピー&ペーストで
元の画像ファイル情報が無くなるからです。

画像オブジェクトのサイズ変更は
.Width
.Height
の値を直接変更する事で可能ですので、そのように修正してみて下さい。

投稿2020/09/23 18:10

kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jabe

2020/09/24 12:37

回答ありがとうございます。 画像オブジェクトサイズ変更は理解しました。 ファイルサイズアップ要因はそのような理由なんですね。 こちらを解消するにはどのようなコードにすればよいのでしょうか?
kuma_kuma_

2020/09/24 17:08

いやもうすでに If rX > rY Then .Height = .Height * rY Else .Width = .Width * rX End If でされているでしょ? .CopyPicture .Delete ActiveSheet.Paste この処理が特別な意味があれば別ですが、要らないですよね? という事です。
jabe

2020/09/25 10:44

大事なところが抜けていましたので追加させてください。 元々の方法の場合、貼付画像の保管先が変更されると、”リンク先されたイメージを表示できません。”となる為、貼付画像の保管先が変更されても影響されないようにしたいと考えております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問