質問
2014年6月13日金曜日 3:10
お世話になっております。arubi_momoと申します。
前回の続きの質問となってしまうのですが、質問内容が異なるため新しく投稿させていただきます。
環境はWindows7 64bit、Excel2010を使用しています。
SheetAに、TSV形式のテキストファイルが、パッケージオブジェクト(OLEObject)として貼りついている状態なのですが、マクロを実行した際に、テキストファイルの内容をSheetBに表示させたいのです。
データを読み込む方法として、パッケージオブジェクトを右クリック→プロパティで表示される、ファイルパスを取得して読込を行おうかと考えているのですが、OLEObjectに用意されているプロパティではそれらしい情報は得られなそうで、行き詰ってしまいました。
ファイルパスの取得方法について、ご教示いただければと思います。
何卒、よろしくお願いいたします。
すべての返信 (4)
2014年6月15日日曜日 14:17 ✅回答済み | 1 票
こんな?(8.1;Excel2013でテスト)
Option Explicit
Sub Test1()
Dim sh As Worksheet
Set sh = ThisWorkbook.ActiveSheet
sh.OLEObjects.Add Filename:="C:\Test\a.tsv"
End Sub
Sub Test2()
Dim sh As Worksheet
Dim oo As OLEObject
Set sh = ActiveSheet
If (sh.OLEObjects.Count = 0) Then
Exit Sub
End If
Set oo = sh.OLEObjects.item(1)
If (oo.OLEType <> XlOLEType.xlOLEEmbed) Then
Exit Sub
End If
If (oo.progID <> "Package") Then
Exit Sub
End If
Dim sha As New Shell32.Shell 'Microsoft Shell Control And Automation参照
Dim fol As Shell32.Folder2
Dim item As Shell32.FolderItem
Dim fso As New FileSystemObject 'Microsoft Scripting Runtime参照
Dim tempFolderPath As String
tempFolderPath = fso.GetSpecialFolder(TemporaryFolder) 'テンポラリフォルダのパス
tempFolderPath = fso.BuildPath(tempFolderPath, fso.GetTempName())
Call fso.CreateFolder(tempFolderPath) '作業用の一時フォルダを作成
Set fol = sha.Namespace(tempFolderPath)
Set item = fol.Self '一時フォルダの操作用
oo.Copy 'クリップボードにコピー
item.InvokeVerb ("paste") '一時フォルダへ貼り付け
If (fol.Items.Count > 0) Then
Dim file As Shell32.FolderItem
Set file = fol.Items.item(0) '貼り付けられたファイル
'ここで好きなようにファイルを処理する
Dim stream As TextStream
Dim text As String
Set stream = fso.OpenTextFile(file.Path, ForReading, False)
text = stream.ReadAll()
MsgBox text
Call stream.Close
End If
Call fso.DeleteFolder(tempFolderPath, True) '一時フォルダを削除
End Sub
#クリップボード内のバイナリや、XLSXをZIP解凍して\xl\embedding内を調べて無理やりバイナリ解析するという方法は無茶だった…(やれないこともない)
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
2014年6月16日月曜日 2:33
gekkaさま
ご回答ありがとうございました。
ご提示いただいたコードでテキストデータの内容を取得することができたのですが、2点ほどわからないことがあり、勉強不足で大変恐縮ですがご教示いただければ幸いです。
1) オブジェクトのコピー→テンポラリフォルダへのペーストを行うと、一番最初のデータにオブジェクト情報のようなものが添付されます。一部文字化けしてしまうのですが、オブジェクトが持っていたパスやファイル名称などの情報だと思います。
2) コピー前のデータとコピー後のデータを比較すると、データの最後が一部切れてしまい、完全な形でコピーされません。例えば、50行のデータをコピーしたとすると、48行目の途中までしかコピーされていない状態です。もしかすると、1)のオブジェクト情報のサイズ分、最後のデータが削られているのではないかと考えています。
もし原因に心当たりありましたら、ご教示いただけると助かります。
大変恐縮ですが、よろしくお願いいたします。
2014年6月16日月曜日 15:57 | 1 票
以下の環境でテストしなおしてみた。
- × Vistax86;2003,7x86;2003
- ○ XPx86;2007,8.1x64;2010,8.1x64;2013
2007以降では正常に意図したとおりの動作をしました。(元と同じファイルが貼り付けられます)
2003では先頭にファイルパスがくっついて後ろが切れるファイルができました。おかしいファイルができる環境では、シート上のオブジェクトをマウスでコピーして、デスクトップなどに貼り付けしても同じようなファイルができます。
提示したコードでこちらの2007以降では正常動作ができているので、2010で発生しているのであれば、なにか他の要因もあるのかもしれません。
#2003環境には両方とも某Antivirusソフトやクリップボード監視セキュリティが入っているのでクリップボードが異常動作した可能性があるが、8.1;2013環境にも入っているんですよねぇ…
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
2014年6月19日木曜日 1:28
gekkaさま
お世話になっております。お;が遅くなり申し訳ありません。
わざわざテストまでしていただき、ありがとうございました。
色々と試してみたのですが、自分の力量不足でどうしても前述の事象を回避できなかったため、仕様自体を見直すこととなりました。
2007以降で正常動作するということは、やはりそれ以外の環境の要因があるようですね。。。時間のある時に自宅環境でもテストしてみて、同じ現象が発生するかどうか試してみようと思います。要因を見つけて、今後に生かしていきたいと思います。
ご教示いただき本当にありがとうございました。大変勉強になりました。
今後ともどうぞよろしくお願いいたします。