三流君 ken3のmemo置き場

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

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

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

マクロ パワポのExcelリンクを現在の場所に更新したい Shape.LinkFormat.SourceFullNameを現在位置に更新する

マクロ・VBAでリンク情報 Shape.LinkFormat.SourceFullName を現在位置に更新する
パワポExcelリンクを現在の場所に自動更新したい
ペアで同じ位置にコピペしたのにリンク先がコピー前の位置なので自動変更したい

リンク貼り付けされたパス

マクロ パワポのExcelリンクを現在の場所に更新したい ペアで同じ位置にコピペしたのにリンク先がコピー前の位置なので自動変更したい - YouTube
https://youtu.be/OBDI3ZnKZoE
目次
00:00 やりたいこと
02:07 1.手動更新
04:17 2.Excelマクロで自動更新してみる
12:56 3.終わりのあいさつ で ミスに気が付く
15:25 4.PowerPoint VBAでリンクのを更新するように変更する
21:22 Splitでパスを分解 配列最後をUBound
27:34 テストデータ 複数のExcel表をリンクする
31:11 Excel複数リンクの総合テスト
33:03 パワポマクロにコードを貼り付ける
38:32 簡単なコードの説明

#パワーポイント #エクセル #リンク更新 #自動更新
#マクロ #VBA #PowerPointVBA #ExcelVBA
#デバッグ #Debug
#LinkFormat #SourceFullName

0.やりたいこと

キッカケは知恵袋の質問
detail.chiebukuro.yahoo.co.jp

上記質問を勝手に妄想して、処理を勘違いで作ってしまった・・・

妄想した、テスト処理。

2022年
Excelのグラフを作り、パワポにリンク貼り付けしました。
ExcelDATA更新後、保存。パワポも更新。

2023年
上記ファイル2つを2023年のフォルダーにコピー・複製しました。
ExcelDATA更新後、保存。
パワポのグラフも更新するが、
グラフデータのリンクが2022のままで、更新されません。涙・・・


1.手動更新
グラフやリンクの数が少なければ、年一回の作業なら、
手動で更新するのもアリかなぁ。
ぉぃぉぃ、質問は自動なのに、手動から説明かよ・・・

1.1 ファイルへのリンク編集
ホームメニューの ファイル から
情報 を選択
右下に ファイルへのリンク編集 があるので、ここを選択

1.2 リンク元の編集
リンク元の編集で、ペアでコピーしたExcelファイルを選択します

↑だから、これが、複数あると手間だから、自動でやりたいんだってば


2.マクロで自動更新してみる

一回だけリンク更新でマクロを使用してみます。

2.1 ペアでファイルを開きます

2.2 Excelでマクロを一回実行させます

表示・マクロで何か名前を入れて、
下記のマクロコードをコピーします。Excelで実行します

'アクティブなパワポを捕まえて、
'そのスライド内のグラフリンクを
'このブックにする

'ここからExcelのマクロで1回実行する
    Dim ppApp As Object   'PowerPoint.Application

    On Error Resume Next  '取得エラー時に次へ
    Set ppApp = GetObject(, "PowerPoint.Application")
    On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意

    If ppApp Is Nothing Then  '上↑で、パワポアプリを受け取れなかったら
        MsgBox "パワポを取得できません。プレゼンスライドを開いてから、再テストしてね"
        Exit Sub
    End If


    Dim objSLIDE As Object 'PowerPoint.Slide
    Dim objShape As Object 'PowerPoint.Shape 'パワポのシェイプ、テキスト、図形ほか
    Dim objCHART As Object 'PowerPoint Shape Chart ※グラフ
    
    For Each objSLIDE In ppApp.ActivePresentation.Slides 'スライドのループ
        For Each objShape In objSLIDE.Shapes '図形やテキスト、シェイプの中からグラフを探す
            '.HasChart で判断
            If objShape.HasChart = msoTrue Then 'グラフなら
                Set objCHART = objShape.Chart  'チャートをセット
                '念のため、.IsLinked リンクか聞く
                If objCHART.ChartData.IsLinked = True Then
                    'ここで、リンクをセット ThisWorkbook.FullNameが自分自身のなまえだった・・
                    objShape.LinkFormat.SourceFullName = ThisWorkbook.FullName
                    objShape.LinkFormat.Update '.LinkFormat.Updateも忘れないでね
                End If
            End If
        Next
    Next

    MsgBox "処理終了、パワポのスライドを確認してください"
'↑ここまでをコピー

2.3 グラフの更新を確認します
パワポのグラフを確認します。
忘れないで、保存してね・・・

2.4 Excelを上書き保存します。
ここで、マクロが保存されないよ・・

Excelが親切に言ってくるけど、そのまま保存してください。
※今回使い捨てなので And データファイルをマクロ付きにすると、
 他の人に渡すとき、いろいろとあるので、マクロ有効ブックにしない。


3.終わりのあいさつ

と、
こんな感じで、使い捨てマクロでリンクを更新してみました。

If objCHART.ChartData.IsLinked = True Then
   'ここで、リンクをセット ThisWorkbook.FullNameが自分自身のなまえだった・・
   objShape.LinkFormat.SourceFullName = ThisWorkbook.FullName

↑ ThisWorkbook.FullName ...
僕は、Excelパワポがペアとは言ってないよ・・・
えっ、永遠のパートナーカップルじゃなくて、二股?しているの?

ふざけないでください、
各担当者にExcelでデータ作成依頼、
その提出されたExcelデータを会議資料としてなので、

横浜販売DATA.xlsx
名古屋販売DATA.xlsx


博多販売DATA.xlsx

から、グラフをコピーしてます
※各地区の出張先の飲み屋に恋人がいるので、、、

パワポ1 : Excel複数の時、そんなパターンもあるなぁ・・・と思いつつ、
逃げるように失礼します。

   'ここで、リンクをセット ThisWorkbook.FullNameが自分自身のなまえだった・・
   objShape.LinkFormat.SourceFullName = ThisWorkbook.FullName

↑を手抜きじゃなく、
.path を 旧パスに置き換えるように作らないとね。

アレンジして使ってみてください。


最後にとんでもないミスをやらかしたので
12:56 3.終わりのあいさつ で ミスに気が付く
↑ははは、仕様の勘違い・・これは、ダメだよね・・・

反省して、勢いで
最後まで作ってみた・・・解決のヒントとなれば幸いです・・・

4.リンクの表を更新するように変更する
15:25 4.PowerPoint VBAでリンクのを更新するように変更する

パワポとエクセルファイルをコピー後、
パワポファイルを開きます。
表示・マクロで何か名前を入れて、
下記のマクロコードをコピーします。実行します。

'ここからPointPointマクロに貼り1回実行する

    Dim objSLIDE As PowerPoint.Slide
    Dim objShape As PowerPoint.Shape 'パワポのシェイプ、テキスト、図形ほか
    Dim objCHART As PowerPoint.Chart
    
    Dim strLINK As String
    Dim strNEWNAME As String
    Dim strWORK As Variant
    Dim n As Long
    
    For Each objSLIDE In ActivePresentation.Slides 'スライドのループ
        For Each objShape In objSLIDE.Shapes '図形やテキスト、シェイプの中からグラフを探す
            'LinkFormat.SourceFullName で判断
            strLINK = "エラーです"
            On Error Resume Next  '取得エラー時に次へ
            strLINK = objShape.LinkFormat.SourceFullName
            On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意
            
            '↑のエラーを判断
            If strLINK <> "エラーです" Then 'リンクアリのシェイプなら
                Debug.Print objShape.Name, objShape.LinkFormat.SourceFullName
                
                strWORK = Split(objShape.LinkFormat.SourceFullName, "\") '\で区切る
                n = UBound(strWORK)  '配列の最後の値
                strNEWNAME = ActivePresentation.Path & "\" & strWORK(n)
                'Pathを更新する
                objShape.LinkFormat.SourceFullName = strNEWNAME
                objShape.LinkFormat.Update '.LinkFormat.Updateも忘れないでね
            End If
        Next
    Next

    MsgBox "処理終了、パワポのスライドを確認してください"
'↑ここまでをコピー

youtu.be
https://youtu.be/OBDI3ZnKZoE
目次
00:00 やりたいこと
02:07 1.手動更新
04:17 2.Excelマクロで自動更新してみる
12:56 3.終わりのあいさつ で ミスに気が付く
15:25 4.PowerPoint VBAでリンクのを更新するように変更する
21:22 Splitでパスを分解 配列最後をUBound
27:34 テストデータ 複数のExcel表をリンクする
31:11 Excel複数リンクの総合テスト
33:03 パワポマクロにコードを貼り付ける
38:32 簡単なコードの説明


関連する過去記事:
ken3memo.hatenablog.com

Ken3 ホームページ 目次

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

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



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