• 締切済み

Excel 埋め込みオブジェクトのファイル名取得

Excelファイルに挿入>オブジェクト>ファイルから ・・・ で選択し、埋め込んだオブジェクトのファイル名をVBAで 取得する事はできますか? 実際には上記のように手動ではなく、 Application.Dialogs(xlDialogInsertObject).Show , " ", , True でダイアログを表示し、ファイルを選択させています。 埋め込んだファイルがフォルダ階層が深かったりすると、 ファイル名まで表示されないので、ファイル名を取得して、 別のセルに入力するまでをVBAで処理をしたいと考えています。 既に埋め込まれているオブジェクトの名前を取得する、もしくは ダイアログで選択されたファイルの名前を取得する、ということが できるのであれば教えていただけますでしょうか?

  • yama_x
  • お礼率35% (308/875)

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です。元気を出して久しぶりにEMFをいじってみました。 絶対に文字数に収まらない構造体や、定数、API関数の宣言は載せてありません。好事家の方は、下記URL等から借用して下さい。 http://homepage2.nifty.com/nonnon/Win32Api/index.html 選択した埋め込みオブジェクトのパスを表示します。Win7Home(64bit)、xl2010(32bit)で試しています。 出来てみると簡単そうですが、数え切れない程Excelをハングアップさせた成果です(基礎が出来てない、下手くそとも言う)。適切な構造体を調べ、その中から目的のデータの位置を調べて取り出すのに苦労しました。 Sub getEmbededFilePath() Dim SrcData() As Byte '元のメタファイルの内容を格納するバッファ Dim SrcIdx As Long 'メタファイルからデータを取り出す位置を示す Dim hSrcMetaFile As Long '複製元メタファイルのハンドル Dim BufSize As Long 'SrcDataに格納されたメタファイルのサイズ Dim RecordHeader As emr 'メタファイルレコードのヘッダ 'EMR_EXTTEXTOUTWの個数だけ宣言する必要あり。使い回し不可。とりあえず大きめに宣言。 Dim emfTextRecord(10) As EMREXTTEXTOUT Dim emfText As emrtext Dim topEMREXTTEXTOUT As Long Dim extEmfText As String Dim byteEmfText() As Byte Dim i As Long Dim filePath As String '複製元メタファイルをクリップボードから取得 Selection.Copy If OpenClipboard(0) Then hSrcMetaFile = GetClipboardData(CF_ENHMETAFILE) hSrcMetaFile = CopyEnhMetaFile(hSrcMetaFile, vbNullString) CloseClipboard End If If hSrcMetaFile = 0 Then MsgBox "emf取得に失敗" Exit Sub End If 'メタファイルの内容を取得 BufSize = GetEnhMetaFileBits(hSrcMetaFile, ByVal 0, ByVal 0) ReDim SrcData(BufSize) BufSize = GetEnhMetaFileBits(hSrcMetaFile, BufSize, SrcData(0)) If BufSize = 0 Then MsgBox "GetEnhMetaFileBits failed!" Exit Sub End If SrcIdx = 0 i = 0 Do While SrcIdx < BufSize extEmfText = Space(255) 'レコードのヘッダを取得 MoveMemory RecordHeader, SrcData(SrcIdx), Len(RecordHeader) If RecordHeader.iType = EMR_EXTTEXTOUTW Then 'EMR_EXTTEXTOUTWの内容を、構造体emfTextRecord(AS EMREXTTEXTOUT )に取り込む MoveMemory emfTextRecord(i), SrcData(SrcIdx), RecordHeader.nSize '文字のレコードの先頭位置を保存 topEMREXTTEXTOUT = SrcIdx emfText = emfTextRecord(i).emrtext ReDim byteEmfText(emfText.nchars * 2) MoveMemory byteEmfText(0), SrcData(topEMREXTTEXTOUT + emfText.offString), emfText.nchars * 2 'StrPtr(extEmfText)やVarPtr(extEmfText)だとハングアップする 'byte配列を文字列に変換してくれる extEmfText = byteEmfText '合成したとき文字化けするので安直な対策。なおvbNullCharが入っているためではなさそう。 filePath = filePath & Application.WorksheetFunction.Clean(extEmfText) i = i + 1 End If SrcIdx = SrcIdx + RecordHeader.nSize Loop DeleteEnhMetaFile hSrcMetaFile MsgBox filePath End Sub ' メタファイルレコード列挙コールバック Public Function EnumFunc(ByVal hdc As Long, ByVal pHandles As Long, ByVal pRecord As Long, _ ByVal HandleNum As Long, ByVal pData As Long) As Long Dim eh As ENHMETARECORD 'EMR 'レコードのヘッダ 'レコードのヘッダをehに格納 RtlMoveMemory VarPtr(eh), pRecord, Len(eh) EnumFunc = 1 End Function

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

埋め込みファイルのアイコンをクリックして、図としてコピー/ピクチャで、emf形式でクリップボードにコピーします。昔MSのサイトでみつけたEMFビュワーに貼り付けて確認すると、フルパスが表示されました。(画像参照) EMF RECORDを確認すると、EMR_EXTTEXTOUTWというRECORDが6個ありますので、これが6段に分割されているパスに相当するのだと思います。これはバイナリエディタでも確認できました。後は、EMR_EXTTEXTOUTWを解読すれば可能でしょう。 http://msdn.microsoft.com/en-us/library/cc231081.aspx 元気のある方はやってみて下さい。 代替案としては、埋め込み自体をコードでやるのはいかがでしょうか。その際にパスを別セルに保存しておきます。 昔投稿した事がありますが、アイコン取得がムダに長いです。 http://okwave.jp/qa/q4353361.html 肝心なところを抜粋すると下記の通りです。ご参考まで。 Sub pasteFileObject(objFilePath As String, iconFilePath As String) Dim FSO Dim fileName As String Set FSO = CreateObject("Scripting.FileSystemObject") fileName = FSO.GetFileName(objFilePath) ActiveSheet.OLEObjects.Add(fileName:=objFilePath, Link:=False, _ DisplayAsIcon:=True, IconFileName:=iconFilePath, _ IconIndex:=0, IconLabel:=fileName).Select Set FSO = Nothing End Sub

関連するQ&A

  • ExcelVBA/ダイアログボックスで選んだファイルのファイル名を取得したい

    ExcelのVBAについて教えてください。 「ファイルを開く」の時に出てくるようなダイアログボックスを表示させ、そこで選択したファイルのフルパス+ファイル名を文字列形式で取得したいのですが、どのようにしたら良いでしょうか? 自分でヘルプファイルもある程度調べてみたのですが、よく分かりませんでした。 最終的には、ワークシート上に画像ファイルを挿入し、その作成日付をセルに表示するようなものを作りたいのですが、 Application.Dialogs(xlDialogInsertPicture).Show では、画像は挿入されるものの、挿入した画像のファイル名を取得できないので、日付が調べられないのです。 宜しくお願いします。

  • Excel VBAの組み込みダイアログについて

    ExcelのVBAの組み込みダイアログで、 Application.Dialogs(xlDialogInsertPicture).Show についてですが、ヘルプの組み込みダイアログボックス引数一覧をみると xlDialogInsertPicture file_name、filter_number とあります。 これは、ダイアログボックスの図の挿入で、ファイル名とファイルの種類の引数になると思いますが、 ダイアログボックスの右上に表示される、表示の縮小表示を選択することってできるのでしょうか?また、ファイルの場所の指定ってできるのでしょうか?どなたか、詳しい方いらっしゃいましたら教えてください。よろしくお願いいたします。

  • EXCELで複数のファイルを同じブック内で開きたい

    久しぶりにVBAを使用してやらせたいことがありますので、質問です。 複数のCSVファイルがあり、これを同じブック内のシートとして開くことは 出来ますでしょうか。 メニューから開くとして、それぞれのファイルを開くと、別々のブックにて開いてしまいます。 これを同じブックで、シート別に開かせたいのですが、出来ますでしょうか。 さらに、これをVBAでやりたいと考えております。 まず考えたのは、 ”Application.GetOpenFilename”です。 ただし、これを利用すると、別々のブックでしか開くことができませんでした。 次に考えたのが、”QueryTables.Add”を利用することです。 これだと、同一ファイル、同一シート内にデータを取り込むことができるので、 問題ないのですが、ファイル名を指定しなければなりません。 ファイルが変わるたびにVBAでパスを修正するのは大変ですので、 ”QueryTables.Add”のデータ取り込みでファイル選択ダイアログが開くような コードがあればよいと考えております。 ファイル選択のダイアログが開いて、そのファイルのパスが取得できるような コードにすれば、”QueryTables.Add”にてデータの取り込みができそうなのですが、 どうすればよいか思いつきません。 "Dialogs(wdDialogFileFind)"というものも見つけたのですが、うまくいきませんでした。 何か良い方法がありますでしょうか。 よろしくお願いします。 Dialogs(wdDialogFileFind)

  • エクセルでCSVファイルをユーザーに選択させたい

    エクセルVBAで、特定のフォルダ(C:\Data)に入っているCSVファイルをユーザーに選択させたいのです。 ただ、その際、選択肢に表示させるファイルに、例えば”企画“という文字列があることを条件にしたいのです。 組み込みダイアログであれば OpenFileName = Application.Dialogs(xlDialogOpen).Show("C:\Data\*企画*.csv") で大丈夫だと思います。 しかし、組み込みダイアログでは実際にそのファイルがエクセルで開かれてしまい、先頭の数字の0が消える等の不都合が起きてしまいます。 そのため、ファイルは指定させますが実際には開かずファイル名だけを取得する Application.GetOpenFilenameを使おうと思いました。 これでファイル名さえ所得できればあとは外部データの取り込みでCSVデータを取得できます。 ところが、 OpenFileName = Application.GetOpenFilename("C:\Data\*企画*.csv") はエラーになってしまいます。ネットで検索すると、Application.GetOpenFilenameではファイル名にワイルドカードは使えないようです。 このような場合、どのような方法をとればよいでしょうか?

  • エクセル ファイル名を指定して保存したい。

    現在次のようなマクロを最後に記述してそこでダイアログボックスに表示されるデフォルトのファイル名に都度日にちを手動入力して保存しています。 これを自動でファイル名を保存ダイアログボックスに表示できるようにしたいのですがどのような記述にしたらいいでしょうか ※ファイル名 A1に2016/9/15と入っている場合 「160915△△△△△△△..xlsm」と保存したい。 (「△△△△△△△」は固定) 現在使用中 Application.Dialogs(xlDialogSaveAs).Show Windows7/エクセル2013

  • ExcelVBAで、ColorIndexの取得

    エクセルのVBAで、組み込みダイアログを使用して、色の選択が出来ないか?奮闘しています。 Application.Dialogs(xlDialogColorPalette).Show を、使用することを考えたのですが、選択したカラーインデックスをどのように取得できるのか?判りません。どなたか詳しい方いらっしゃいましたら教えて貰えないでしょうか?よろしくお願いいたします。 エクセルのカラーパレットのインデックスナンバーの選択と取得が出来れば、どのような方法でもかまわないのですが・・・?

  • FileDialog オブジェクトでファイル名のみを取得

    FileDialog オブジェクトで返すオブジェクトを参照すると どうしてもファイルパスを取得する変数しか取得できません。 FileDialog オブジェクトで選択したファイルのファイル名のみを取得するにはどうしたらよいでしょうか。 ExcelVBAです。よろしくお願いします。

  • 保存ダイアログのファイルの種類を限定したい

    Excel 2003を使用しております。 VBAで以下のように保存ダイアログを表示させたときの 「ファイルの種類」をxlsだけにしたいのですが どうすればいいのでしょうか? Application.Dialogs(xlDialogSaveAs).Show

  • 「プリンタの設定」ダイアログボックスのプリンタを指定したい。

    Excel VBAにて以下のコードを書き,接続されているプリンタ一覧の表示と設定は出来るのですが、のダイアログに表示されるプリンタを指定した物だけにしたいのです。 Application.Dialogs(xlDialogPrinterSetup).Show ダイアログの組み込み定数「xlDialogPrinterSetup」は引数でプリンタ名を持てる筈なのですが、どう書いてもエラーになってしまいます。 Application.Dialogs(xlDialogPrinterSetup).Show arg1:="プリンタ名" Application.Dialogs(xlDialogPrinterSetup).Show ("プリンタ名") Application.Dialogs(xlDialogPrinterSetup).Show(arg1:="プリンタ名") やりたい事は接続されているマシンの一覧の中から一つのプリンタを選択肢、それだけの設定ダイアログを出したいのです。

  • エクセルVBAでファイルの選択(ZIP解凍後)

    エクセルVBAで Application.Dialogs(xlDialogOpen).Show や FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*")  を使い、ZIPファイル解凍後のエクセルのBOOKを選択させ、開こうとしています。 しかし、解凍後のエクセルファイルは見えるのですが、それを開こうとすると実行時エラー1004になってしまいます。もちろん手動では開くことができます。どのように対応すればよいのでしょうか?

専門家に質問してみよう