[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『画像挿入時のエラーについて』(うさぎ)
下記のマクロを使って画像を連続で挿入しています。
1.マクロで画像挿入 → 2.再度マクロで画像を挿入
という単純な作業であればエラーがでないのですが、
1.マクロで画像挿入 → 2.セルに文字を入力する → 3.再度マクロで画像挿入
と別の作業を挟むと3で実行されずエラーが出ます。
2.セルに文字を入力する の後にExcelを保存するとエラーが出ずに実行できます。
一々保存せずに1、2、3を繰り返して作業したいのですが、どうすればよいのかご教授よろしくお願いいたします。
―――――――――――――――――――――――――――――――――――
Sub ShpAdTest()
Dim FNames As Variant, myShp As Shape
Dim Fn As String, i As Long
FNames = Application.GetOpenFilename( _ filefilter:="Image(*.jpg;*.gif;*.bmp;*.png),*.jpg;*.gif;*.bmp;*.png", _ Title:="図の挿入(複数選択可)", _ MultiSelect:=True)
If Not IsArray(FNames) Then Exit Sub
Call BubbleSort_Str(FNames, True, vbTextCompare)
Application.ScreenUpdating = False
For i = LBound(FNames) To UBound(FNames)
PasteShp (FNames(i))
With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
.LockAspectRatio = msoTrue .Placement = xlMove .DrawingObject.PrintObject = True .Height = 150 .Width = 224
End With
ActiveCell.Offset(15).Select
Next
End Sub
Sub PasteShp(fname As Variant)
Dim Shp As Shape
Set Shp = ActiveSheet.Shapes.AddPicture( _
Filename:=fname, _
linktofile:=False, savewithdocument:=True, _
Left:=Selection.Left, Top:=Selection.Top, _
Width:=0, Height:=0)
Shp.ScaleHeight 1!, msoTrue
Shp.ScaleWidth 1!, msoTrue
Set Shp = Nothing
End Sub
Private Sub BubbleSort_Str( _
ByRef Source As Variant, _
Optional ByVal SortAsc As Boolean = True, _
Optional ByVal Compare As VbCompareMethod = vbTextCompare)
If Not IsArray(Source) Then Exit Sub
Dim i As Long, j As Long
Dim vntTmp As Variant
For i = LBound(Source) To UBound(Source) - 1
For j = LBound(Source) To LBound(Source) + UBound(Source) - i - 1
If StrComp(Source(IIf(SortAsc, j, j + 1)), _
Source(IIf(SortAsc, j + 1, j)), Compare) = 1 Then
vntTmp = Source(j)
Source(j) = Source(j + 1)
Source(j + 1) = vntTmp
End If
Next j
Next i
End Sub
< 使用 Excel:Office365、使用 OS:Windows10 >
実行時エラー 1004 「アプリケーション定義またはオブジェクト定義のエラーです。」
と出ます。
前任者が作成したマクロのため、理解できずデバック?しても何でつまづいているのかわからない状態です。
(うさぎ) 2022/02/09(水) 16:07
前任者ですか?
昨年の9月ごろで…。
(前任者?) 2022/02/09(水) 17:03
エラーについては教えてもらってないので、質問いたしました。
(うさぎ) 2022/02/09(水) 18:03
Shapeにはいろいろな種類があります。 図形、画像、のほか、コメント、入力規則のドロップダウン等です。 画像以外のものが悪さをしているように想像します。
そこで、以下の点を確認して教えてください。
(Q1)下記のプロシージャの結果(イミディエイトウインドウに出力される)を 教えてください。 Sub test() Dim shp As Shape For Each shp In ActiveSheet.Shapes Debug.Print shp.Name, shp.Type Next Debug.Print "------------------------" End Sub
(Q2)現在のコードの一行だけを変更してみてください。 With ActiveSheet.Shapes(ActiveSheet.Shapes.Count) を With ActiveSheet.Shapes(ActiveSheet.Pictures.Count) に変更して、実行結果(エラーの有無)を教えてください。
(γ) 2022/02/09(水) 20:13
広義のShapeとして、「コメント」と「入力規則」を上げましたが、 たぶん原因は「入力規則」ではないかと思います。
・入力規則を使ったあとで、上記であげたtestを実行すると Type=8のShapeが観測されます。 ・しかし、いったんブック保存を行った直後に再度実行すると Type=8のShapeは結果に載ってきません。 こうなる理由は私には不明ですが、いわゆる仕様ということなんでしょう。 保存によって、いったん利用可能にした入力規則が閉じられるのでしょうか。 この観察結果は、 >セルに文字を入力する の後にExcelを保存するとエラーが出ずに実行できます。 という現象と整合的です。
なお、「コメント」は、ブックの保存にかかわらず常に対象と把握されますので、 上記の現象とは整合しません。
図形などのShapeがなく、画像(と入力規則)だけであれば、 ActiveSheet.Shapes(ActiveSheet.Pictures.Count)によって、 直前で挿入した画像がつかまえられるはずです。 (γ) 2022/02/09(水) 22:05
回答ありがとうございます。
(Q1)下記のプロシージャの結果(イミディエイトウインドウに出力される)を
教えてください。
・画像貼り付けていないシートでは------------------とだけでます
・元マクロで3枚画像貼り付け後で試した結果下記が出ました。
Picture 2 13
Picture 4 13
Picture 6 13
Drop Down 1 8
------------------------
(Q2)現在のコードの一行だけを変更してみてください。 With ActiveSheet.Shapes(ActiveSheet.Shapes.Count) を With ActiveSheet.Shapes(ActiveSheet.Pictures.Count) に変更して、実行結果(エラーの有無)を教えてください。
>試してみたところエラーが出なくなりました。
使用Excelファイルはオートシェイプなどはなく、画像とドロップダウンのみなので
γさんがおっしゃった通りになりました。
こんな一つのことで変わるものなのですね。
改めてお力添えいただきありがとうございます。
(うさぎ) 2022/02/10(木) 09:44
解決したようで何よりです。
以下、自分用の備忘も兼ねてメモしておきます。 (閲覧者さんの参考になれば幸いです。ご返事は不要です)
Activesheet.Shapes の要素を For each で列挙したときの順序は、 以下のようになります。 (1)AotoShape(Type=msoAutoShape)および Picture(Type=msoPicture)のグループ (2)コメント(Type=msoComment)のグループ (3)入力規則(Type=msoFormControl)のグループ また、この順序は、対応する整数インデックスの順序でもあります。
なお、 ・(1)のグループのなかでは、AutoShapeとPictureが順不同で混在します。 ですから、AutoShapeが一つでもあると、今のロジックは破綻します。 ・(1)(2)(3)はかならず、この順になるようです。 ・この順に従うことは、内部のロジックに依存していて、 その順序を外部からコントロールはできないと思います。
(γ) 2022/02/10(木) 10:46
普通に考えれば、 PasteShpで挿入した画像が確定しているのですから、 その画像オブジェクトをNothingなどとせずに、 それを使って、 .LockAspectRatio = msoTrue .Placement = xlMove .DrawingObject.PrintObject = True .Height = 150 .Width = 224 の処理を行えばよいだけの話でした。 ActiveSheet.Shapesの列挙の順序とか、七面倒な議論は余計なことだったかもしれません。 (γ) 2022/02/10(木) 12:05
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.