• 締切済み

EXCEL VBAで画像をトリミング

end-uの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

とりあえず倍率が問題なら Sub test()   Dim p As Picture   Dim s As Shape   Dim w As Single   Dim h As Single   Dim x As Double   Dim y As Double   Set p = ActiveSheet.Pictures("pct1")   Set s = ActiveSheet.Shapes("waku")   'wakuサイズ固定したいなら姑息ですが結果オーライな?   's.Width = 400   's.Height = 300   '以下pの倍率取得   w = p.Width   h = p.Height   p.ShapeRange.ScaleWidth 1, msoTrue   p.ShapeRange.ScaleHeight 1, msoTrue   x = p.Width / w   y = p.Height / h   '倍率取得したら戻す   p.Width = w   p.Height = h   'トリム処理。マイナス値は考慮してない。   With p.ShapeRange.PictureFormat     .CropLeft = (s.Left - p.Left) * x     .CropTop = (s.Top - p.Top) * y     .CropRight = (p.Width - s.Width) * x     .CropBottom = (p.Height - s.Height) * y   End With   s.Left = 0   s.Top = 0 End Sub こんな感じで。 以下参考。 四角Shapeにマクロtryを登録し、画像を選択してShapeをクリックすると マウスカーソルに合わせてShapeが移動します。 トリミング位置に合わせてもう一度Shapeをクリック。 '標準モジュール Option Explicit Private Declare Function GetCursorPos Lib "user32" ( _                    ByRef lpPoint As POINTAPI) As Long Private Declare Sub Sleep Lib "kernel32" ( _              ByVal dwMilliseconds As Long) Private Type POINTAPI   x As Long   y As Long End Type Private MoP As POINTAPI Private flg As Boolean '------------------------------------------------- 'Shapeは透過、最前面配置にしておく。 'このtryをShapeに登録する。 'Pictureを選択してShapeクリックで実行。 '~~~~~~~~~~~~~~~~~ Sub try()   Const DPI As Long = 96 'Dot per inch 取り敢えず固定   Const PPI As Long = 72 'Point per inch   Dim pc  As Picture   Dim sp  As Shape   Dim w   As Single   Dim h   As Single   Dim x   As Double   Dim y   As Double   If flg Or (TypeName(Selection) <> "Picture") Then     flg = False     Exit Sub   End If   On Error GoTo ErrHandler   flg = True   Set pc = Selection   With pc.ShapeRange     .Rotation = 0     With .PictureFormat       .CropLeft = 0       .CropTop = 0       .CropRight = 0       .CropBottom = 0     End With   End With   With Application     .ScreenUpdating = False     'WindowZoom100、分割なし限定。     With .ActiveWindow       .Zoom = 100       .SplitColumn = 0       .SplitRow = 0     End With     .ScreenUpdating = True     .StatusBar = ""     .Cursor = xlNorthwestArrow     Set sp = ActiveSheet.Shapes(.Caller)   End With   Do     DoEvents     Call Sleep(1)     If Not flg Then Exit Do     Call GetCursorPos(MoP)     With ActiveWindow       sp.Left = (MoP.x - .PointsToScreenPixelsX(0)) * PPI / DPI - (sp.Width / 2)       sp.Top = (MoP.y - .PointsToScreenPixelsY(0)) * PPI / DPI - (sp.Height / 2)     End With   Loop   Application.ScreenUpdating = False   With ActiveSheet     If Not Intersect(.Range(pc.TopLeftCell, pc.BottomRightCell), _              .Range(sp.TopLeftCell, sp.BottomRightCell)) Is Nothing Then       w = pc.Width       h = pc.Height       pc.ShapeRange.ScaleWidth 1, msoTrue       pc.ShapeRange.ScaleHeight 1, msoTrue       x = pc.Width / w       y = pc.Height / h       pc.Width = w       pc.Height = h       With pc.ShapeRange.PictureFormat         .CropLeft = Application.Max(0, (sp.Left - pc.Left) * x)         .CropTop = Application.Max(0, (sp.Top - pc.Top) * y)         .CropRight = Application.Max(0, (pc.Width - sp.Width) * x)         .CropBottom = Application.Max(0, (pc.Height - sp.Height) * y)       End With     End If   End With   sp.Left = 0   sp.Top = 0 ErrHandler:   With Application     .Cursor = xlDefault     .StatusBar = False     .ScreenUpdating = True   End With   Set pc = Nothing   Set sp = Nothing End Sub うまくいかない時は捨ててください。

関連するQ&A

  • EXCELのVBAで画像ファイルを呼び出し

    EXCELのVBAでセルに入力されているファイル名の画像ファイルを呼び出して、 トリミング、縮小→一旦切り取り、メタファイルで貼り付け→セルの真ん中に配置ということを行いたいです。 このようなVBAを組みましたが、bw = .Width でエラーが起こってしまいます。 一旦切り取りして貼り付けするコードを加えたらエラーになりました。 どのようにしたらきちんと希望の形ではりつけることができるでしょうか? よろしくお願いします。 Sub photocalltest() 'セルの値を取得して画像を貼り付け ' ' Dim i As Long For i = 2 To 5 ActiveSheet.Pictures.Insert ("C:\Documents and Settings\temp\" & Cells(7, i).Value & ".jpg") With ActiveSheet.Shapes(ActiveSheet.Shapes.Count) 'トリミング .PictureFormat.CropBottom = 95 .PictureFormat.CropRight = 57.78 .PictureFormat.CropLeft = 59.28 .PictureFormat.CropTop = 100 '縮小 .Height = 197.25 .Width = 162# .Cut 'Cells(7, i).Select ActiveSheet.PasteSpecial Format:="図 (拡張メタファイル)" '貼り付け位置指定 aw = Cells(7, i).Width bw = .Width //ここでオブジェクトが必要ですエラー x = (aw - bw) / 2 .Left = Cells(7, i).Left + x ah = Cells(7, i).Height bh = .Height y = (ah - bh) / 2 .Top = Cells(7, i).Top + y End With Next i End Sub

  • エクセルVBAでの画像ファイル名取得他

    VBAについての質問です。 http://hp.vector.co.jp/authors/VA033788/kowaza.html#0158 上記をベースに、なんとかVBAを下記のように書き換えました。 Sub LoadPictures3() Dim Fnames As Variant Dim Fn As Variant Dim i As Integer Dim Pic As Picture Dim R As Range Dim R2 As Range Dim Pc As Integer Fnames = Application.GetOpenFilename("図(*.jpg;*.gif),*.jpg;*.gif", MultiSelect:=True) If TypeName(Fnames) = "Boolean" Then Exit Sub Application.ScreenUpdating = False '一枚目の貼付け位置 Set R = Range("B5") Set R2 = R.Offset(35) Pc = 0 For i = 1 To UBound(Fnames) Set Pic = ActiveSheet.Pictures.Insert(Fnames(i)) Select Case (i - 1) Mod 4 + 1 Case 1 Pc = Pc + 1 If Pc >= 2 Then ActiveSheet.HPageBreaks.Add R2 End If With R Pic.Left = .Left Pic.Top = .Top Pic.Width = 300 Pic.Height = 225 End With Case 2 With R.Offset(0, 6) '一枚目に対する二枚目の相対位置 Pic.Left = .Left Pic.Top = .Top Pic.Width = 300 Pic.Height = 225 End With Case 3 With R.Offset(18, 0) Pic.Left = .Left Pic.Top = .Top Pic.Width = 300 Pic.Height = 225 End With Case 4 With R.Offset(18, 6) Pic.Left = .Left Pic.Top = .Top Pic.Width = 300 Pic.Height = 225 End With '次ページの相対位置 Set R = R.Offset(39) End Select Next Application.ScreenUpdating = True End Sub ここで、画像の上の位置(B5のセル位置の画像の場合、B4)に 元々の画像ファイル名を取得し、表記させたいのですが 調べた所、multiselect:=Trueで複数ファイルを選択するときに 画像名が図1、図2に変わっているようで、どうしていいかわかりません。 後、画像を300×225の「変倍」画像にしたいのですが どのようにすれば可能でしょうか? 全くVBAの知識がなく、上のURLを参考に、単語を調べつつ書き換えている状態で、変数やらなんやらの指定・書き方等わかりません。 どなたかご教授願います。

  • エクセル中の画像をトリミングするマクロ。

    教えて下さい。 エクセルに多量の写真を貼り付けて工程の記録をとっています。 その際に、ただ貼るのではなく4隅を少しトリミングしなければなりません。 (撮影したいものが、写真をやや中央からずれたところにあるので。) これまで、一枚一枚貼り付けていたのですが、 ミスの発生もさることながら、時間が非常にかかってしまっています。 そこで、もし可能でしたらマクロでこのような作業はできないものか、とネット検索をしていたしだいです。 実際の考える流れなのですが、 ・あるフォルダの中の写真をすべてエクセルに取り込む。(できればファイル名も取得して画像の横にできたら助かります。) ・写真の四方からのトリミングする。(左側は1cm、右側は4cm、上は1cm、下は2cmカットといったように。) ・トリミング後の写真をXXcm×YYcmに拡大もしくは縮小する。 サイズのcmは一例ですが、このような流れで無数の写真と取り込みつつ、トリムする方法をご教授頂けると助かります。 よろしくお願い致します。

  • Excelの罫線に関するマクロ

    Excelの罫線に関するマクロ 罫線を引き、それを赤くするマクロを作ったのですが、赤罫線の下にもうひとつ罫線が表示されてしまいます。どこを削除すればよいのでしょうか。 ご教示お願いいたします。 Sub 罫線() Dim T1 As Single, L1 As Single Dim T2 As Single, L2 As Single Dim myShp As Shape With Range("c15") T1 = .Top L1 = .Left End With With Range("d14") T2 = .Offset(1, 1).Top L2 = .Offset(1, 1).Left End With Set myShp = ActiveSheet.Shapes.AddLine(L1, T1, L2, T2) ActiveSheet.Shapes.AddLine(L1, T1, L2, T2).Select With Selection.ShapeRange.Line .Visible = msoTrue .Style = msoLineSolid .Weight = 5# .ForeColor.SchemeColor = 10 End With End Sub よろしくお願いします。

  • エクセルマクロ 全シートに図の挿入をしたい

    初心者です。よろしくお願いします。 エクセル2007 bookはxsl(互換表示で開いています) 200シートくらいある請求書です。全シートの同じ場所に角印を押したいです。 自分で考えたコードは1シート目の名前を"FACE"に変え印("Picture 4")を貼りつけておきます。 これだとSheets("FACE")に2個目の印が押されてしまいます。 印押しBook.xslのシート1に請求書の雛形と印を用意しておいて マクロを動かすと請求書Book.xslの全シートに印が押されるものが作れますか? Sub 印押しマクロ2() Dim myTop As Single, myLeft As Single myTop = Sheets("FACE").Shapes("Picture 4").Top myLeft = Sheets("FACE").Shapes("Picture 4").Left Sheets("FACE").Shapes("Picture 4").Copy Dim Sht As Worksheet For Each Sht In Worksheets Sht.Select     ActiveSheet.Paste     ActiveSheet.Shapes("Picture 4").Top = myTop     ActiveSheet.Shapes("Picture 4").Left = myLeft Next Sht End Sub

  • EXCEL VBA:埋め込みグラフオブジェクトの命名方法について

    質問させて頂きます。 EXCEL2000のVBAで、グラフを色々加工しているのですが、 埋め込みグラフオブジェクトの名前をグラフ作成時に命名する事は 可能でしょうか? dim myRange as Range Set myRange = Range("A1:D2") Charts.Add ActiveChart.ChartType = xlPie ActiveChart.SetSourceData Source:=myRange, PlotBy:=xlRows ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent, LegendKey:=False, HasLeaderLines:=True とここで、(グラフそのもののサイズではなく) 埋め込みグラフオブジェクトのサイズを変更するとき、 ActiveSheet.Shapes(1).ScaleWidth 1.6, msoFalse, msoScaleFromTopLeft ActiveSheet.Shapes(1).ScaleHeight 1.9, msoFalse, msoScaleFromTopLeft のようにすれば、最初に作成したオブジェクトのサイズ変更は可能ではあるのですが、 条件により色々な種類の複数のグラフを順不同で作成しているため、 ActiveSheet.Shapes(1) では、希望のオブジェクトを選択できるとは限りません。 つきましては、Charts.Add 時に(グラフの名前ではなく) オブジェクトの名前を指定できれば希望のオブジェクトを 簡単に選択できると考えているのですが、これは可能でしょうか? 何卒ご教授のほど、よろしくお願いいたします。

  • エクセル マクロ 画像についての質問です。

    エクセル マクロについての質問です。 下記のコードでセルに画像を合わせて貼り付け、表を作成しています。 が、このコードだと画像の保存先を移動させると画像が表示されなくなり、分類でフィルターをかけるとバラバラの違う画像が表示されてしまったりして困っています・・・。 どなたか良いご意見を頂ければと思い、投稿しました。よろしくお願いします! Sub PictFit() Dim PicFile As String Dim Pic As Picture PicFile = Application.GetOpenFilename() '画像のパスを取得 If PicFile = "False" Then Exit Sub Set Pic = ActiveSheet.Pictures.Insert(PicFile) '画像を貼り付ける With Pic .Height = ActiveCell.MergeArea.Height '画像の高さ .Top = ActiveCell.Top '画像の上位置を変更 .Left = ActiveCell.Left + (ActiveCell.MergeArea.Width - .Width) / 2 '画像の横位置を変更(セル幅中央に画像中央) End With End Sub

  • エクセルVBA Dialogsheetについて

    何をいまさらダイアログシートなどとおっしゃらないで下さいませ。 今現在表示されているダイアログシートの名前を取得したいのです。 たとえばワークシート上にフォームのボタンを配置し、ボタンに以下のマクロを登録しておけば正しくシート名を返します。 Sub test01() MsgBox ActiveSheet.Name '1 MsgBox ActiveSheet.Shapes(Application.Caller).Parent.Name '2 End Sub ところが同じボタンをDialogsheetに配置し、そのダイアログを DialogSheets("Dialog1").Show  で、ワークシート上に表示した段階でボタンをクリックすると、1.ではワークシート名が帰り、2ではシート名が違うのでエラーになってしまいます。 (ワークシートをアクティブにしないで、ダイアログシート上で右クリックして「ダイアログの実行」でダイアログを表示させれば1,2ともにDialog1とDialogSheet名を返しますが) もちろん以下のようにDialogsheet名を明記すれば正しく返りますが、Application.Callerからダイアログシートの名前を取得したいのにDialogsheet名を明記するのでは無意味です。 Sub test02() MsgBox ActiveSheet.Name '1 MsgBox DialogSheets("Dialog1").Shapes(Application.Caller).Parent.Name '2 End Sub 何か良い方法はないでしょうか? 現在はやむをえずダイアログを表示させる際、以下のように変数に格納していますが、これもApplication.Callerからダイアログシートの名前を取得するにはあまり意味がないように思います。 Dim DS Sub D1_Start() DS = "Dialog1" DialogSheets("Dialog1").Show End Sub Sub test03() MsgBox ActiveSheet.Name '1 MsgBox DialogSheets(DS).Shapes(Application.Caller).Parent.Name '2 End Sub エクセル2000です。 宜しくお願いします。

  • Excel VBAでの図形削除について質問です。

    Excel VBAでの図形削除について質問です。 ボタンをクリックすると、ラインを使って、直角三角形を作成できる様にしました。 その際に、画像を全て削除してから作成する様にしました。 しかし、コマンドボタンまで消えてしまい困っています。 Dim MyLine As Shape Dim rngStart As Range, rngEnd As Range Dim BX As Double, BY As Double, EX As Double, EY As Double Dim dellShape As Object Set dellShape = ActiveSheet dellShape.Shapes.SelectAll 'すべての図形を選択する Selection.Delete '現在選択されているオブジェクトを削除する 'Shapeを配置するための基準となるセル Set rngStart = Range("C30") Set rngEnd = Range("J11") 'セルのLeft、Top、Widthプロパティーを利用して位置決め BX = rngStart.Left BY = rngStart.Top EX = BX + 300 EY = BY + 0 'Shapeの描画 Set MyLine = ActiveSheet.Shapes.AddLine(BX, BY, EX, EY) '横幅 Set MyLine = ActiveSheet.Shapes.AddLine(EX, EY, EX, 200) '高さ Set MyLine = ActiveSheet.Shapes.AddLine(BX, BY, EX, 200) '斜辺 これで?削除?作図と出来るのですが、作図された図形をDeleteキーで手動で削除した後に、 もう一度コマンドボタンをクリックすると、コマンドボタンまで削除されてしまいます。 通常ではコマンドボタンは削除されないので、原因が解りません。 同じ経験をされた方や、ExcelVBAに詳しい方、アドバイスよろしくお願いいたします。

  • EXCEL VBAで自在に図形を変化させたい。

    今回の質問は図形に寸法値を入れるために基礎学習として簡単なマクロを作った件についてです。 シート上のコマンドボタンでフォームを呼び出し、文字の位置(100とか)を入力し、数字等文字を打ち込むと 打ち込んだ文字がその位置に表示されるというものです。 Private Sub Cmd文字表示_Click() Dim x As Single, y As Single, Sh As Shape On Error Resume Next x = CSng(Text位置A.Value) y = CSng(TextBox1.Value) With ActiveSheet For Each Sh In .Shapes If Sh.Name <> "Cmd文字入力" Then Sh.Delete End If Next Sh .Shapes.AddTextbox(msoTextOrientationHorizontal, x, x, _ x, x).Select End With With Selection.ShapeRange .Fill.Visible = msoFalse .Fill.Transparency = 0# .Line.Weight = 0.75 .Line.DashStyle = msoLineSolid .Line.Style = msoLineSingle .Line.Transparency = 0# .Line.Visible = msoFalse End With Selection.Characters.Text = "y" With Selection.Characters(Start:=1, Length:=3).Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With End Sub 文字位置を自由に変えることは出来ますが打ち込んだ文字に変化させることが出来ません。 簡略的なコードや文字を表示させるには別の方法があるという方がいましたらご教示お願いします。