• ベストアンサー

画像読み込み失敗の判定

mitarashiの回答

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

#3です。 最初のご質問は、当方のコレクションを組み合わせれば実現できますが、Clipboardを何度も経由して美しく無いです。Bitmap->StdPictureのコードはゴロゴロしていますが、その逆が分かりません。実は凄く簡単な事だったりして... Public Const PICTYPE_BITMAP = 1 Public Const CF_BITMAP = 2 Public Const IMAGE_BITMAP = 0 Public Const LR_COPYRETURNORG = &H4 Public Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long Public Declare Function CloseClipboard Lib "user32" () As Long Public Declare Function EmptyClipboard Lib "user32" () As Long Public Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long Public Declare Function CopyImage Lib "user32" (ByVal handle As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Sub test() Dim p As Object Dim fileName As String fileName = "C:\Users\??????\Desktop\hoge.jpg" On Error Resume Next Set p = LoadPicture(fileName) If Err.Number <> 0 Then MsgBox Err.Description 'ピクチャが不正です。 Else CopyBitmapPictureToCB p 'ClipboardのBitmapのPictureからはBMP形式でしか貼り付けられない ActiveSheet.Paste 'ファイルの巨大化防止のため一旦CutしてJPEG貼り付け ActiveSheet.Cut ActiveSheet.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False End If On Error GoTo 0 End Sub Private Function CopyBitmapPictureToCB(ByVal pic As Object) As Boolean Dim hBmp As Long If pic Is Nothing Then Exit Function If pic.Type <> PICTYPE_BITMAP Then Exit Function hBmp = pic.handle hBmp = CopyImage(hBmp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG) If hBmp = 0 Then Exit Function If OpenClipboard(0) Then EmptyClipboard If SetClipboardData(CF_BITMAP, hBmp) Then hBmp = 0 CopyBitmapPictureToCB = True End If CloseClipboard End If If hBmp Then DeleteObject hBmp End Function 後ろのご質問の方は当方が眺めた範囲では、TextFrame等で持っている訳ではなさそうでした。それ以上は分かりかねます。

softwarelearner
質問者

お礼

お知恵を頂き、誠に有難うございます。 二度手間ながら、LoadPictureで画像が正常であることを確認をしたのちに、正常の場合のみAddPicureを行うコーディングをしてみましたが、今度はLoadPictureから制御が戻ってこない場合が発生し、難渋しています。壊れたファイルを扱うのは、なかなか一筋縄ではいかないものですね。 今のところ、唯一、AddPictureでSaveWithDocumentをFalseにした場合にエラーメッセージを出さずにすべての処理が終わるので、これを何とか利用して、SaveWithDocument=Trueでの実行の可否を判断できないものかと考えています。

softwarelearner
質問者

補足

質問者です 話がややこしくなってしまいましたので、一旦閉めて、シンプルに再質問させて頂きます。 また、宜しくお願い致します。

関連するQ&A

  • VB6 エクセルに画像貼り付け

    お世話になります。 VB6でエクセルのセルを数値で指定して、そこに画像を読み込んで実態を張り付けたいのですが、 色々調べて ActiveSheet.Pictures.Insertと ActiveSheet.Shapes.AddPictureを試してみましたが ActiveSheet.Shapes.AddPicture( FileNameTmp, False, True, 10, 20, 0, 0) AddPictureはもしかしてVB6には対応していないのでしょうか? 構文エラーになってしまいます。 ActiveSheet.Pictures.Insert(FileNameTmp).Select Insertだと画像がリンクになってしまいます。

  • Shape画像保存モードの事後変更

    VBA Excel2007を使用しています。 画像を読み込むために、例えば、 Dim picture As Shape Set picture = ActiveSheet.Shapes.AddPicture(filename:=filename, LinkToFile:=msoTrue, SaveWithDocument:=msoFalse, Left:=Selection.Left, Top:=Selection.Top, Width:=0, Height:=0) のように、一旦、画像を「文書とともに保存しない」モードで読込み、後にそのShape画像を「文書とともに保存する」ように変更することは、可能でしょうか。

  • エクセルでリンクされたイメージが表示できません

    エクセルでリンクされたイメージが表示できませんとたまに表示されます。 この理由はどうしてですか? 画像は下記のVBAを用いてセルC113に貼っています。 Sub 貼付() ActiveWindow.View = xlNormalView Range("C113").Select myFileName = "C:\凡例.bmp" '---挿入する画像ファイルの指定 'Cells(113, 3).Select 'ActiveSheet.Pictures.Insert Filename:=myFileName '---選択位置に画像を挿入 Set myShape = ActiveSheet.Shapes.AddPicture(Filename:=myFileName, _ LinkToFile:=True, SaveWithDocument:=False, Left:=Selection.Left + 50, _ Top:=Selection.Top, Width:=200#, Height:=100#) end sub

  • 画像の貼り付けに関して

    環境:Visual Basic 2008 教えて下さい。 現在、あるフォルダに格納されている画像ファイルを、EXCELに貼り付けるような プログラムを作成中で、以下のようなサンプルを見つけましたが、単純に貼り付けではなく、 指定のセルに貼り付けたいと考えています。 そのような指定のセルに貼り付ける為にはどのような記述をしたら良いでしょうか? 教えて下さい。 《現在の記述》 Dim xlApp As New Excel.Application Dim xlWb As Excel.Workbook Dim xlWs As Excel.Worksheet Dim FileNameTmp As String xlWb = xlApp.Workbooks.Open("C:\abc.xls") xlApp.Visible = True xlWs = xlWb.ActiveSheet FileNameTmp = "C:\ABC.png" ' シートオブジェクトを用いない時 xlApp.ActiveSheet.Shapes.AddPicture(FileNameTmp, False, True, 10, 20, 100, 100) 'シートオブジェクトを用いた時 'xlWs.Shapes.AddPicture FileNameTmp, False, True, 10, 20, 100, 100 よろしくお願いします。

  • Excel2003で簡単な図形の表示と非表示のプログラムを作成したので

    Excel2003で簡単な図形の表示と非表示のプログラムを作成したのですが上手く出来ません UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1に楕円の図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1に楕円の図形2非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1に楕円の図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1に楕円の図形2表示 End Sub 上記の記述では上手くいくのですが、下記の様に ワークシート2の図形3と4も同様に表示・非表示したいため追加するとエラーになります。 UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1の楕円図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1の楕円図形2非表示 ActiveSheet.Shapes("Oval 3").Visible=True 'ワークシート2の楕円図形3表示 ActiveSheet.Shapes("Oval 4").Visible=False 'ワークシート2の楕円図形4非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1の楕円図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1の楕円図形2表示 ActiveSheet.Shapes("Oval 3").Visible=False 'ワークシート2の楕円図形3非表示 ActiveSheet.Shapes("Oval 4").Visible=True 'ワークシート2の楕円図形4表示 End Sub VBAの勉強中の初心者です。教えて頂けないでしょうか。

  • 複数のセルのなかに該当があればオートシェイプを表示

    http://okwave.jp/qa/q8365189.html 上記質問の続きです。 画像のようなチェック表をExcelで作っています。 右側欄外に表を作成し、 ◎を付ける番号、○をつける番号をそれぞれ入力し、 「入力内容を反映」ボタンをクリックすると、 オートシェイプで配置した◎や○が表示されるようにしたいです。 VBAを以下のように作成してみたのですが、 ◎はつくのですが、 ○をつけるVBAが動きません。 どのように修正するべきでしょうか? ご教授ください! Private Sub CommandButton1_Click() '○で囲むVBA Dim c For Each c In Range("U103:Y103") If InStr(c.Value, "1") > 0 Then ActiveSheet.Shapes("1を囲む○").Visible = True Else ActiveSheet.Shapes("1を囲む○").Visible = False End If If InStr(c.Value, "2") > 0 Then ActiveSheet.Shapes("2を囲む○").Visible = True Else ActiveSheet.Shapes("2を囲む○").Visible = False End If Next c ・ ・ ・ '最も重要なものを◎で囲むVBA If Range("T103").Value = "1" Then ActiveSheet.Shapes("1を囲む◎").Visible = True Else ActiveSheet.Shapes("1を囲む◎").Visible = False End If If Range("T103").Value = "2" Then ActiveSheet.Shapes("2を囲む◎").Visible = True Else ActiveSheet.Shapes("2を囲む◎").Visible = False End If ・ ・ ・ End Sub ちなみに「'○で囲むVBA」のコードだけを残して動作させてみると、 1や2が一番右のセル(Y103)に入力されると、1を囲む○、2を囲む○がそれぞれ表示されるのですが、 それ以外のセル(U103からX103)に1や2を入力しても○は表示されません。 全コードを入力して動作させると、 1や2を一番右のセル(Y103)に入力しても○はどこにも表示されません。 よろしくお願いいたします!

  • ワードでマクロで画像を中央揃えにしたい

     ワードでマクロを使って、挿入・画像ファイルで取り込んだ画像を、レイアウトの詳細設定で水平、垂直ともページを基準にして、中央揃えにしたいのです。  画像は1ページに1枚です。  たくさんの画像を一つ一つやるのは大変です。  やり方のわかる方がいたらお願いします。  参考までに画像を取り込む部分を載せておきます。 ' Sub Macro1() ' Dim FileName As String ' ChDir ThisDocument.Path ' FileName = Dir("*.jpg") While FileName > "" Selection.InsertBreak Type:=wdPageBreak ' 改ページ Application.Browser.Previous ' 前のページへ ' 画像の読み取り ActiveDocument.Shapes.AddPicture(Anchor:=Selection.Range, _ FileName:=FileName, LinkToFile:=False, _ SaveWithDocument:=True).WrapFormat.Type = 5 ' Application.Browser.Next ' 次のページへ ' FileName = Dir Wend ' End Sub '

  • エクセルに画像挿入

    以前の投稿で下記のようなVBAを拝見しました。 実行するとA列に画像ファイル名、B列に画像が縦に配置されます。 これを横に配置するにはどうすればいいのでしょうか? 初心者なので質問不足かもしれませんがよろしくお願いします。 Sub PictAdd() Dim pict As Shape, r As Range With Application.FileSearch  .NewSearch  .LookIn = ThisWorkbook.Path  .SearchSubFolders = False  .Filename = "*.jpg"  If .Execute() > 0 Then   For i = 1 To .FoundFiles.Count    Set r = ActiveSheet.Range("B" & i)    Set pict = ActiveSheet.Shapes.AddPicture _       (.FoundFiles(i), msoTrue, msoFalse, _        r.Left, r.Top, r.Width, r.Height)       pict.OnAction = "PictClick"       r.Offset(0, -1).Value = Dir(.FoundFiles(i))   Next i  End If End With  Columns(1).EntireColumn.AutoFit End Sub

  • H列の画像の下に画像を挿入できるようにしたい

    H列の画像の下に画像を挿入できるようにしたいです。 マクロを組んでみたのですが、A列に画像があった場合、 その下に画像が挿入されてしまいます。 H列のみで判断して挿入するにはどうすればよろしいでしょうか。 Sub 改修後写真添付() Dim FileName As Variant Dim I, F, endRow As Long Dim sheetName As String Dim shp As Shape sheetName = ActiveSheet.Name FileName = Application.GetOpenFilename(MultiSelect:=True) On Error GoTo err_shori If Range("H5") = "" Then I = 5 Range("H5").Value = "画像添付" Else For Each shp In ActiveSheet.Shapes endRow = Application.Max(endRow, shp.BottomRightCell.Row) Next I = 2 + endRow End If For F = 1 To UBound(FileName) With Sheets(sheetName).Pictures.Insert(FileName(F)) .Top = Range("H" & I).Top .Left = Range("H" & I).Left .Width = "170" .Height = "165" .Cut End With With Sheets(sheetName) .Range("H" & I).Select ActiveSheet.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayAsIcon:=False End With I = I + 14 Next F MsgBox UBound(FileName) & "個の画像ファイルが挿入されました。" Exit Sub err_shori: MsgBox "キャンセルされました。" End Sub

  • Shapes の使い方について

    今まで、Excel VBA で、 If ActiveSheet.Button1.Visible = False Then   Exit Sub End If が問題なく動いていましたが、VISTA を使っておられる人からエラーが出るという指摘を受けました(Excel のバージョンはわかりません)。どうやら上の文に問題があるような気がして、いろいろ調べてみましたら、皆さん If ActiveSheet.Shapes("Button1").Visible = False Then   Exit Sub End If としておられるようなのです。なぜ、Shapes("Button1")としなければならないのか、教えていただけませんか。