エクセル指定範囲画像保存

このQ&Aのポイント
  • Win7のエクセル2013を使用して、指定範囲のシート2を画像ファイル(jpgまたはpng)として保存する方法について教えてください。
  • デスクトップにAフォルダを作成し、その中にB.xlsmファイルを作成します。シート1とシート2がありますが、シート2の指定範囲(A1:J40など広めの範囲)を自動的に上書き保存したいです。
  • 参考になるコードがあるようですが、シート全てが保存されてしまいます。シート2だけを指定して保存する方法を教えてください。
回答を見る
  • ベストアンサー

エクセル指定範囲画像保存

win7 エクセル2013利用 デスクトップにAフォルダ作成→そのなかにB.xlsm作成 シート1、シート2がありシート2の指定範囲をjpgかpngで保存したい。(Aフォルダ\画像フォルダ 内) 繰り返し保存したいので、上書の警告などなく自動的に同じデータ名で上書してほしい。1.pngとかの名前。 範囲は広め(例A1:J40)です。 別ページで同じようなものがあったのですが、シート全て保存されてしまいます。 シート2だけに変更したかったのですが、知識不足でできなかったです。 申し訳ございませんがよろしくお願いします。 参考資料 Sub JPG_SAVE() Dim ws As Worksheet, r As Range, ch As Chart On Error Resume Next For Each ws In ThisWorkbook.Worksheets Set r = ws.Range("A1:M30") r.CopyPicture Appearance:=xlScreen, Format:=xlPicture Set ch = ws.ChartObjects.Add(0, 0, r.Width, r.Height).Chart ch.Paste ch.Export Filename:=ThisWorkbook.Path & "\" & ws.Index & ".jpg", filtername:="JPG" ch.Parent.Delete Next ws End Sub

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

  • ベストアンサー
回答No.2

なかなか回答がつかないようなので、暇つぶしに。 なんというか、色々試してみたらいいのに・・ですよ。 Dim ws As Worksheet, r As Range, ch As Chart   ' エラー処理。エラーを無視して次に進む。   ' しかしむしろ今回は「エラーは表示した方がきっと良い」ので、不要   'On Error Resume Next    ' ↓ ' 繰り返し処理開始、今回要らない   'For Each ws In ThisWorkbook.Worksheets   ' 範囲指定   Set r = ActiveSheet.Range("A1:M30")   ' ↓ 範囲を図としてコピー   r.CopyPicture Appearance:=xlScreen, Format:=xlPicture   ' ↓ 空のグラフ領域を作成   ' サイズは選択領域の幅・高さ   Set ch = ActiveSheet.ChartObjects.Add(0, 0, r.Width, r.Height).Chart   ' ↓ グラフ領域内に貼り付け   ch.Paste   ' ↓ グラフ領域を図諸共JPG画像にエクスポート   ch.Export Filename:="C:\Users\名前\Desktop\Aフォルダ\画像フォルダ\1.jpg", _       filtername:="JPG"   ' ↓グラフ領域削除   ch.Parent.Delete   'Next ws ' ここまで繰り返し ほぼ、VBAの基本として数えられる命令のみです。 いつも思う事ではあるのですが、読み取れないなら使うべきではないです。 私のように「悪意あるコード」を提示する輩もいますから。 当然、上記にも「悪意あるコード」が含まれているかもしれませんが、 不具合が起きても補償は一切いたしません。 お使いになるなら、自己責任でどうぞ。

nightquest
質問者

お礼

ご回答ありがとうございました。 望みどおりの事が出来ました。 注釈もご記入いただき非常にわかりやすく理解できました。 おっしゃる通りでございます。 知識不足でご迷惑をおかけいたしました。

その他の回答 (1)

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.1

貴方が作ったコードを直すのはやぶさかではありませんが、他人が作ったコードを貴方の要望通りに改造するのは気が引けます。 #著作権云々まで行かなくても、この様な場に公開されることを前提としたコードなのかどうか等…… 取りあえずこんな感じです。 ループをやめて、ファイル名を固定にして、Jpeg→pngに変更しただけです。 元のコードとの違いを確認してください。 Sub JPG_SAVE2()   Dim r As Range, ch As Chart   Set r = Worksheets(2).Range("A1:J40")   r.CopyPicture Appearance:=xlScreen, Format:=xlPicture   Set ch = ActiveSheet.ChartObjects.Add(0, 0, r.Width, r.Height).Chart   ch.Paste   ch.Export Filename:=ThisWorkbook.Path & "\1.png", filtername:="PNG"   ch.Parent.Delete End Sub

nightquest
質問者

お礼

ご回答ありがとうございました。 こちらの内容で思い通りの事が実現できました。 そしてご忠告とお心遣いありがとうございます。 完璧に望み通り出来たのですが、別の方が注釈もいれていただいていたので、そちらをBAにさせていただきました。 ですが、完璧に完成しておりましたので心苦しい限りです。 本当にありがとうございました。

関連するQ&A

  • Excel VBA グラフチャート名で指定するには

    ExcelのVBAでグラフを作成した後 ActiveChartでアクティブなチャートを指定するのではなく ActiveChart.Nameなどで取得したチャート名で指定するには どのように記述すればよいでしょうか。 例えば、以下のtest()のコードの中の ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone) ActiveChart.PlotArea.Select ActiveChart.Parent.Copy の部分をActiveChartを使わずチャート名(chart_nameなど)で指定するには どのように記述すればよいでしょうか。 よろしくお願いします。(Windows7,Excel2016) --------------------------------------- Sub test()  Dim chart_name As String  ThisWorkbook.Worksheets("Sheet1").Select  ThisWorkbook.Worksheets("Sheet1").Range("A1") = "A"  ThisWorkbook.Worksheets("Sheet1").Range("A2") = "B"  ThisWorkbook.Worksheets("Sheet1").Range("B1") = "75"  ThisWorkbook.Worksheets("Sheet1").Range("B2") = "25"  ThisWorkbook.Worksheets("Sheet1").Range("A10").Select  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select  ThisWorkbook.Worksheets("Sheet1").Select  ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows  chart_name = ActiveChart.Name  chart_name = Trim(Right(chart_name, Len(chart_name) - Len(ActiveSheet.Name)))  ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate  ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)  ActiveChart.PlotArea.Select  ActiveChart.Parent.Copy End Sub

  • エクセルで連続しない範囲のデータ転記

    下記の Sub 転記TEST01() は正しく転記されます。 ただ、これでは何行にもなるので Sub 転記TEST02() のようにまとめてみました。ところが Sheet1のE37以下が#N/Aとなってしまいます。もちろん転記元のデータは#N/Aではなく数値です。なぜこうなるのでしょうか? Sub 転記TEST01() Set ws = ThisWorkbook.Sheets("TEST") With ThisWorkbook.Sheets("Sheet1") .Range("E4:E12").Value = ws.Range("AK4:AK12").Value .Range("E14:E15").Value = ws.Range("AK14:AK15").Value .Range("E20:E23").Value = ws.Range("AK20:AK23").Value .Range("E26").Value = ws.Range("AK26").Value .Range("E28:E50").Value = ws.Range("AK28:AK50").Value End With End Sub Sub 転記TEST02() Set ws = ThisWorkbook.Sheets("TEST") With ThisWorkbook.Sheets("Sheet1") .Range("E4:E12,E14:E15,E20:E23,E26,E28:E50").Value = _ ws.Range("AK4:AK12,AK14:AK15,AK20:AK23,AK26,AK28:AK50").Value End With End Sub

  • Excel VBAグラフチャート名で指定するには再

    以前に質問しましたが解決していませんので再度質問します。 ActiveChartではなく、具体的なチャート名で 指定するにはどのように記述すればよいでしょうか。 具体的には、以下のtest()のコードの最後の1行 ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows をActiveChartを使わずに記述するには、 どのように記述すればよいでしょうか。 回答例のように具体的なコードを教えてください。 よろしくお願いします。(Windows10,Excel2016) --------------------------------------- Sub test()  ThisWorkbook.Worksheets("Sheet1").Select  ThisWorkbook.Worksheets("Sheet1").Range("A10").Select  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select  ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows End Sub --------------------------------------- (注1)test()を実行する前にSheet1シートのセルA1,A2,B1,B2にA,B,75,25の値を入力してから実行してください。 (回答例) --------------------------------------- Sub test()  Dim chart_name As String  ThisWorkbook.Worksheets("Sheet1").Select  ThisWorkbook.Worksheets("Sheet1").Range("A10").Select  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select  chart_name = ActiveChart.Name  chart_name = Trim(Right(chart_name, Len(chart_name) - Len(ActiveSheet.Name)))  ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows End Sub --------------------------------------- (注2)ただし、このコードではエラーになります。 (注3)回答例のようにチャート名を取得するためにActiveChartを使用するのは可です。

  • エクセルのマクロを使ってデータ範囲が毎回異なるグラフを書きたいです

    あるシステムからデータをエクセルに落とすため、毎回、行や列の数が変わります。 テキスト本を見て下のようなマクロを作成しましたが、うまくいきません。どなたか教えていただけないでしょうか。 Sub グラフシート作成() Dim WS As Worksheet Dim Crt As Chart Range("A65536").End(xlUp).End(xlToRight).Activate Range("A1:" & Selection.Address).Select Set WS = Worksheets("Sheet1") Set Crt = Charts.Add With Crt .ChartType = xl3DBarStacked .SetSourceData Source:=WS.Range(ここに何を書けばいいのでしょうか?), PlotBy:=xlColumns .Name = "野菜栄養価表" End With Set WS = Nothing Set Crt = Nothing End Sub

  • VBA 指定フォルダに複数のセル内容で保存

    こんにちわ。 いつもお世話になっております。 さて、毎度VBAでお世話になっており、表題については指定のシートのみxlsx、pdfファイルで保存するような場合のコードは都度教えていただいて都度うまく行っていたのですが、フォルダやファイルの種類を変えるとうまく行かない場合が多く、試行錯誤で何とかしていたので須が、今回どうしてもあれとこれとを組み合わせてもうまく行かず。 今回の目的で使えそうなpdfでの保存コードは何故かコード中の「pdf」を「xlms」に変更してもpdfファイルで保存されてしまうのは理解できず。 そこでNETで調べたら当方にも分かり易い汎用の下記のサンプルコードがあったのですが > 'ドライブ等の名前を変数に > hozonPath = "K:\" のドライブの書式 ”K:\” が良くわかりません。 具体的に "\\Srv01\業務g\応援チーム\MyPicture" このフォルダに保存したいのですが、どう記載するのか教えてください。 ファイル名にしたいセルは単にA1、A2というように単にセルの列行の記載すればいいのですよね? あまりに初歩的過ぎて質問の意味が分かりにくいでしょうか? Sub hozon() Dim wb As Workbook 'ワークブック Dim ws As Worksheet 'ワークシート Dim hozonPath As String 'ドライブ等のパス用 Dim FolName As String 'A1セル用のフォルダ名用 Dim FilName As String 'A2セル用のファイル名用 '自ワークブック Set wb = ThisWorkbook 'アクティブシート Set ws = ActiveSheet 'ドライブ等の名前を変数に hozonPath = "K:\" 'A1セルの値を変数に FolName = ws.Range("A1").Value 'A2セルの値を変数に FilName = ws.Range("A2").Value wb.SaveAs Filename:=hozonPath & FolName & "\" & FilName End Sub

  • エクセルVBAで保存がうまくいきません

    エクセル2000です。 下記のようなVBAを記述しました。 「はい」なら別名保存 「いいえ」なら上書き保存のつもりです。 問題点 Sheets("AAA").Range("I9")の文字列内に.(半角ピリオド)があるとファイルに拡張子がつきません。 どうしたらよいのでしょうか?非常に困っています。 Sub 保存ボタン() Dim myYN As Integer Dim DRtn As Boolean Dim fn As String, fn2 As String fn = Sheets("AAA").Range("I9").Value & "_保存" fn2 = ThisWorkbook.Name myYN = MsgBox("現在の入力内容を別名で保存しますか?" _ + Chr(&HD) + Chr(&HA) + "別名保存なら「はい」" _ + Chr(&HD) + Chr(&HA) + "上書保存なら「いいえ」を選択します。" _ + Chr(&HD) + Chr(&HA) + "", vbYesNoCancel + vbQuestion, " 別名保存") If myYN = vbCancel Then Exit Sub 'キャンセルなら終了 If myYN = vbNo Then fn = fn2 '上書保存ならファイル名はそのまま DRtn = Application.Dialogs(xlDialogSaveAs).Show(ARG1:=fn, ARG2:=1) If DRtn = False Then Exit Sub 'ファイル名を消されたらキャンセル ThisWorkbook.Save '保存 ThisWorkbook.Close '閉じる End Sub

  • Excelシート1シートのみを指定フォルダへ保存

    Excelのシート1のみを、本日の日付と名前の入ったセル(I7)を保存する時の名前にして指定したフォルダへ保存したいと思っています。 1、シートは本日の日付+I7セルに入っている値を名前にする。 2、フォルダはCではなくV:\○○\○○\○○\○○\○○\○○\○○に格納 3、シート1以外のシート2、シート3は保存せず閉じる 4、格納後○○に保存しました。と表示 試行錯誤し、下記のように記述してみたのですが、 Sub Macro1() 'Option Explicit Sub Sample() Dim xSheet As Worksheet Dim myFile As String Dim myName As String Set xSheet = ActiveSheet ThisWorkbook.Worksheets("シート名").Copy 'myName = ActiveWorkbook.Worksheets(1).Name 'myFile = ThisWorkbook.Path & "\" & myName & ".xls" myFile = ThisWorkbook.Path & "\" & xSheet.Range("I7").Value & ".xls" Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:=myFile Application.DisplayAlerts = True ActiveWorkbook.Close End Sub 日付を指定して保存 Sub test()  Dim Filename As String  Filename = Format(Date, "yyyy年mm月dd日") & ".xls"  ActiveWorkbook.SaveAs "C:\My Documents\" & Filename End Sub 日付とI7セルの名前を合せてブックの名前としたい場合どうVBEで記述すればいいのかわからないので詳しい方がおられましたら、 よろしくお願いいたします。 あまり詳しくないので、そのままコピーできるか、○○の部分を指定フォルダ名に変えてください。等の注釈を付けていただけると助かります。

  • EXCELでSheetにデータを蓄積したい

    Sheet1に入力シートを作成し、Sheet2に蓄積シートを作成しました。 Sheet1で作成されたデータをSheet2に蓄積させておきたい。 Sheet1のA2の値が入力された場合に実行するとすると Sheet1のデータ数は、毎回異なります。 他を参考に以下のように作ってみたのですが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim lastA As Long, lastB As Long, ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("入力シート") Set ws2 = Sheets("蓄積シート") With Target If .Address <> "$A$2" Or .Count <> 1 Or IsEmpty(Target) Then Exit Sub If WorksheetFunction.Count(ws1.Range("a1:s1")) <> 19 Then Exit Sub lastA = ws2.Range("a65536").End(xlUp).Row lastB = ws1.Range(("a2:s2"), Selection.End(xlDown)).Select ws2.Range("a" & lastA + 1).Resize(1, 19).Value = _ ws1.Range("a2:S2").Resize(1, 19).Value End With End Sub 'ws1.Range("a2:S2").Resize(1, 19).Value の部分で '上記ws1の範囲の内、Row2の値しかws2へ反映されません どなたか教えて頂けないでしょうか。

  • ExcelのVBAについて(勉強中のです。)

    ExcelのVBAについて(勉強中のです。) ここからコード3以降に入力したコードを抜き出してデータ表を作成しそれを保存するコードを作成したいです。例えばCSV形式にするとか? データ表は1日分の表示で、保存して週間や月間または統計データまでを視野にいれています。今回は保存する所です。。 利用しやすい状態と保存形式で、よろしくお願いします。データは生活記録みたいなものです。何したどうしたどうなった? ※大分分岐する予定で、作成中であり、今回はコードの整理は不要です。 '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If Next i '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws1.Activate End Sub

  • エクセルVBAでConsolidate

    以下は、ネット検索で見つけたサンプルコードです。 同じフォルダ内の全ブックのSheet1のA1:B10をThisWorkbookのSheet1に統合しています。 Sub test2() Dim MyFile As String, MyPath As String Dim SumFile() As Variant, i As Long MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath, vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) 'A1からB10の値を変数に代入 SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" i = i + 1 End If MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub 質問1 Sheet1だけでなく全シートのA1:B10をThisWorkbookのSheet1に統合するためにはどう書き換えればよいのでしょうか? 質問2 上記コードではなぜ、ブックを開かずにデータがとれるのでしょうか?

専門家に質問してみよう