VBAプログラムを使用してパワーポイントに張付けてある写真画像の形式(JPG,PNG等)を取得するにはどうしたらよいのでしょうか,教えて下さい.
該当のソースコード
``VBA
Sub Abc()
Dim sld As Slide
Dim sh As Shape
For Each sld In ActivePresentation.Slides
For Each sh In sld.Shapes
If sh.Type = 13 Then '画像
ここにshの画像を取得する命令を入れたい
Else
End If
Next
Next
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
パワーポイントに張付けてある写真画像の形式(JPG,PNG等)を取得するにはどうしたらよいのでしょうか
簡単な方法は無さそうに思います。
Office の内部的には画像形式を記録しているらしく、クリップボードにコピーすると Art::GVML ClipFormat
形式のデータとして確認することが出来ました。(Art::GVML ClipFormat
の構造としては zip 形式の構造になっているようです。)
この情報をうまく取り出せれば、判定が行えるかもしれません。
■ Microsoft Office に貼り付けた画像からクリップボード経由で元解像度の画像を得る
https://seesaawiki.jp/w/kou1okada/d/Microsoft%20Office
<参考情報>
■ InsideClipboard - Nirsoft
https://www.nirsoft.net/utils/inside_clipboard.html
<追記(2021.10.28>
Art::GVML ClipFormat
形式のクリップボードデータを zip ファイルで出力するサンプルを書いてみました。
C:\TEMP 配下に clip1.zip のようなファイル名で保存するようにしてあります。必要に応じて変更下さい。
なお、このプログラムは自己責任でご利用下さい。
Win32 APIを使用しており、十分なテストも行っていない為、予期しないクラッシュ等が発生する可能性があります。
VBA
1Option Explicit 2 3Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long 4Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long 5Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long 6Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long 7Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long 8Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long 9Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long 10Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 11 12Private Function GetClipboardRawData(ByVal format As Long, bytes() As Byte) As Boolean 13 Dim hWnd As Long 14 Dim nSize As Long 15 Dim hClipMemory As Long 16 If OpenClipboard(0&) Then 17 hWnd = GetClipboardData(format) 18 If hWnd Then nSize = GlobalSize(hWnd) 19 If nSize Then hClipMemory = GlobalLock(hWnd) 20 21 If hClipMemory Then 22 ReDim bytes(0 To nSize - 1) As Byte 23 MoveMemory bytes(0), ByVal hClipMemory, nSize 24 Call GlobalUnlock(hWnd) 25 GetClipboardRawData = True 26 End If 27 EmptyClipboard 28 CloseClipboard 29 DoEvents 30 End If 31End Function 32 33Sub ClipboardToZip(ByVal format As Long, ByVal strZipFileName As String) 34 Dim bytes() As Byte 35 Dim result As Boolean 36 result = GetClipboardRawData(format, bytes) 37 38 Open strZipFileName For Binary As #1 39 Put #1, , bytes 40 Close #1 41End Sub 42 43Sub Main() 44 Dim sld As Slide 45 Dim sh As Shape 46 47 Dim format As Long 48 format = 50173 ' Art::GVML ClipFormat 49 50 Dim strOutputPath As String 51 strOutputPath = "C:\TEMP" ' 任意の出力先に変更下さい。 52 Dim strZipFileName As String 53 54 Dim n As Long 55 n = 0 56 For Each sld In ActivePresentation.Slides 57 For Each sh In sld.Shapes 58 If sh.Type = 13 Then 59 n = n + 1 60 ' 画像をクリップボードにコピー 61 sh.Copy 62 ' 出力先のファイル名を設定 63 strZipFileName = strOutputPath & "\clip" & n & ".zip" 64 ' クリップボードの内容をファイル出力 65 Call ClipboardToZip(format, strZipFileName) 66 End If 67 Next 68 Next 69End Sub
<参考情報2>
■ クリップボードのデータを取り出す方法
https://www.moug.net/tech/acvba/0020003.html
投稿2021/10/26 13:57
編集2021/10/27 22:30総合スコア4648
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/27 00:17
2021/10/27 22:30 編集