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

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

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

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

Q&A

解決済

1回答

1383閲覧

シートに貼り付けている画像を消去すると「OLEObjectクラスのTopleftCellプロパティを取得できません」といいうエラーメッセージが表示される。

ice930

総合スコア99

VBA

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

0グッド

0クリップ

投稿2022/11/01 10:23

前提

以下のコードを実行し、シート内の画像を削除しようとすると、
「OLEObjectクラスのTopleftCellプロパティを取得できません」
というエラーが出てしまいます。

実現したいこと

・エラーメッセージが出ない様にしたい
・何が起きているか知りたい。
・自分の認識が間違っていたら指摘してもらいたい。

###シートの画像を削除するプロシージャ

Sub 画像削除() Dim xrg As Range Dim shp As Shape Dim Erow As Long Erow = Cells(Rows.Count, 2).End(xlUp).row Set xrg = Range(Cells(11, 1), Cells(Erow, 1)) For Each xPic In ActiveSheet.Pictures Set xPicRg = Range(xPic.TopLeftCell.Address & ":" & xPic.BottomRightCell.Address) If Not Intersect(xrg, xPicRg) Is Nothing Then xPic.Delete Next Columns(1).ColumnWidth = 3.25 Rows("11:" & Erow).RowHeight = 18.75 End Sub

For文を使い、シート内の画像(OLEObject)を削除する際に、表示されている所(セル)の画像を認識し、削除するものと思っていたのですが、画像の場所(TopleftCell)が無いという事が有るのでしょうか・・・。

理解できずに質問しました。
原因や上記に記載した認識で相違点有ればご指摘いただきたいです。

ちなみに上記のシートに画像を貼り付けるコードは以下のコードです。
JpegとPNGとPDFでサイズの調整と貼り付けを条件分岐しています。

よろしくお願いします!

Sub 画像貼付(grow, gcol, gazou) Dim sename As String sename = ActiveSheet.name '画像サイズ If InStr(gazou, ".png") > 0 Then Set sp = ActiveSheet.Shapes.AddPicture( _ Filename:=gazou, _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=0, _ Top:=0, _ Width:=0, _ Height:=0 _ ) With sp .LockAspectRatio = msoTrue .ScaleHeight 1, msoTrue .ScaleWidth 1, msoTrue Pwi = CLng(.Width * 4 / 3) Phi = CLng(.Height * 4 / 3) .Delete End With ElseIf InStr(gazou, ".pdf") > 0 Then Cells(grow, gcol).Activate ActiveSheet.OLEObjects.Add Filename:=gazou Else Set Pi = LoadPicture(gazou) Phi = CLng(Pi.Height * 0.0378) Pwi = CLng(Pi.Width * 0.0378) End If 'サイズ設定 If InStr(gazou, ".pdf") > 0 Then For Each pic In ActiveSheet.OLEObjects With pic.TopLeftCell pic.Top = .Top pic.Left = .Left pic.Width = .MergeArea.Width 'pic.Height = .MergeArea.Height End With Next Else Cells(grow, gcol).Select Chi = Selection.Height Cwi = Selection.Width If Pwi > Phi Then w = Cwi rat = Cwi / Pwi '縮小幅の縦横比 H = Phi * rat '’画像高さを縦横比に合わせる ElseIf Phi > Pwi Then H = Chi rat = Chi / Phi w = Pwi * rat ElseIf Phi = Pwi Then '画像の縦と横同じ場合 If Cwi > Chi Or Cwi = Chi Then 'セルの幅の方が大きければ(又は同じならば) w = Chi 'セルの高さに幅を合わせる H = Chi ElseIf Chi > Cwi Then 'セルの高さの方が大きければ w = Cwi 'セルの高さに幅を合わせる H = Cwi End If End If '画像貼付 Set shp = Worksheets(sename).Shapes.AddPicture(gazou, msoFalse, msoTrue, _ Range(Cells(grow, gcol), Cells(grow, gcol)).Left, _ Range(Cells(grow, gcol), Cells(grow, gcol)).Top, w, H) With shp .Left = .Left + (ActiveCell.MergeArea.Width - shp.Width) / 2 .Top = .Top + (ActiveCell.MergeArea.Height - shp.Height) / 2 End With End If End Sub

※growには画像を貼り付ける行、gcolには貼り付ける列、gazouには画像のパスが入っています。

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

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

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

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

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

bebebe_

2022/11/02 01:34

適当な画像を挿入してそれに対しては取得はできますか?
sk.exe

2022/11/02 09:12

> Erow = Cells(Rows.Count, 2).End(xlUp).row > Set xrg = Range(Cells(11, 1), Cells(Erow, 1)) 「B 列の最後のデータ行の行番号」を変数 Erow に代入しておきながら、「A 列の 11 行目から Erow 行目までの範囲」を参照されている(列が異なる)のには何か意味があるのでしょうか。
ice930

2022/11/03 00:24

返信遅れ申し訳ありません。 下記に記載したコード(画像を貼り付けるコード)では、表に関連した画像をA列に貼り付けています。 そのA列に貼り付けた画像をを消去するためのコードとして作成したものが上部のコードにな亭ます。 EowにてB列の最終行を求める理由与しては、B列以降にデータ(文字列)が入っている為、その列の最終行を求めました。
guest

回答1

0

ベストアンサー

とりあえず、次のようなプロシージャを実行してみても同様のエラーが返されてしまうのか否かをご確認してみて下さい。

vba

1Sub DeletePicturesAndOLEObjects() 2 3 Dim ws As Worksheet 4 Dim rngArg1 As Range 5 Dim lngFirstRow As Long 6 Dim lngLastRow As Long 7 8 Set ws = ActiveSheet 9 10 With ws 11 12 If .Shapes.Count = 0 Then 13 Set ws = Nothing 14 Exit Sub 15 End If 16 17 lngFirstRow = 11 18 lngLastRow = .Cells(.Rows.Count, 2).End(xlUp).Row 19 20 If lngLastRow < lngFirstRow Then 21 Set ws = Nothing 22 Exit Sub 23 End If 24 25 Set rngArg1 = .Range(.Cells(lngFirstRow, 1), _ 26 .Cells(lngLastRow, 1)) 27 End With 28 29 Dim shpLast As Shape 30 Dim lngShapeIndex As Long 31 Dim strAddress As String 32 Dim rngArg2 As Range 33 34 Application.ScreenUpdating = False 35 36 For lngShapeIndex = ws.Shapes.Count To 1 Step -1 37 38 Set shpLast = ws.Shapes(lngShapeIndex) 39 40 With shpLast 41 Select Case .Type 42 Case msoPicture, msoLinkedPicture, msoEmbeddedOLEObject, msoLinkedOLEObject 43 Debug.Print .Name 44 strAddress = .TopLeftCell.Address & ":" & .BottomRightCell.Address 45 Case Else 46 strAddress = "" 47 End Select 48 If strAddress <> "" Then 49 Debug.Print strAddress 50 Set rngArg2 = ws.Range(strAddress) 51 If Not Intersect(rngArg1, rngArg2) Is Nothing Then 52 .Delete 53 End If 54 Set rngArg2 = Nothing 55 End If 56 End With 57 58 Set shpLast = Nothing 59 60 Next 61 62 Application.ScreenUpdating = True 63 64 Set rngArg1 = Nothing 65 Set ws = Nothing 66 67End Sub

投稿2022/11/04 01:50

sk.exe

総合スコア744

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

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

ice930

2022/11/04 14:44

回答ありがとうございます! エラーなく実行されました! 原因としては何が濃厚でしょうか・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問