A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
もう誰も見ていないでしょうが、アイコンファイルを毎回作成しないように変更しました。
それでも、時間がかかるものはかかるので、パッケージ化が律速になっているのかもしれません。コメント削除して簡素化したので、CreateOlePictureも載せておきます。なにぶん切り貼りなので、詳しい方に解放漏れなどご指摘いただけると幸いです。<UserForm1>
'For Microsoft ListView Control, version 6.0
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim i As Long
Dim destRange As Range
Dim fileExtention As String
If TypeName(Selection) <> "Range" Then
MsgBox "最初の貼付先セルを選択しておいて下さい。"
Exit Sub
End If
Set destRange = Selection
Set destRange = destRange.Cells(1)
With Me
AppActivate Me.Caption
.ListView1.ListItems.Clear
If Data.Files.Count < 1 Then Exit Sub
For i = 1 To Data.Files.Count
destRange.Activate
fileExtention = getFileExtention(Data.Files(i))
If Dir(ThisWorkbook.Path & "\" & fileExtention & ".ico") = "" Then
Call extractIconToFile(Data.Files(i), ThisWorkbook.Path & "\" & fileExtention & ".ico")
End If
Call pasteFileObject(Data.Files(i), ThisWorkbook.Path & "\" & fileExtention & ".ico")
Set destRange = destRange.Offset(5, 0)
Next i
End With
End Sub
Private Function getFileExtention(fileName As String) As String
Dim Pos As Integer
Pos = InStrRev(fileName, ".")
getFileExtention = Mid(fileName, Pos + 1)
End Function
Private Sub UserForm_Activate()
With Me.ListView1
.OLEDragMode = 1
.OLEDropMode = 1
.View = 2
End With
End Sub
<Module1>
Sub Auto_Open()
Call showListView
End Sub
Sub showListView()
With UserForm1
.ListView1.Top = 0
.ListView1.Left = 0
.ListView1.Height = .InsideHeight
.ListView1.Width = .InsideWidth
End With
UserForm1.Show vbModeless
End Sub
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
<Module2>
Public Const PICTYPE_UNINITIALIZED = -1
Public Const PICTYPE_NONE = 0
Public Const PICTYPE_BITMAP = 1
Public Const PICTYPE_METAFILE = 2
Public Const PICTYPE_ICON = 3
Public Const PICTYPE_ENHMETAFILE = 4
Public Const S_OK As Long = &H0
Public Const E_NOINTERFACE = &H80004002
Public Const E_POINTER = &H80004003
Public Const E_INVALIDARG = &H80000003
Public Const E_OUTOFMEMORY = &H8007000E
Public Const E_UNEXPECTED = &H8000FFFF
Public Const MAX_PATH = 260
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const SHGFI_LARGEICON = &H0
Public Const SHGFI_SMALLICON = &H1
Public Const SHGFI_ICON = &H100
Public Const WS_CHILD = &H40000000
Public Const WS_VISIBLE = &H10000000
Public Const SS_ICON = &H3&
Public Const SS_REALSIZEIMAGE = &H800
Public Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Public Type PICTDESC_ALL
cbSizeOfStruct As Long
PicType As Long
hPicture As Long
hPALETTE As Long
Reserved As Long
End Type
Public Type PICTDESC_BMP
cbSizeOfStruct As Long
PicType As Long
hBitmap As Long
hPal As Long
End Type
Public Type PICTDESC_META
cbSizeOfStruct As Long
PicType As Long
hMeta As Long
xExt As Long
yExt As Long
End Type
Public Type PICTDESC_ICON
cbSizeOfStruct As Long
PicType As Long
hIcon As Long
End Type
Public Type PICTDESC_EMETA
cbSizeOfStruct As Long
PicType As Long
hEMF As Long
End Type
Private Type SHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * MAX_PATH
szTypeName As String * 80
End Type
Public Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (ByRef PicDesc As Any, ByRef RefIID As GUID, ByVal fPictureOwnsHandle As Long, ByRef IPic As StdPicture) As Long
Public Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" ( _
ByVal pszPath As String, _
ByVal dwFileAttributes As Long, _
psfi As SHFILEINFO, _
ByVal cbSizeFileInfo As Long, _
ByVal uFlags As Long) As Long
Public Enum PictureTypeConstants
vbPicTypeNone = 0
vbPicTypeBitmap = 1
vbPicTypeMetafile = 2
vbPicTypeIcon = 3
vbPicTypeEMetafile = 4
End Enum
Sub extractIconToFile(targetPath As String, iconFilePath As String)
Dim icn As StdPicture
Dim shinfo As SHFILEINFO
Dim lngImgHandle As Long
Dim pszPath As String
pszPath = targetPath
lngImgHandle = SHGetFileInfo(pszPath, _
FILE_ATTRIBUTE_NORMAL, _
shinfo, Len(shinfo), SHGFI_ICON Or SHGFI_LARGEICON)
Set icn = CreateOlePicture(shinfo.hIcon, vbPicTypeIcon)
SavePicture icn, iconFilePath
End Sub
Public Function CreateOlePicture(ByVal PictureHandle As Long, _
ByVal PictureType As PictureTypeConstants, _
Optional ByVal BitmapPalette As Long = 0, _
Optional ByVal MetaHeight As Long = -1, _
Optional ByVal MetaWidth As Long = -1, _
Optional ByRef Return_ErrNum As Long, _
Optional ByRef Return_ErrDesc As String) As StdPicture
Dim ReturnValue As Long
Dim PicInfo_BMP As PICTDESC_BMP
Dim PicInfo_EMETA As PICTDESC_EMETA
Dim PicInfo_ICON As PICTDESC_ICON
Dim PicInfo_META As PICTDESC_META
Dim ThePicture As StdPicture
Dim rIID As GUID
On Error Resume Next
Return_ErrNum = 0
Return_ErrDesc = ""
If PictureHandle = 0 Then
Return_ErrNum = -1
Return_ErrDesc = "Invalid bitmap handle"
ElseIf PictureType = vbPicTypeNone Then
Return_ErrNum = -1
Return_ErrDesc = "Invalid picture type specified."
ElseIf PictureType = vbPicTypeMetafile Then
If MetaHeight = -1 Or MetaWidth = -1 Then
Return_ErrNum = -1
Return_ErrDesc = "Invalid metafile dimentions specified."
End If
End If
With rIID
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
Select Case PictureType
Case vbPicTypeBitmap
PicInfo_BMP.cbSizeOfStruct = Len(PicInfo_BMP)
PicInfo_BMP.PicType = PICTYPE_BITMAP
PicInfo_BMP.hBitmap = PictureHandle
PicInfo_BMP.hPal = BitmapPalette
ReturnValue = OleCreatePictureIndirect(PicInfo_BMP, rIID, 1, ThePicture)
Case vbPicTypeIcon
PicInfo_ICON.cbSizeOfStruct = Len(PicInfo_BMP)
PicInfo_ICON.PicType = PICTYPE_ICON
PicInfo_ICON.hIcon = PictureHandle
ReturnValue = OleCreatePictureIndirect(PicInfo_ICON, rIID, 1, ThePicture)
Case vbPicTypeMetafile
PicInfo_META.cbSizeOfStruct = Len(PicInfo_BMP)
PicInfo_META.PicType = PICTYPE_METAFILE
PicInfo_META.hMeta = PictureHandle
PicInfo_META.xExt = MetaWidth
PicInfo_META.yExt = MetaHeight
ReturnValue = OleCreatePictureIndirect(PicInfo_META, rIID, 1, ThePicture)
Case vbPicTypeEMetafile
PicInfo_EMETA.cbSizeOfStruct = Len(PicInfo_BMP)
PicInfo_EMETA.PicType = PICTYPE_ENHMETAFILE
PicInfo_EMETA.hEMF = PictureHandle
ReturnValue = OleCreatePictureIndirect(PicInfo_BMP, rIID, 1, ThePicture)
End Select
If ReturnValue <> S_OK Then
GoTo ErrorTrap
End If
Set CreateOlePicture = ThePicture
Exit Function
ErrorTrap:
Return_ErrNum = ReturnValue
Select Case ReturnValue
Case E_NOINTERFACE
Return_ErrDesc = "The object does not support the interface specified in riid."
Case E_POINTER
Return_ErrDesc = "The address in pPictDesc or ppvObj is not valid. For example, it may be NULL."
Case E_INVALIDARG
Return_ErrDesc = "One or more arguments are invalid."
Case E_OUTOFMEMORY
Return_ErrDesc = "Ran out of memory."
Case E_UNEXPECTED
Return_ErrDesc = "Catastrophic Failure."
Case Else
Return_ErrDesc = "Unknown Error."
End Select
End Function
ご回答有難うございました.
詳細なマクロのソースを付けてくださっていますので,後で時間をかけて検討させていただきます.
歯が立つかどうかわかりませんが,トライしてみます.
まずは,有難うございました.
No.3
- 回答日時:
海外から、エクセルのシートにファイルをオブジェクトを幾つも貼り付けた資料が送られてくる事があります。
試しにやってみたところ、アイコンの表示のところではまってしまいました。1.UserFormにListViewControlを設けると、そこにエクスプローラから、複数選択してD&Dしたファイルのパスを取得できます。ListViewControlのコードは、そのバージョンにより微妙に異なり変更の必要がある様です。
2.ファイルオブジェクトの貼付は、#1さんの回答されている操作を自動記録するとヒントが得られます。
貼付位置を指定する項目はなく、カレントセルに貼付られます。
問題はその中のアイコンファイルの取得です。ここには得体の知れない場所のアイコンファイル名が入ったり、関連づけられているアプリケーションの実行ファイルが入ったりする場合がある様です。
3.上記の「得体の知れない」から、このアイコンファイルは一回限りの使い捨てではないかと考え、同じ名前で、中味を変えて複数のオブジェクトに使い回してみましたが問題なさそうでした。(画像はxlsファイル内に取り込まれていて、再読込されない)
4.ファイルが関係づけられているアプリケーションのアイコンを取得して、ファイルに保存するにはWindowsAPIを使用する必要があります。これは元々C++用に作られているので、VBAから使用するには面倒を伴います。(自分も切り貼りして、なんとか使えるレベルです)
5.割り切って、アイコンは無くても気にしなければ、1&2だけで話は済みます。或いは、使用するアプリケーションは決まっているでしょうから、それぞれに対応するアイコンファイルを予め作成しておいて、拡張子により使い分ける方法も考えられます。(通常は再読込されないので、ファイルオブジェクトを貼り付けたエクセルファイルだけを他の環境に移しても問題ない筈)
6.一応動いたソースを載せますが、当方のXL2000&Windows2000環境以外でも動くかどうかは疑問です。また、一部長いので、参照URLを参照下さい。そこから抜粋できる程度のスキルが無いと、アレンジできないと思います。
<Module1>
Sub Auto_Open()
Call showListView
End Sub
Sub showListView()
With UserForm1
.ListView1.Top = 0
.ListView1.Left = 0
.ListView1.Height = .InsideHeight
.ListView1.Width = .InsideWidth
End With
UserForm1.Show vbModeless
End Sub
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
<Module2>
'-- API宣言 ---
Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" ( _
ByVal pszPath As String, _
ByVal dwFileAttributes As Long, _
psfi As SHFILEINFO, _
ByVal cbSizeFileInfo As Long, _
ByVal uFlags As Long) As Long
'-- 定数・変数宣言 ---
Private Const MAX_PATH = 260
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const SHGFI_LARGEICON = &H0
Private Const SHGFI_SMALLICON = &H1
Private Const SHGFI_ICON = &H100 Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const SS_ICON = &H3&
Private Const SS_REALSIZEIMAGE = &H800
Private Type SHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * MAX_PATH
szTypeName As String * 80
End Type
'アプリケーションまたはファイル名のフルパスからアイコンを抽出して、指定ファイルに保存
Sub extractIconToFile(targetPath As String, iconFilePath As String)
Dim icn As StdPicture
Dim shinfo As SHFILEINFO
Dim lngImgHandle As Long
Dim pszPath As String
Const vbPicTypeIcon As Long = 3
pszPath = targetPath
'アイコンの情報を取得
lngImgHandle = SHGetFileInfo(pszPath, _
FILE_ATTRIBUTE_NORMAL, _
shinfo, Len(shinfo), SHGFI_ICON Or SHGFI_LARGEICON)
'取得したアイコン情報を保存するにはOlePictureに変換する必要がある
Set icn = CreateOlePicture(shinfo.hIcon, vbPicTypeIcon)
SavePicture icn, iconFilePath
End Sub
ただし、CreateOlePicture関数は下記、参考URLなどをご参照下さい。
'http://www.thevbzone.com/cResource.cls
<フォームモジュール>
UserForm1にはListViewControlのみがあります。
'Microsoft ListView Control, version 6.0
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim i As Long
Dim destRange As Range
If TypeName(Selection) <> "Range" Then
MsgBox "最初の貼付先セルを選択しておいて下さい。"
Exit Sub
End If
Set destRange = Selection
Set destRange = destRange.Cells(1)
With Me
AppActivate Me.Caption
.ListView1.ListItems.Clear
If Data.Files.Count < 1 Then Exit Sub
For i = 1 To Data.Files.Count
destRange.Activate
Call extractIconToFile(Data.Files(i), ThisWorkbook.Path & "\" & "temp.ico")
Call pasteFileObject(Data.Files(i), ThisWorkbook.Path & "\temp.ico")
Set destRange = destRange.Offset(5, 0)
Next i
End With
End Sub
Private Sub UserForm_Activate()
With Me.ListView1
.OLEDragMode = 1
.OLEDropMode = 1
.View = 2
End With
End Sub
No.2
- 回答日時:
>Excelのセルを,
画像はエクセルのセルの情報になるのでなく、エクセルのシートが台紙のようになって、乗っかるだけのようです。画像の大きさをエクセルのセル1つの大きさに合わせたり、セル左上隅の位置にあわすのはVBAでも出来ますが。
連続自動で画像の挿入であれば、VBA程度で何とかなりそうです。質問者が勉強したら。
ただセルの情報にするとするとなると根本的なエクセルの改変が必要なように思いますので議論の外でしょう。
>関連するファイルを,ドラッグ・アンド・ドロップで,埋め込みたいのです
これらはすべて高度なプログラムの技量が必要でしょう。
質問者は他人の作ったものがあり、使えればよいのでしょうが、もう少しエクセルに関して、勉強する必要があると思う。そのワリには高度なものを要求しているように思う。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- Excel(エクセル) Excel ヘルプの[ロック解除]、<c0>、</c0> の意味は何ですか? 1 2023/02/20 16:58
- Excel(エクセル) Excelで、あるセルだけ入力させたい、オートフィルターも使わせたい際のシートの保護 2 2023/02/23 15:14
- その他(データベース) Excel VBA 転記について 1 2022/04/20 16:55
- その他(Microsoft Office) OneDrive Personalについて 1 2022/08/02 18:25
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
- その他(Microsoft Office) Wordを変換してExcelに挿入 2 2022/07/04 23:59
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
これが怖いの自分だけ?というものありますか?
人によって怖いもの(恐怖症)ありませんか? 怖いものには、怖くなったきっかけやエピソードがあって聞いてみるとそんな感覚もあるのかと新しい発見があって面白いです。
-
集合写真、どこに映る?
あなたが集合写真を撮られるとき、画角のどのあたりにいることが多いですか? 私は振り返ってみると右の端にいることが多い気がします。
-
我が家のお雑煮スタイル、教えて下さい
我が家のお雑煮スタイル、教えて下さい! (お汁)味噌汁系? すまし汁系? (お餅)角餅? 丸餅? / プレーンなお餅? あんこ餅?
-
VBAでEXCELに埋め込んだPDFを開く方法
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルを閉じても開いている...
-
誤ってAdobe ReaderでZIPファ...
-
エクセルファイルをショートカ...
-
IEでファイルを開くと(txt形式...
-
フォルダアイコンの変更でpngを...
-
拡張子をtxtからdatに
-
CSV形式のファイルをワードパッ...
-
XLMファイルをメモ帳で開く...
-
Excelのセルに,PDFなどのフ...
-
ショートカット(Excel文書)を...
-
圧縮する時のアイコンを変える...
-
誤って変更した拡張子を元に戻...
-
JPGのアイコンがPHOTOSHOPのア...
-
保存したcsvがエクセルにな...
-
アイコンがちゃんと表示されない。
-
「開く」ダイアログなどでのフ...
-
ファイルアイコンを白紙にした...
-
jpg画像がIEで開いてしまう?
-
特定のファイルのみ別アプリケ...
-
ファイルを開くプログラムを元...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
拡張子をtxtからdatに
-
誤ってAdobe ReaderでZIPファ...
-
ファイルを閉じても開いている...
-
XLMファイルをメモ帳で開く...
-
エクセルファイルをショートカ...
-
フォルダアイコンの変更でpngを...
-
JPGのアイコンがPHOTOSHOPのア...
-
保存したcsvがエクセルにな...
-
アイコンがちゃんと表示されない。
-
ファイルアイコンを白紙にした...
-
誤って変更した拡張子を元に戻...
-
圧縮する時のアイコンを変える...
-
CSV形式のファイルをワードパッ...
-
Excelのセルに,PDFなどのフ...
-
ショートカット(Excel文書)を...
-
特定のファイルのみ別アプリケ...
-
DLLファイルを誤って関連付けて...
-
.pubファイルはどうやって開くの?
-
DLLファイルのアプリケーション...
-
PDFで受取ったファイルがクリッ...
おすすめ情報