#内容
EXCELシート上に、デスクトップ画面のスクリーンショットを
SHAPE画像で表示させるプログラムを作成しました。
#検討内容
結局のところ、VBA単体では難しかったので、C#でdllを書きました。
C#のDLLで、戻り値をBASE64の文字列にしています。
VBA側は、BASE64をファイルに落としてデコードしています。
結局のところ、ライブラリを作っても、ファイルに落とさないと
これが実現できないので、スマートではないと思っています。
#相談事項
C#の戻り値を、EXCELのSHAPEオブジェクトにして、
直接、VBAからSHAPEの貼り付けはできないものでしょうか?
どうもc#側で、EXCELのオブジェクトを扱う方法が分かりません。
#PS
今回、初めてc#を触ったので、そもそもDLLも初めてです。
ただし、感触としてはVBAをこね回すよりも、C#側でやりたいことを増やした方が良いように思います。
いままでCOMの操作だけでは、満足いくものができなかったのですが
少し、プログラムの幅が広がりそうな気がします。
すみませんが、初学者にアドバイスをお願い致します。
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Net; 5using System.Runtime.InteropServices; 6using System.Text; 7using System.Threading.Tasks; 8using System.Drawing.Imaging; 9using System.Diagnostics; 10using System.Drawing; 11using System.Windows.Forms; 12using System.IO; 13 14namespace ClassLibraryForVBA 15{ 16 [Guid(ScreenShot.ClassId)] 17 public class ScreenShot 18 { 19 public const string ClassId = "9E873B7A-6636-4448-B9BB-23BE3AE1F28B"; 20 public string GetScreen(int number) 21 { 22 Rectangle rc = System.Windows.Forms.Screen.AllScreens[number].WorkingArea; 23 Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb); 24 using (Graphics g = Graphics.FromImage(bmp)) 25 { 26 g.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, CopyPixelOperation.SourceCopy); 27 } 28 29 var SigBase64 = ""; 30 using (var ms = new MemoryStream()) 31 { 32 bmp.Save(ms, ImageFormat.Bmp); 33 SigBase64 = Convert.ToBase64String(ms.GetBuffer()); 34 } 35 return SigBase64; 36 } 37 public int Count() 38 { 39 return Screen.AllScreens.Length; 40 } 41 public int Height(int number) 42 { 43 return System.Windows.Forms.Screen.AllScreens[number].WorkingArea.Height; 44 } 45 public int Width(int number) 46 { 47 return System.Windows.Forms.Screen.AllScreens[number].WorkingArea.Width; 48 } 49 } 50}
VBA
1Option Explicit 2 3Sub GetPageHtml() 4 5 ' .NETライブラリのクラスをインスタンス化 6Dim wp As New ClassLibraryForVBA.ScreenShot 7Dim arr 8 9arr = wp.getscreen(0) 10Debug.Print wp.Height(0), wp.Width(0) 11put_shape (arr) 12 13arr = wp.getscreen(1) 14Debug.Print wp.Height(1), wp.Width(1) 15put_shape (arr) 16 17End Sub 18 19 20Sub put_shape(arr) 21Dim strTempPath 22strTempPath = Application.ActiveWorkbook.Path & "\temp.png" 23Open strTempPath For Binary As #1 24Put #1, 1, DecodeBase64(arr) 25Close #1 26 27Sheets("Sheet1").Pictures.Insert strTempPath 28 29End Sub 30 31 32Private Function DecodeBase64(ByVal strData As String) As Byte() 33 34 Dim objXML As Object 'MSXML2.DOMDocument 35 Dim objNode As Object 'MSXML2.IXMLDOMElement 36 37 'get dom document 38 Set objXML = CreateObject("MSXML2.DOMDocument") 39 40 'create node with type of base 64 and decode 41 Set objNode = objXML.createElement("b64") 42 objNode.DataType = "bin.base64" 43 objNode.Text = strData 44 DecodeBase64 = objNode.nodeTypedValue 45 46 'clean up 47 Set objNode = Nothing 48 Set objXML = Nothing 49 50End Function 51 52

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。