Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3605 / 13644 ツリー ←次へ | 前へ→

【61011】シートにある画像を、画像の斜め上の表に書いてある番号名で保存するマクロ ai 09/4/3(金) 0:04 質問[未読]
【61021】Re:シートにある画像を、画像の斜め上の表... Jaka 09/4/3(金) 16:31 発言[未読]
【61032】Re:シートにある画像を、画像の斜め上の表... ai 09/4/4(土) 19:20 発言[未読]
【61056】Re:シートにある画像を、画像の斜め上の表... Jaka 09/4/6(月) 17:06 発言[未読]
【61058】Re:シートにある画像を、画像の斜め上の表... ai 09/4/6(月) 18:41 お礼[未読]
【61077】ちょっと変えました。 Jaka 09/4/8(水) 13:33 発言[未読]
【61129】更に改良 Jaka 09/4/10(金) 14:58 発言[未読]
【61195】Re: ai 09/4/15(水) 20:06 お礼[未読]

【61011】シートにある画像を、画像の斜め上の表に...
質問  ai  - 09/4/3(金) 0:04 -

引用なし
パスワード
   何日か調べたのですが、わからないので教えて下さい。
項目と画像がセットになってある表が一つのシートに大量に並んでいます。
※いくつかは画像が入っていない部分もあります。
それを表の項目にある番号名でその表にある画像を保存できるマクロを作りたいです。
(番号は画像がある位置の左上にそれぞれ書いてあります)
ただ、表と表の間隔について、
列は均一なのですが、行の方は少し異なっている部分があります。

(ちなみに画像はフォルダにも一括で入っています。)
画像1つ1つに名前をつけて保存したいのですが、そういった処理はマクロでできるのでしょうか?(保存する名前は項目名で。項目名はR-1、R-2、R-2-2、R-3の様になっています。)
WEBで検索しても、ワークシートの名前を項目名で保存とかはあるのですが、こういった内容のサンプルなどがなく、どうやったらよいかまったくわかりません。
よろしくお願いします(_ _)

【61021】Re:シートにある画像を、画像の斜め上の...
発言  Jaka  - 09/4/3(金) 16:31 -

引用なし
パスワード
   これで、画像の右上のセルがわかります。

LT = ActiveSheet.Shapes("図 6").TopLeftCell.Address
BR = ActiveSheet.Shapes("図 6").BottomRightCell.Address
図形右上セル = Range(LT, BR).Rows(1).Cells(Range(LT, BR).Rows(1).Cells.Count).Address
MsgBox 図形右上セル


以下、過去ログを探せなかったので...。(内容は、当時のまま)
他は、API使うとか。

Sub 画像Jpeg保存()
  Dim Cht As Chart
  Dim Rgw As Single, Rgh As Single
  Dim MRng As Range
  With Sheets("Sheet2").Shapes("図 6")
    '+7は、左、上の余白が消せないので、合わせる為の右、下の余白分
    'セル範囲の場合は、余白が調整される?ドットとピクセルの違い?
    Rgh = .Height + 7
    Rgw = .Width + 7
    .CopyPicture Format:=xlBitmap
  End With
  With ActiveSheet.ChartObjects.Add(0, 0, Rgw, Rgh).Chart
    .Paste
    .ChartArea.Border.LineStyle = 0
    .Export CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\画像ファイルの名前.jpg"
    .Parent.Delete
  End With
End Sub

【61032】Re:シートにある画像を、画像の斜め上の...
発言  ai  - 09/4/4(土) 19:20 -

引用なし
パスワード
   ありがとうございます。
VBAはまだまったくわかっていませんのでサンプルを頂けて助かりました。
処理の流れでは
・Forを使い、オブジェクトを探す(プロパティを使う??)
・見つかったらその真上左に書いてある項目名で名前をつけて保存
という風にコードを作りたいのですが、、、まだ道のりは遠いですね。

【61056】Re:シートにある画像を、画像の斜め上の...
発言  Jaka  - 09/4/6(月) 17:06 -

引用なし
パスワード
   チャートオブジェクトの使い回しがうまい事行きませんでした。
よって、毎回作っちゃ削除を繰り返しています。
なのもで、新規シートを作業シートとしました。(後で削除)
素直に ActiveChart ってやればよかったのかも。

Dim ACWS As Worksheet, AdWS As Worksheet, OBJ As Object
Dim LT As String, BR As String, 図形右上セル As String
Dim Rgh As Double, Rgw As Double, 画像名 As String
Set ACWS = ActiveSheet
Set AdWS = Worksheets.Add
For Each OBJ In ACWS.DrawingObjects
  If TypeName(OBJ) = "Picture" Then
   With OBJ
     LT = .TopLeftCell.Address
     BR = .BottomRightCell.Address
     図形右上セル = ACWS.Range(LT, BR).Rows(1).Cells(ACWS.Range(LT, BR).Rows(1).Cells.Count).Address
     If ACWS.Range(図形右上セル).Row <> 1 Then
       画像名 = ACWS.Range(図形右上セル).Offset(-1).Value
     Else
       画像名 = ACWS.Range(図形右上セル).Offset(, 1).Value 'この辺は適当。
     End If

     Rgh = .Height + 7
     Rgw = .Width + 7
     .CopyPicture Format:=xlBitmap
     With AdWS.ChartObjects.Add(0, 0, Rgw, Rgh).Chart
       .Paste
       .ChartArea.Border.LineStyle = 0
       .Export CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & 画像名 & ".jpg"
       .Parent.Delete
     End With
   End With
  End If
Next

Application.DisplayAlerts = False
AdWS.Delete
Application.DisplayAlerts = True
Set AdWS = Nothing

【61058】Re:シートにある画像を、画像の斜め上の...
お礼  ai  - 09/4/6(月) 18:41 -

引用なし
パスワード
   すごいですね・・・、どうもありがとうございます(__)
作って頂いたサンプルを元に微調整をしてやってみたいと思います。

【61077】ちょっと変えました。
発言  Jaka  - 09/4/8(水) 13:33 -

引用なし
パスワード
   Sub 画像Jpeg保存()
Dim AcSh As Worksheet, NwBk As Workbook
Dim Obj As Object, Crt As Chart, CrtNm As String
Dim Rgh As Double, Rgw As Double
Dim LT As String, BR As String, 図形右上セル As String
Dim 画像名 As String

Set AcSh = ActiveSheet
Set NwBk = Workbooks.Add
Set Crt = NwBk.Sheets(1).ChartObjects.Add(0, 0, Rgw, Rgh).Chart
CrtNm = Mid(Crt.Name, InStr(1, Crt.Name, " ") + 1)

For Each Obj In AcSh.DrawingObjects.ShapeRange
  'グループ化された画像にについては無視。
  With Obj
   If .Type = msoPicture Then
     LT = .TopLeftCell.Address
     BR = .BottomRightCell.Address
     図形右上セル = AcSh.Range(LT, BR).Rows(1).Cells(AcSh.Range(LT, BR).Rows(1).Cells.Count).Address
     If AcSh.Range(図形右上セル).Row <> 1 Then
      画像名 = AcSh.Range(図形右上セル).Offset(-1).Value
     Else
      画像名 = AcSh.Range(図形右上セル).Offset(, 1).Value
     End If

     Rgh = .Height + 7
     Rgw = .Width + 7
     'NwBk.Sheets(1).Shapes(CrtNm).Height = Rgh
     'NwBk.Sheets(1).Shapes(CrtNm).Width = Rgw
     NwBk.Sheets(1).ChartObjects(CrtNm).Height = Rgh
     NwBk.Sheets(1).ChartObjects(CrtNm).Width = Rgw
     .CopyPicture Format:=xlBitmap

     With Crt
       .Paste
       .ChartArea.Border.LineStyle = 0
       .Export CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & 画像名 & ".jpg"
       DoEvents
     End With
     NwBk.Sheets(1).ChartObjects(CrtNm).Chart.Shapes(1).Delete
   End If
  End With
Next
NwBk.Sheets(1).ChartObjects(CrtNm).Delete
NwBk.Close (False)
Set AcSh = Nothing
Set NwBk = Nothing
Set Crt = Nothing
End Sub

【61129】更に改良
発言  Jaka  - 09/4/10(金) 14:58 -

引用なし
パスワード
   画像をずらす事で空白部分がうまく隠れました。
APIを使ずにうまく行きました。
私的見た目。一応ピクセル単位で確認したけど...。

Sub 画像Jpeg保存余白無し()
Dim AcSh As Worksheet, NwBk As Workbook
Dim Obj As Object, Crt As Chart, CrtNm As String
Dim Rgh As Double, Rgw As Double
Dim LT As String, BR As String, 図形右上セル As String
Dim 画像名 As String

Set AcSh = ActiveSheet
Set NwBk = Workbooks.Add
Set Crt = NwBk.Sheets(1).ChartObjects.Add(0, 0, Rgw, Rgh).Chart
CrtNm = Mid(Crt.Name, InStr(1, Crt.Name, " ") + 1)

For Each Obj In AcSh.DrawingObjects.ShapeRange
  'グループ化については無視。
  If Obj.Type = msoPicture Then
   LT = Obj.TopLeftCell.Address
   BR = Obj.BottomRightCell.Address
   図形右上セル = AcSh.Range(LT, BR).Rows(1).Cells(AcSh.Range(LT, BR).Rows(1).Cells.Count).Address
   If AcSh.Range(図形右上セル).Row <> 1 Then
     画像名 = AcSh.Range(図形右上セル).Offset(-1).Value
   Else
     画像名 = AcSh.Range(図形右上セル).Offset(, 1).Value
   End If

   Rgh = Obj.Height - 0.5
   Rgw = Obj.Width - 0.5
   NwBk.Sheets(1).ChartObjects(CrtNm).Height = Rgh
   NwBk.Sheets(1).ChartObjects(CrtNm).Width = Rgw
   Obj.CopyPicture Format:=xlBitmap

   With Crt
     .Paste
     .ChartArea.Border.LineStyle = 0

     NwBk.Sheets(1).ChartObjects(CrtNm).Chart.Shapes(1).IncrementLeft -4
     NwBk.Sheets(1).ChartObjects(CrtNm).Chart.Shapes(1).IncrementTop -4
     
     .Export CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & 画像名 & ".jpg"
     DoEvents
   End With
   NwBk.Sheets(1).ChartObjects(CrtNm).Chart.Shapes(1).Delete
  End If
Next
NwBk.Sheets(1).ChartObjects(CrtNm).Delete
NwBk.Close (False)
Set AcSh = Nothing
Set NwBk = Nothing
Set Crt = Nothing
End Sub

【61195】Re:
お礼  ai  - 09/4/15(水) 20:06 -

引用なし
パスワード
   ありがとうございます!
項目の位置を編集してデスクトップに保存できました!

3605 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free