質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

6708閲覧

クリップボードに保存した画像をエクスプローラーとExcel両方に貼り付けられるようにしたい。

shiina_yuki

総合スコア11

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2018/06/20 10:24

編集2018/06/20 10:40

前提・実現したいこと

WpfベースのXaml、VB.NETで作成したいるシステムで、
システム上に表示している画像をコピーし、
エクスプローラーとExcel両方に貼付けらるようにしたい

発生している問題・エラーメッセージ

現在エクスプローラーには貼付けができるのですが
Excelに貼り付けようとすると以下のメッセージが表示され、
画像を張り付けることができません。

「データを貼り付けできません。」

試したこと

そこでクリップボードの内容を確認すると以下の二つの要素が存在すると

FileName
FileNameW

Excelに貼り付けようとした際にエラーメッセージが表示されるらしく
要素をクリップボード上に設定されないようにしたいのですが

どうしたらよろしいでしょうか。

ご教授お願いします。

該当のソースコード

VB.NET

Dim data As New DataObject() Dim ms As Stream = New MemoryStream(File.ReadAllBytes("画像ファイルパス")) Dim bmpimg As BitmapImage = New BitmapImage data.SetData(DataFormats.FileDrop, "画像ファイルパス") bmpimg.BeginInit() bmpimg.StreamSource = ms bmpimg.EndInit() data.SetImage(bmpimg) bmpimg.Freeze() Clipboard.SetDataObject(data, False)

補足情報

ExcelのバージョンはExcel2016になります。

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

強引な方法ですが参考になれば。

SetImageを使用せず、System.Drawing.Bitmapで画像を読み込み、強制的にPNG化してクリップボードにセットしています。

PNG化しない方法もありそうですが、一つの考え方として。

vb

1Dim data As New DataObject() 2Dim ms As Stream = New MemoryStream(File.ReadAllBytes(画像ファイルパス)) 3 4data.SetData(DataFormats.FileDrop, New String() {画像ファイルパス}) 5 6Using bmp As New System.Drawing.Bitmap(画像ファイルパス) 7 Using pngMs As Stream = New MemoryStream() 8 'PNGとしてpngMsに保存 9 bmp.Save(pngMs, System.Drawing.Imaging.ImageFormat.Png) 10 data.SetData("PNG", pngMs) 11 Clipboard.SetDataObject(data, True) 12 End Using 13End Using

投稿2018/06/21 11:55

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiina_yuki

2018/06/22 01:26

ご回答ありがとうございます。 いただいたソースを試してみたところ自分の環境では張り付けたオブジェクトが 「この画像は表示できません」と表示されるのみになってしまい貼り付けることができんせんでした。
guest

0

ベストアンサー

EXCELの挙動上しょうがないのかなと思います(クリップボード内にファイルパスと画像が両方合った時に上手く貼れない仕様なのでしょう)。

EXCELで「形式を指定して貼り付け」でビットマップを選べば貼り付けることは出来ますが、たぶんこの案はボツになるでしょうね。

「画像をコピー」と「ファイルをコピー」とを別々の機能として提供してあげるぐらいしか無いのかなと思います。

ちなみに該当のソースコードではエクスプローラに貼り付けが出来ませんでした。
おそらく

data.SetData(DataFormats.FileDrop, "画像ファイルパス")

data.SetData(DataFormats.FileDrop, New String() {"画像ファイルパス"})

にする必要があるかと思います。

投稿2018/06/21 02:24

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiina_yuki

2018/06/21 05:32

ご回答ありがとうごさいます。 やはり無理なんですかね。 現状としては回答していただいた通りにモード切替などで対応する方針になりそうです。 >EXCELで「形式を指定して貼り付け」でビットマップを選べば貼り付けることは出来ますが、たぶんこの案はボツになるでしょうね。 その通りでして、すでにボツにされてしましました。 >ちなみに該当のソースコードではエクスプローラに貼り付けが出来ませんでした。 >おそらく >data.SetData(DataFormats.FileDrop, "画像ファイルパス") >は >data.SetData(DataFormats.FileDrop, New String() {"画像ファイルパス"}) ここの部分に関しては自分の記載ミスです申し訳ありません。 本来の実装では配列になっております。
guest

0

今回の件はシステムの実装上ただの貼り付けは無理ということで
基本的には仕様削除の方針になりました。

ただ、どうしても貼り付けたい場合は、形式を選択して貼り付けをすれば貼り付けられるが
そこに関してはサポートをしないことになりました。

なのでtakabosoft様の回答をベストアンサーとさせていただきました。

お忙しい中ご回答いただきありがとうございました。

投稿2018/06/22 01:30

shiina_yuki

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問