質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

1040閲覧

VBA でパワーポイントの画像形式を調べる方法

nathea

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2021/10/26 05:30

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nathea

2021/10/27 00:17

簡単ではなさそうですね. クリップボードに格納するにはshapeオブジェクト.copyで出来るのですが,それをどうやってファイルとして格納,展開出来るのか,まだ分かりません. もう少しトライしてみます. ありがとうございます.
cx20

2021/10/27 22:30 編集

> それをどうやってファイルとして格納,展開出来るのか,まだ分かりません. クリップボードデータを zip ファイルに出力するサンプルを書いてみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問