🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

リサイズ

コントロール、ウィンドウ、フォームやスクリーンのサイズ変更を指します。

Q&A

解決済

1回答

7334閲覧

サイズ指定した画像の貼付け時に縦横比を固定したい

pandatati

総合スコア9

VBA

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

リサイズ

コントロール、ウィンドウ、フォームやスクリーンのサイズ変更を指します。

0グッド

0クリップ

投稿2021/03/17 12:33

やりたいこと
・ファイル内にある複数画像をまとめて指定したサイズにリサイズして貼り付けたい
・貼り付けた際に、画像横のセルにファイル名を転記したい
・貼り付けた時に行幅を画像に合わせたい(これは可能なら入れたい)

人様が作られたコードを切り貼りしながら形にしてみましたが、
貼付け時の縦横比の固定がうまくできません。
.LockAspectRatio = True
を組み込もとしてもどこに入れれば良いか分からず悩んでおります。
お知恵をお貸しください。

VBA

1Sub 画像をまとめてリサイズして貼り付け() 2 3Dim strFilter As String 4Dim Filenames As Variant 5Dim PIC As Picture 6Dim Path As String, WSH As Variant, OpenFileName As String 7Dim W As Single 8Dim H As Single 9 10With Application 11 12'ファイルオープンをデスクトップ指定 13Set WSH = CreateObject("WScript.Shell") 14Path = WSH.SpecialFolders("desktop") & "\" 15ChDir Path 16 17' 「ファイルを開く」ダイアログでファイル名を取得 18strFilter = "画像ファイル(*.jpg;*.jpeg;*.gif;*.bmp;*.png),*.jpg;*.jpeg;*.gif;*.bmp;*.png" 19Filenames = Application.GetOpenFilename( _ 20FileFilter:=strFilter, _ 21Title:="図の挿入(複数選択可)", _ 22MultiSelect:=True) 23If Not IsArray(Filenames) Then Exit Sub 24 25W = .InputBox("ヨコ(cm)", Type:=1) 26H = .InputBox("タテ(cm)", Type:=1) 27.ScreenUpdating = False 28 29' ファイル名をソート 30Call BubbleSort_Str(Filenames, True, vbTextCompare) 31 32' 貼り付け開始セルを選択 33Range("A2").Select 34 35' マクロ実行中の画面描写を停止 36Application.ScreenUpdating = False 37 38For i = LBound(Filenames) To UBound(Filenames) 39 40Set PIC = ActiveSheet.Pictures.Insert(Filenames(i)) '画像貼り付け 41 42PIC.Width = W / 0.03527 'cm変換 43PIC.Height = H / 0.03527 'cm変換 44 45ActiveCell.Offset(0, 1) = Dir(Filenames(i)) 'ファイル名 46 47' 次の貼り付け先を選択(アクティブセルにする 48ActiveCell.Offset(1, 0).Activate 49Next i 50 51' 終了 52Application.ScreenUpdating = True 53MsgBox i - 1 & "枚の画像を挿入しました", vbInformation 54 55End With 56End Sub 57 58' バブルソート(文字列) 59Private Sub BubbleSort_Str( _ 60ByRef Source As Variant, _ 61Optional ByVal SortAsc As Boolean = True, _ 62Optional ByVal Compare As VbCompareMethod = vbTextCompare) 63 64If Not IsArray(Source) Then Exit Sub 65 66Dim i As Long, j As Long 67Dim vntTmp As Variant 68For i = LBound(Source) To UBound(Source) - 1 69For j = LBound(Source) To LBound(Source) + UBound(Source) - i - 1 70If StrComp(Source(IIf(SortAsc, j, j + 1)), _ 71Source(IIf(SortAsc, j + 1, j)), Compare) = 1 Then 72vntTmp = Source(j) 73Source(j) = Source(j + 1) 74Source(j + 1) = vntTmp 75End If 76Next j 77Next i 78 79End Sub

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

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

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

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

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

guest

回答1

0

ベストアンサー

画像の縦横比を加味して処理しないといけないですね。

具体的には

VBA

1If W / PIC.Width > H / PIC.Height Then 2' PIC.Width = (H * PIC.Width / PIC.Height) / 0.03527 'cm変換 3 PIC.Height = H / 0.03527 'cm変換 4Else 5' PIC.Height = (W * PIC.Height / PIC.Width) / 0.03527 'cm変換 6 PIC.Width = W / 0.03527 'cm変換 7End If

こんな感じででも私の所ではうまくいきました。
コメントしてある所は、LockAspectRatio が効いてなかった場合の対処です。

縦横比固定するには今のままだとPictureオブジェクトなので、Shapeオブジェクトとして取得しなおしてやればLockAspectRatioプロパティを使えるので、それでセットすればできます

(追記)
Shapeオブジェクトとして取得する方法
Set tShape = ActiveSheet.Shapes(Sheet1.Shapes.Count)
変な取得の仕方なので、私は嫌いなのですけどね。

行幅はPIC.Heightの値から換算してセットする方法以外は、私は知らないですね。

投稿2021/03/17 19:42

編集2021/03/18 13:12
xail2222

総合スコア1508

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

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

pandatati

2021/03/18 11:06

ご回答有り難うございました。 教えていただいたコードで私の方でも理想の動きになってくれました。 この時にifelse構文を使えば良いんですね。 勉強になりましたが、まだまだ勉強が必要だと実感しました。 shapeオブジェクトでのコードも教えて頂ければ今後の参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問