
PowerPoint上の全文字列をExcelに出力するPowerPointマクロは作成できたのですが、シェイプのインデックス順に出力してしまいます。
レイアウト通りに貼り付ける際はどう変更すればいいのでしょうか
Excel VBAでコードを入力しました
こちらのHPを参考にしました
[インストラクターのネタ帳]より
PPTファイル上の全文字列をExcelに出力するPowerPointマクロ
https://www.relief.jp/docs/018395.html
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
#1です
Excelで並び替えするのが簡単ですが
PowerPoint VBAでExcelを操作するのは難しいかも知れませんね
ご質問にある参考サイトのコードで取得しているとの事ですので少し改造して配列でデータと.Top Pointを受け取り.Top Pointで並び替え、Slide番号で並び替えを行い 出力するとSlide番号順で上部にある順になると思います
Sub test_01()
Dim xls As Object 'Excel.Application
Dim sld As Slide
Dim shp As Shape
Dim txt As String
Dim i As Long 'Excelの行番号
Dim n As Long
Set xls = CreateObject("Excel.Application")
With xls
.Visible = True
.workbooks.Add
.Range("A1").Value = "スライド番号"
.Range("B1").Value = "シェイプ名"
.Range("C1").Value = "文字列"
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If shp.HasTextFrame Then
n = n + 1
End If
Next shp
Next sld
ReDim Arr(n - 1, 3)
i = 0
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
If shp.HasTextFrame Then
Arr(i, 0) = sld.SlideNumber
Arr(i, 1) = shp.Name
'垂直タブ・キャリッジリターンをExcelの改行に置換
txt = shp.TextFrame.TextRange.Text
txt = Replace(txt, Chr(11), vbLf)
txt = Replace(txt, vbCr, vbLf)
Arr(i, 2) = txt
Arr(i, 3) = shp.Top * 1 / 72 * 2.54
i = i + 1
End If
Next shp
Next sld
Call bubble_sort(Arr, 3)
Call bubble_sort(Arr, 0)
.Range("A2", .Cells(UBound(Arr, 1) + 2, UBound(Arr, 2))).Value = Arr
End With
Set xls = Nothing
End Sub
Sub bubble_sort(ByRef argAry() As Variant, ByVal keyPos As Long)
Dim vSwap As Variant
Dim i As Integer
Dim j As Integer
Dim k As Integer
For i = LBound(argAry, 1) To UBound(argAry, 1)
For j = LBound(argAry) To UBound(argAry) - 1
If argAry(j, keyPos) > argAry(j + 1, keyPos) Then
For k = LBound(argAry, 2) To UBound(argAry, 2)
vSwap = argAry(j, k)
argAry(j, k) = argAry(j + 1, k)
argAry(j + 1, k) = vSwap
Next
End If
Next j
Next i
End Sub
shp.Topは出力していません
ExcelVBAの方が私的には簡単かな
参考サイト
[インストラクターのネタ帳]より
PPTファイル上の全文字列をExcelに出力するPowerPointマクロ
https://www.relief.jp/docs/018395.html
エクセルの神髄 鵜原パソコンソフト研究所
2次元配列の並べ替え
https://excel-ubara.com/excelvba5/EXCELVBA229.html
こちらのコードを使わせていただき、無事反映することができました。わかりにくい説明の仕方で申し訳ありません…
今後の勉学のために使わさせていただきます
No.3
- 回答日時:
こんにちは
「レイアウト通り」の意味がいろいろに解釈できるので、考え方をいろいろ・・
◇文字通り「レイアウト通り」にしたい場合
セルに出力するのでは位置指定に無理がありますので、そのままShapeでコピペするのが簡単です。
手操作で言えば、PPTのページで全選択、コピー(Ctrl+A,cTRL+C)、エクセル上でペースト(Ctrl+V)で行えば、上下左右前後の位置関係もそのままコピペできます。
これと同じことを行えば良いでしょう。
テキストのみを残したいのなら、テキストを含むshapeだけをコピーするか、あるいは、まとめて全部コピペしてしまってから、ご提示のサイトでテキストを拾っているのとは逆に、テキスト以外を削除すれば宜しいでしょう。
>文字列を上から最初に貼り付けるというふうにしたいです
◇表示上の上下方向(=前面・背面ではない)の順序ををセルの行に反映して貼り付けたい場合
レイアウトはそのままではなく、上記の順序だけを守りたいというのであれば、PPTのShapeのTopプロパティで文書ボックスの上下方向の位置を取得できます。
(上端の位置になるので、中央の位置で判断するのなら「+.Height/2」した値で評価すれば良いでしょう。)
https://learn.microsoft.com/ja-jp/office/vba/api …
このTopの値でソートして、順にエクセルに書き出せば良いのですが、VBAでのソートは面倒なので・・
例えば、D列にTopの値を併せて書き出すようにしておいて、1ページ分の出力が終わったら、D列をキーにエクセルのシート機能でソートすればTopの順になります。
並べ替えが終わったら、D列の値は削除すれば良いでしょう。
>文字列を上から最初に貼り付けるというふうにしたいです
◇表示上の前後関係(=上下ではない)の順序ををセルの行順に反映して貼り付けたい場合
PPT上で、文字列を重ねて前後に表示していることは少ないと思いますので、このケースはご質問の趣旨ではないのかとも思いますが・・・
PPTの Shape のインデックスは、通常、背面にあるものから順になるようになっています。
ですので、普通にループすると背面にあるものから順に処理されます。
これを、前面からの順にしたいのであれば、単純に順序を逆転すればよいですね。
For Each ~~
とする代わりに
For i = shapes.Count To 1 Step -1
のようなループにして、shapes(i)に対して処理すれば、逆順にすることが可能です。
別法として、通常のループで書き出してから、エクセル上で逆順に並び替えるいう方法も考えられますけれど・・
No.2
- 回答日時:
PowerPoint上の全文字列をExcelに出力する際に、シェイプのインデックス順ではなく、レイアウト通りに貼り付けるためには、マクロのコードを一部変更する必要があります。
以下に具体的な手順を示します。マクロコード内の「For Each shp In ActivePresentation.Slides(i).Shapes」という行を、「For Each shp In ActivePresentation.Slides(i).Shapes.Range(Array(ppPlaceholder)).Placeholders」と置き換えます。これにより、プレースホルダーのみが対象となります。
コード内の「With ws.Cells(R, 1)」という行を、「With ws.Cells(ActivePresentation.Slides(i).Shapes.Placeholders(1).Top, ActivePresentation.Slides(i).Shapes.Placeholders(1).Left)」に変更します。これにより、プレースホルダーの位置情報を取得してセルに書き込むことができます。
コード内の「R = R + 1」を削除します。これにより、新しいセルに移動せずに次のプレースホルダーにデータを書き込むことができます。
以上の変更を行うことで、プレースホルダーのレイアウト通りに文字列をExcelに出力することができます。ただし、この方法はプレースホルダーを基準にしているため、プレースホルダーがない場合やレイアウトが複雑な場合にはうまく機能しない可能性があります。必要に応じてコードを修正してください。
なお、上記の手順は参考サイトのコードをベースにしたものであり、正確な動作確認は行っておりません。変更を加える際には注意して実施してください。
No.1
- 回答日時:
>レイアウト通りに貼り付ける際はどう変更すればいいのでしょうか
ご質問の回答にはならないかも知れませんが
>レイアウト通り とは? Z方向 N方向?
インデックス順でも取得できているのなら Excel側でShape名などを対象に並び替え処理を行う方が簡単かもしれませんね
配置とShape名の関連が無いと意味ないですかね
そのような場合は少し工夫をして
取得時にSlide番号とShape.Topを同時に取得してその列で並び替え処理などが簡単な方法だと思います(上からになってしまいますがZ)
For Each shp In sld.Shapes
=shp.Top
PowerPoint上のShape名、Shapeインデックスを予め順序良く変えて置くとか・・・もあるけれどどうでしょう
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) PowerPoint VBA で画像の鮮明度を変更する方法がわかりません 2 2023/03/24 13:34
- Visual Basic(VBA) エクセルVBA 4 2022/05/14 00:51
- Visual Basic(VBA) excelにて、特定の列に数字入力してあれば、入力してある行コピーして 別ファイルに張り付ける 2 2022/08/11 05:33
- PowerPoint(パワーポイント) ExcelのグラフをPowerPointに貼り付けした際にデータテーブルの小数点以下を削除したいです 2 2023/02/28 19:46
- Excel(エクセル) マクロVBA別Excelブックにデータ転記 2 2022/07/10 23:35
- Word(ワード) office 2021へ自分用のクイックアクセスとマクロをコピーしたい 2 2023/03/11 21:15
- その他(Microsoft Office) https://tonari-it.com/outlook-vba-getappointment/ 1 2022/11/20 19:05
- PowerPoint(パワーポイント) PowerPointでプログラミングの資料を綺麗に作る方法 2 2022/12/03 05:45
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
プログラムについての質問です...
-
4Kの外部モニターに出力すると...
-
VBでステッピングモーターを動...
-
Accessのテーブルからcsv出力す...
-
COBOLで可変長ファイルの出力に...
-
標準出力の上書き
-
1ヶ月前の日時を取得
-
C#でアクセス権限の取得方法が...
-
printfとputcharの違いは
-
NSString文字列をprintfで出力...
-
1〜50まで順に数字を入力し、3...
-
cout と cerrの違い
-
CRC16計算について
-
クリスタルレポート8でのFormu...
-
クリスタルレポートで印刷時に...
-
ExcelマクロでIEのHP上のダウン...
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
コンセントの電力は入力と出力...
-
センサーのタンパー出力について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
PD充電器について
-
cout と cerrの違い
-
スマホ充電器購入にあたり
-
Accessのテーブルからcsv出力す...
-
MMDでavi出力が出来ない
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
TV出力ポートをOFFにすれば良い...
-
COBOLのMOVEで桁数が異なる場合
-
VBAでテキスト出力時のスペース...
-
ACCESS クエリ→フォーム...
-
coutで出力した文字を消去する...
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
Windows Formアプリからコンソ...
-
コンセントの電力は入力と出力...
-
C#でアクセス権限の取得方法が...
-
【VBA】PDFを2in1で出力したいです
おすすめ情報
レイアウト通りについてです
PowerPointに入力した文字列を上から最初に貼り付けるというふうにしたいです