- 締切済み
Excel2007の「図の挿入」について
「ファイルにリンク」で貼り付けた図に対して、次のことをしたいと思っています。 (1) リンク先を変更したい (2) リンクを解除したい(図を埋め込みたい) Wordでは「配付準備」にある「ファイルへのリンクの編集」で出来ますが、 Excelでは、同様の機能と思われる「リンクの編集」に、「図」のリンク設定はありません。 「図の変更」で「挿入仕直す」といった方法もあるかと思いますが、図のサイズが 変わってしまう(縦横比も変わってしまう)ので、できれば使いたくありません。 しかも、大量に図が貼り付けてあるので、1つずつ設定する方法は避けたいです。 ご教授、よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- mitarashi
- ベストアンサー率59% (574/965)
#2です。 誰も見ていないと思いますが、MSXMLでリンクの書き換えをやってみました。ただし、普通にReplaceで書き換えれば十分だと思います。ファイルへのリンクの半角スペースが%20に置き換えられていますので、ご留意下さい。 なお、再圧縮して拡張子を変更してエクセルファイルに戻す際、解凍時生成されたフォルダでなく、その中のファイル群を圧縮しないと、エクセルで開く際にエラーになってしまいます。 Sub changeLink() Dim oXMLDom As Object, nodelist As Object, reader As Object, writer As Object Dim i As Long, j As Long Dim myNodeName As String Dim loadFile Dim externalFlag As Boolean Dim linkFilePath As String, originalLink As String, targetFilePath As String Dim filename As String, newPath As String, newURL As String Const tempFilePath As String = "c:\temp.xml" Set oXMLDom = CreateObject("MSXML2.DOMDocument") Set reader = CreateObject("MSXML2.SAXXMLReader") Set writer = CreateObject("MSXML2.MXXMLWriter") oXMLDom.async = False oXMLDom.validateOnParse = False oXMLDom.resolveExternals = False 'Worksheets(1)のみ対応 targetFilePath = "C:\Documents and Settings\hoge\デスクトップ\myUnzipFolder\xl\drawings\_rels\drawing1.xml.rels" loadFile = oXMLDom.Load(targetFilePath) newPath = "file:///C:\Documents and Settings\hoge\デスクトップ\Sample Pictures" Set nodelist = oXMLDom.DocumentElement.SelectNodes("//Relationship") If nodelist.Length > 0 Then For i = 0 To nodelist.Length - 1 For j = 0 To nodelist.Item(i).Attributes.Length - 1 myNodeName = nodelist.Item(i).Attributes(j).nodename Select Case myNodeName Case "Target" linkFilePath = nodelist.Item(i).Attributes.getNamedItem(myNodeName).NodeValue Case "TargetMode" If nodelist.Item(i).Attributes.getNamedItem(myNodeName).NodeValue = "External" Then externalFlag = True End Select Next j If externalFlag Then 'ここにリンクの書き換え 'スペースを%20に変更している filename = Right(linkFilePath, Len(linkFilePath) - InStrRev(linkFilePath, "\")) filename = Replace(filename, "%20", Chr(&H20)) newURL = newPath & "\" & filename newURL = Replace(newURL, Chr(&H20), "%20") 'Target属性の変更 Call nodelist.Item(i).setAttribute("Target", newURL) End If externalFlag = False Next i End If writer.indent = False ' writer.Encoding = "utf-8" '昔は指定しても機能しなかった。最近の状況は不明です。 writer.standalone = True Set reader.contentHandler = writer 'お約束 Call reader.putProperty("http://xml.org/sax/properties/lexical-handler", writer) oXMLDom.preserveWhiteSpace = False reader.Parse oXMLDom.XML Set oXMLDom = Nothing 'UTF-8に変換して保存 Call adoSaveText(tempFilePath, writer.output, "UTF-8") FileCopy tempFilePath, targetFilePath Set writer = Nothing Set reader = Nothing End Sub '======================================================== 'ADO.streamを使ってXMLDocumentをUTF-8で書き出す Private Function adoSaveText(filename, text, charset) Dim Stream Dim bin() As Byte Dim destBuf As String Set Stream = CreateObject("ADODB.Stream") destBuf = Replace(text, "UTF-16", charset) Stream.Type = adTypeText Stream.charset = charset Stream.Open Stream.WriteText (destBuf) 'BOM削除 Stream.Position = 0 Stream.Type = adTypeBinary Stream.Position = 3 bin = Stream.Read Stream.Close Stream.Open Stream.Write bin Stream.SaveToFile filename, adSaveCreateOverWrite Stream.Close End Function
- mitarashi
- ベストアンサー率59% (574/965)
当方xl2010ですが、VBEでshapeやDrawingObjectのメンバを探ってみたりしましたが、分かりませんでした。画像挿入の自動記録もきちんと記録できていない様です。Web検索してもこれはという情報に行き当たりません。 xl2007以降のエクセルのブックは、ZIP圧縮したXMLファイル群ですので、拡張子を.zipに変更し、解凍して探ってみました。 1.シートの画像情報はたとえばWorksheets(1)の分は\xl\drawings\drawing1.xmlにあります。 画像埋め込み+ファイルにリンクの箇所を抜粋すると、下記の様な内容でした。 <a:blip xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:embed="rId3" r:link="rId4"> 埋め込み画像のIdがrId3で、リンク情報がrId4である事を示しています。 2.これに対応するリンク情報はWorksheets(1)の分は\xl\drawings\_rels\drawing1.xml.relsにあります。 埋め込み・リンク形態別のAttributeは下記の様になっていました。 かならずしもrIdの番号順になっておらず、drawing1.xmlと対照する必要がありそうです。 ファイルへリンク Id:rId2 Target:file:///C:\Documents%20and%20Settings\All%20Users\Documents\My%20Pictures\Sample%20Pictures\Water%20lilies.jpg TargetMode:External デフォルト(画像を埋め込み) Id:rId1 Target:../media/image1.jpg ファイルへリンク+画像 Id:rId3 Target:../media/image2.jpg Id:rId4 Target:file:///C:\Documents%20and%20Settings\All%20Users\Documents\My%20Pictures\Sample%20Pictures\Winter.jpg TargetMode:External 3.実際の埋め込み画像データは全シート分が、\xl\mediaにあります。 以上から、 \xl\drawings\_rels\drawing1.xml.relsのリンク情報を書き換えてやれば、リンク先の対応が可能です。 また、埋め込み画像なら、\xl\mediaの画像ファイルを置換してやれば、画像の変更が可能です。 以上、あまり実用的で無い情報でした。 VBAで拡張子の変更~解凍~MSXMLで画像のリンク情報を取得するところまでやってみましたが、完成する日は来ないと思います。 もっとまともな方法をご存じの方は是非教えて下さい。
- ytsg
- ベストアンサー率58% (7/12)
「リンクの編集」で図のリンク元も設定しなおすことは出来ますよ。(リンク元ですよね?) セルのリンクと図のリンクが両方ある場合や、複数の図が同じブックの違う場所のリンクであっても、リンク元は1つしか表示されないので図のリンクが編集できるようには見えないのでは? 同じくリンクの解除も「リンクの編集」でできます。 ただ、上記に書いた理由で、同じブックからリンクしている複数の図を「図1は参照元を変えたいけど図2は元のまま」とか、 同じブックからリンクしているセルと図を「図のリンクは変更したいけど、セルのリンクは元のまま」 というような変更は「リンクの編集」できません。 そのような場合は図を選択して、数式バーに表示されているブック名やシート名を変更することができます。 ただし、この方法では1つずつ設定していかなければなりません。
補足
早速のご回答、ありがとうございます。 言葉足らずだったようですので補足させて下さい。 ここで言いたかった「図」とは、「画像ファイル(JPGなど)」のことです。 おっしゃるとおり、Excelのセルやグラフをリンクして貼り付けした場合には、 リンクの編集が出来ます。 ですが、画像ファイルを「ファイルにリンク」で挿入した場合には、 ブック内に他のリンクが存在しない場合、リボンの「リンクの編集」が グレーになってしまい、編集画面すら開くことが出来ません。 説明下手で申し訳ございませんがご理解いただけましたでしょうか。 よろしくお願い致します。