三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

PowerPoint UserForm イメージオブジェクトを使い図形の連続セット スタンプ処理もどき

パワポでスタンプ処理 UserForm イメージオブジェクトを使い連続で図形をセットする。
そんな処理を試作
仕組みは単純で、UserFormのイメージコントロールを使い、
イメージが押された位置にスタンプ図形シェイプをセットしてみました

知恵袋の質問
detail.chiebukuro.yahoo.co.jp
にチャレンジしてみました。

下記、いつもの あのあの イライラ 解説動画です。
youtu.be
https://youtu.be/fKNl6FX-h0A
目次
00:00 挨拶、やりたいこと
01:08 スタンプ処理実演
01:49 1.スライド1ページ目にスタンプをセット
02:52 2.UserForm1 に イメージコントロールを貼る
05:32 3.パワポのスライドを画像にして読み込む
07:42 4.クリックイベントで、スタンプをセットする
09:58 蛇足でクリック後に画像を更新する
12:02 コンボボックスでスタンプを選択する
15:11 セット位置のバグを探る・・・

準備
パワポスライド1ページ目に
スタンプ図形を用意
ハートや星など名前を付けてください。(配置 から)
ActivePresentation.Slides(1).Shapes("星").Copy
で使用しています。

UserFormに
Image1コントロールを640x360のサイズで作成
してから、テストしてください。


1.スライド1ページ目にスタンプをセット

星とハートをテストで作成
配置 で スタンプに名前を付ける


2.UserForm1 に イメージコントロールを貼る
マウスのクリック、DownのイベントでX,Yが取れるので、使用してみた

3.フォーム初期化時にパワポのスライドを画像にして読み込む
スライドをJPGへ落とし、利用する


4.イメージコントロールのクリックイベントで、スタンプをセットする
スライド1に用意したスタンプを.Copyして貼り付ける。
位置を再度調べる・・・


ソースコード UserForm1

Option Explicit

Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '図形のコピー 今回はスライド1から固定でテスト
    'ActivePresentation.Slides(1).Shapes("星").Copy
    ActivePresentation.Slides(1).Shapes("ハート").Copy
    
    '現在のスライドPage
    Dim p As Integer
    p = ActiveWindow.Selection.SlideRange.SlideIndex
    
    'pページに貼り付け
    Dim shpR As ShapeRange
    Set shpR = ActivePresentation.Slides(p).Shapes.Paste
    
    Dim shp As Shape
    Set shp = shpR(1)  '↑.PasteでShapeRangeが返るのでその(1)一番目

    '貼り付け位置の調整
    '1280x720を元だとすると、
    '640x360 のイメージエリア と ズーム倍率
    shp.Left = Int(X * (ActiveWindow.Width / 640))
    shp.Top = Int(Y * (ActiveWindow.Height / 360))
    '正しい位置にセットされません、↑失敗してます、アレンジ、修正して使ってください。

End Sub

Private Sub UserForm_Initialize()
    '初期処理でスライド画像を作り、imgコントロールへ読み込む
    
    'File名を作る
    Dim strPATH As String   '保存場所 現在と同じPATHにしたい、ネットワークファイル不可?
    Dim strFNAME As String  '出力ファイル名
    strPATH = ActivePresentation.Path  'パワポ保存場所パス
    strFNAME = strPATH & "\個別スライド.jpg"
    
    '現在のスライドPage
    Dim p As Integer
    p = ActiveWindow.Selection.SlideRange.SlideIndex
    
    'pページスライドのJPGを作る
    ActivePresentation.Slides(p).Export strFNAME, "jpg"
    DoEvents

    '作ったjpg↑をImage1にセット
    Me.Image1.Picture = LoadPicture(strFNAME)
    Me.Image1.AutoSize = False
    Me.Image1.PictureAlignment = fmPictureAlignmentTopLeft '0 左上端
    Me.Image1.PictureSizeMode = fmPictureSizeModeZoom   '3 縦横比
    DoEvents

End Sub

ソースコードをアレンジして、使ってみてください。
処理のヒントとなれば幸いです。


下記の動画内で、思い付きで修正したコードもよろしくお願いします。

Option Explicit

Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '図形のコピー 今回はスライド1から固定でテスト
    ActivePresentation.Slides(1).Shapes(ComboBox1.Value).Copy
    'ActivePresentation.Slides(1).Shapes("ハート").Copy
    
    '現在のスライドPage
    Dim p As Integer
    p = ActiveWindow.Selection.SlideRange.SlideIndex
    
    'pページに貼り付け
    Dim shpR As ShapeRange
    Set shpR = ActivePresentation.Slides(p).Shapes.Paste
    
    Dim shp As Shape
    Set shp = shpR(1)  '↑.PasteでShapeRangeが返るのでその(1)一番目

    '貼り付け位置の調整
    '1280x720を元だとすると、
    '640x360 のイメージエリア と ズーム倍率
    '失敗、あとで調べる・・・ActiveWindow.Widthではない
    shp.Left = Int(X * (ActiveWindow.Width / 640))
    shp.Top = Int(Y * (ActiveWindow.Height / 360))
    
    'セットした結果を更新
    Call 画像更新

End Sub

Private Sub UserForm_Initialize()
    '初期処理でスライド画像を作り、imgコントロールへ読み込む
    
    ComboBox1.AddItem "星"
    ComboBox1.AddItem "ハート"
    ComboBox1.AddItem "鈴木"
    ComboBox1.AddItem "矢印上"
    
    '初期表示
    Call 画像更新

End Sub

Private Sub 画像更新()

    'File名を作る
    Dim strPATH As String   '保存場所 現在と同じPATHにしたい、ネットワークファイル不可?
    Dim strFNAME As String  '出力ファイル名
    strPATH = ActivePresentation.Path  'パワポ保存場所パス
    strFNAME = strPATH & "\個別スライド.jpg"
    
    '現在のスライドPage
    Dim p As Integer
    p = ActiveWindow.Selection.SlideRange.SlideIndex
    
    'pページスライドのJPGを作る
    ActivePresentation.Slides(p).Export strFNAME, "jpg"
    DoEvents

    '作ったjpg↑をImage1にセット
    Me.Image1.Picture = LoadPicture(strFNAME)
    Me.Image1.AutoSize = False
    Me.Image1.PictureAlignment = fmPictureAlignmentTopLeft '0 左上端
    Me.Image1.PictureSizeMode = fmPictureSizeModeZoom   '3 縦横比
    DoEvents
    
    Me.Repaint  '再描画
    
End Sub

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)