
お世話になります。初心者ですが、掲題の件、以下の通り質問させて下さい。
【環境】
★イメージ列の各セルにほぼ収まる状態でイメージが貼りつけられた以下のExcelシートがあります。
※項番:一部飛んでいます。
※イメージ:一部張り付いていないセルがあります。
=================================
項番 |イメージ
=================================
1 | ABC
---------------------------------
2 | A@
---------------------------------
3 |
---------------------------------
4 | B*
---------------------------------
7 | CBA
---------------------------------
8 | HHH
---------------------------------
10 | YYY
---------------------------------
11 |
---------------------------------
12 | AAA
---------------------------------
15 | BBB
=================================
【VBAでの実行タスク】
★上記Excel(仮称:test.xlsx)ファイル上の全イメージを個別に名前を付けて保存したい。
(001.jpeg,002.jpeg,003.jpeg,004.jpeg,007.jpeg,008.jpeg,010.jpeg,011.jpeg,012.jpeg,015.jpeg)
※保存先はローカルの適当な場所(例:C:\Users\test\Pictures)
【作成中のVBA】
---
Sub 画像保存()
Dim sSavePath As String
Dim gdipRet As GDIPlusStatusConstants
Dim myStdPicture As StdPicture
ActiveSheet.Shapes.Range(Array("Picture 1")).Select
Application.Selection.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
Set myStdPicture = CreatePictureFromClipboard
'jpg保存するときはこの下の行を有効に(100ところを0~100に変更でクオリティ設定できる)
gdipRet = SavePictureJpg(myStdPicture, "C:\Users\test\Pictures\001.jpg", 100)
End Sub
---
【質問内容】
上記VBAですと、実行することで、001.jpgしか保存されない状況です。
1回のVBA実行で、1,2,3,4,7,8,10,11,12,15全てのイメージを個別に名前を付けて保存するには、
(001.jpeg,002.jpeg,003.jpeg,004.jpeg,007.jpeg,008.jpeg,010.jpeg,011.jpeg,012.jpeg,015.jpeg)
VBAの記述をどう修正すべきかご教示頂きたく存じます。
何卒、宜しくお願い申し上げます。
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
' ' ///
以下関数での保存が利かなくなりました。所々修正してみます。
・CreatePictureFromClipboard() 関数
・SavePictureJpg() 関数
ご教示いただきまして、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 化学 結晶場理論で真空状態から例えば8面体配位でt2gの安定化の実験and/or理論的証拠って? 1 2023/05/02 22:20
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- デスクトップパソコン 昨日からpcがブルースクリーン後にeg modeの画面になります。電源など全て抜いて、1日置いて起動 5 2022/04/27 06:58
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- 楽器・演奏 Schecter シェクター エレキギター 廉価版 3 2022/03/23 17:00
- 工学 自然放出と放出光スペクトル 1 2022/09/04 23:04
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- Excel(エクセル) 【vba】日付の形式が勝手に変わってしまう。 1 2022/09/29 10:54
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自分の左隣のセル
-
文字列から英数字のみを抽出す...
-
SUMIF関数で、「ブランク以外を...
-
セルを結合した時のエクセル集...
-
excelで、空白を除いてデータを...
-
同一セル内の重複文字を削除し...
-
エクセルで特定のセル内にだけ...
-
エクセルで、指定の値よりも大...
-
エクセル1行おきのセルを隣の...
-
EXCEL-同じ組み合わせになった回数
-
EXCELのcountif関数での大文字...
-
何時から何時までを○○、何時か...
-
エラー「#REF」の箇所を置き換...
-
エクセルでエンターを押すと任...
-
Excelで日付が入っていたら金額...
-
エクセルに入力後、別シートの...
-
EXCELでマイナス値の入ったセル...
-
エクセルで年月日から月日のみへ
-
エクセルで、A2のセルにA3...
-
substitute関数についての質問です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
自分の左隣のセル
-
SUMIF関数で、「ブランク以外を...
-
文字列から英数字のみを抽出す...
-
excelで、空白を除いてデータを...
-
セルを結合した時のエクセル集...
-
EXCELのcountif関数での大文字...
-
エクセルで特定のセル内にだけ...
-
エクセルで、指定の値よりも大...
-
エクセル1行おきのセルを隣の...
-
同一セル内の重複文字を削除し...
-
EXCELでマイナス値の入ったセル...
-
エクセルで、A2のセルにA3...
-
エクセルで年月日から月日のみへ
-
条件付き書式の色付きセルのカ...
-
週の労働時間を計算するエクセル
-
エクセルに入力後、別シートの...
-
【Excel】4つとばしで合計する方法
-
Excelで大量のセルに一気に関数...
-
エクセル関数またはVBAについて
-
エラー「#REF」の箇所を置き換...
おすすめ情報