• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBAによるコピー作業について)

Excel VBAによるイメージ保存の方法と問題解決

このQ&Aのポイント
  • Excel VBAを使用して、画像を個別に名前を付けて保存する方法を紹介します。
  • 質問者は、現在のVBAコードで1枚の画像しか保存できない問題に直面しています。
  • 解決策として、VBAコードを修正して全ての画像を個別に保存できるようにする方法を説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 CreatePictureFromClipboard() 関数 SavePictureJpg() 関数 については、そちらの環境で正しく動作するものが設定されているとして、 それらの関数については、当方の環境では再現できませんので、こちらは一切関知しません。 ご質問のポイントは、 対象のイメージと項番をすべて捉えてループすること、 対象のイメージと項番との対応関係を正しく得ること、 保存するファイル名を正しく整形すること の3点、と考えました。 厄介なのは、 > ★イメージ列の各セルにほぼ収まる状態でイメージが貼りつけられた以下のExcelシートがあります。 の、"ほぼ収まる状態"、という部分です。 例えば項番4に対応したイメージが、項番3に掛かるような位置にあっても、 項番4と関連付けする方法として、  イメージの中心点のY座標(縦方向位置)と、  イメージが貼り付けられたセル(.TopLeftCell)のひとつ下のセルの.Top とを比較して  .TopLeftCell の行のA列の項番と関連付けるか  .TopLeftCell のひとつ下のセルの行のA列の項番と関連付けるか を決めます。 中心点が収まっていない状態なら、 ひとつ下のセルに"ほぼ収まる状態"であろう、という解釈です。 sSavePath を事前に "C:\Users\test\Pictures\" と設定。 ActiveSheet の .Shapes を総当たりでループして、  各Shape(oShape)の   .Type が, msoPicture であるならば、    .TopLeftCell.Column が、1~2列め、であるならば、     中心点とセルのY座標を比較することで分岐して、      対応する項番を、nSrNum に格納 ///     以降の処理は、ご提示のまま、     ファイル名については sSavePath & Format$(nSrNum, "000") & ".jpg"     Format$() 関数で項番を3桁に整形します。 /// ActiveSheet の .Shapes を総当たりする中で、 .Type プロパティが, msoPicture を返す場合だけに限定していますが、 修正が必要ならば、VBEのオブジェクトブラウザで、MsoShapeType を確認の上、 応用してください。 ' ' /// Sub 画像保存()   Dim sSavePath As String   Dim gdipRet As GDIPlusStatusConstants   Dim myStdPicture As StdPicture   Dim oShape As Shape   Dim nSrNum As Long   sSavePath = "C:\Users\test\Pictures\"   With ActiveSheet     For Each oShape In .Shapes       With oShape         If .Type = msoPicture Then           If .TopLeftCell.Column < 3 Then             If .Top + .Height / 2 < .TopLeftCell.Offset(1).Top Then               nSrNum = .TopLeftCell.EntireRow.Cells(1).Value             Else               nSrNum = .TopLeftCell.Offset(1).EntireRow.Cells(1).Value             End If             .CopyPicture Appearance:=xlScreen, Format:=xlBitmap             Set myStdPicture = CreatePictureFromClipboard             'jpg保存するときはこの下の行を有効に(100ところを0~100に変更でクオリティ設定できる)             gdipRet = SavePictureJpg(myStdPicture, sSavePath & Format$(nSrNum, "000") & ".jpg", 100)           End If         End If       End With     Next   End With End Sub ' ' ///

teshiga119
質問者

お礼

以下関数での保存が利かなくなりました。所々修正してみます。 ・CreatePictureFromClipboard() 関数 ・SavePictureJpg() 関数 ご教示いただきまして、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 画像ファイルを保存する方法

    洗濯してる画像を保存するvbaコードが知りたいのですが Sub Sample() Dim PicFile As String Dim myRess As Variant PicFile = "C:\Users\test.jpg" ActiveSheet.Pictures.Insert PicFile ActiveSheet.Pictures.Insert(PicFile).Select PicFile = Selection.Name myRess = ActiveSheet.Shapes(PicFile).Picture.Export( _ ThisWorkbook.Path & "\test.jpg", "JPG", False) End Sub だと実行時エラー438になります。 Export メソッドは、グラフにしか使えないのでしょうか? 画像ファイルを保存する方法をご教授ください。

  • ExcelのVBAについて

    こんにちは、VBA初心者です。 C:\pictureの中に以下のファイルがあります。 DSC_0134.JPG~DSC_0154.JPG これらのファイルをExcelのA列1~20行に書かれた文字△○%&◎~▲▽%%★に.JPGをつけて保存したくて以下のコードを書きました。 Dim buf As String Dim msg As String Dim i As Integer Dim A As Variant i = 1 buf = Dir("dsc*.jpg", vbNormal) Do While buf <> "" Do While i < 21 buf = Dir() msg = buf 'msg=元の名前 A = Worksheets("sheet1").Cells(i, 1).Value     Worksheets("sheet1").Cells(i, 2).Value = msg          Name "C:\picture\msg" As "C:\picture\A.jpg"     i = i + 1 Loop Loop Name "C:\picture\msg" As "C:\picture\A.jpg"のところで、「ファイルがありません。」となってしまいます。 あと、Worksheets("sheet1").Cells(i, 2).Value = msgのところで、\pictureの中の最初のファイル(DSC_0134.JPG)を表示しません。 どこを直せばよいのでしょうか?

  • VBAでwebの画像を名前を付けて保存する方法

    下記でエクセルのシートには保存はできましたが直接画像をjpegでファイルとして保存するにはどうすれば良いでしょうか? マクロの記録では無理でした・・・ どなたかご存知の方よろしくお願いいたします。 Sub test() Dim IMG As Variant Dim wbooks As Workbook Dim Filename As String Set wbooks = Workbooks.Add Filename = "C:\テスト\" & Format(Date - 1, "yyyymmdd") & ".xlsx" wbooks.SaveAs (Filename) IMG = "http://t-success.co.jp/image.jpg" With ActiveSheet.Pictures.Insert(IMG) .Top = Range("A1").Top .Left = Range("A1").Left End With wbooks.Save End Sub

  • vbaでCountIf関数を使いたい(エクセル)

    A1セルにa-a-aがはいっています。 この場合aは3つですよね。 これをvbaで取得するコードを作っているのですがうまくできません。 Sub test() Dim myStr As String myStr = "a" MsgBox WorksheetFunction.CountIf(Cells(1, 1), "*" & myStr & "*") End Sub これをすると、なぜか1が返ってきます。 Aは3つあるのになぜ1が返るのでしょうか? A1にaaaaaを入れて実行しても1が返ります。

  • エクセルのVBAで、フォルダごとコピーしたいのですが…

    エクセルのVBAで、フォルダごとコピーしたいのですが… Dドライブの”TEST"というフォルダを、同じくDドライブに"TEST2"という名前でコピーしたいのです。 Private Sub sakusei_Click() Dim myFSO As New FileSystemObject myFSO.CopyFolder "D:\TEST", "D:\TEST2" End Sub ではうまくいかないのです。 私は初心者なので調べてもよくわからないので、 有識者の方、是非教えてください。 宜しくお願い致します。

  • エクセルVBAに関して

    VBAの知識があまりないので教えて頂きたいのですが、セルの内容が変更されたら マクロが実行される Private Sub Worksheet_Change(ByVal Target As Range) というのがあるかと思います。 セルに書かれた関数によって、セルの内容が変化したときにマクロが実行されるVBA関数はあるのでしょうか?

  • VBA Wクリックイベント

    A4用紙に縦3枚の写真を貼り付けたいのですが、1つに結合したセルをWクリックすると「ファイルを開く」を出し、写真を選び、Wクリックしたセルに貼り付けるようにしたいのです。 自分でマクロを作ってみました。 Sub Test() Dim fName, pict As Picture fName = Application.GetOpenFilename("JPG, *.jpg", MultiSelect:=True) If IsArray(fName) Then For i = 1 To UBound(fName) Set pict = ActiveSheet.Pictures.Insert(fName(i)) pict.TopLeftCell = ActiveCell pict.Width = 350 pict.Height = 250 ActiveCell.Offset(2, 0).Activate Next i End If End Sub これを実行させようと思うと一つ一つ ツール→マクロ→マクロ→実行をしなければなりません。 これをセルをWクリック等したら「ファイルを開く」が出るようなVBAはありませんでしょうか? それと低レベルな質問ですが、Wクリックでファイル呼出が出来たとして、それを貼り付けたいセル全部にファイル呼出が出来るようにするには、一つ一つマクロを書くのでしょうか? 初心者でわかりにくい書き方ですみません。 よろしくお願いします。

  • エクセルに写真を挿入するVBA

    エクセルで写真集を作るためのVBAですが、以下のVBAでは画像がリンク貼り付けになってしまいます。どうしたらエクセルファイルに画像を貼りこみで保存できるのでしょうか? よろしくお願いいたします。 やりたいことは、まずダブルクリックでダイアログボックスを表示させ、挿入したい写真を選択、写真がセルに合わせた大きさに縮小、セルの中央に写真を配置。以上です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _                     Cancel As Boolean)   Dim PicFile As Variant   Dim rX As Double, rY As Double   '[ファイルを開く]ダイアログボックスを表示   PicFile = Application.GetOpenFilename( _             "画像ファイル,*.jpg;*.jpeg;*.gif;*.tif;*.png;*.bmp")   If VarType(PicFile) = vbBoolean Then Cancel = True: Exit Sub   Application.ScreenUpdating = False      '画像を挿入   With ActiveSheet.Pictures.Insert(PicFile)     rX = Target.Width / .Width     rY = Target.Height / .Height     If rX > rY Then       .Height = .Height * rY     Else       .Width = .Width * rX     End If     'セルの中央(横方向/縦方向の中央)に配置     .Left = Target.Left + (Target.Width - .Width) / 2     .Top = Target.Top + (Target.Height - .Height) / 2   End With      Application.ScreenUpdating = True   Cancel = True End Sub

  • Excel VBA 実行されないのはなぜ

    いつもお世話になっております。 VBAの練習で以下のような構文を作成し実行すると 構文のサンプルを並べているシートでのみエラーが表示されます。 新規シートでは実行されるので、なぜなのかと思います。 変数名が重複しているということもありません。 思い当たる点がありましたら教えてください。 よろしくお願いいたします。 Sub InputBoxメソッドで選択した範囲を取得する() Dim myselect As Range 'On Error Resume Next Set myselect = Application.InputBox("セル範囲を選択します。", Type:=8) If myselect Is Nothing Then Exit Sub myselect.Value = "test" End Sub

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

専門家に質問してみよう