【環境】
.NET VB (Microsoft Visual Studio 2010(sp1) .NET Framework 4)
Microsoft Excel 2010
【対応】
Visual Studio2010側
1.ファイル>新規作成>プロジェクト>テンプレート>Visual Basic>Office>2010>Excel 2010 アドインを選択
2.SampleExcelAddIn1を作成
ThisAddIn_Startup()、ThisAddIn_Shutdown()が自動生成される。
今回は自動生成された関数を使用せずApplication_WorkbookBeforeSave 関数をApplication.WorkbookBeforeSaveにHandlesし新たに作成
Public Class ThisAddIn
Private Sub ThisAddIn_Startup() Handles Me.Startup
End Sub
Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
End Sub
'Excel保存時
Private Sub Application_WorkbookBeforeSave(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook, ByVal SaveAsUI As Boolean, ByRef Cancel As Boolean) Handles Application.WorkbookBeforeSave
Dim activeWorksheet As Excel.Worksheet = Application.ActiveSheet
If activeWorksheet IsNot Nothing Then
Dim nameCell As Excel.Range = activeWorksheet.Range("B2")
nameCell.Value2 = "Hello ExcelAddIn"
End If
End Sub End Class
Private Sub ThisAddIn_Startup() Handles Me.Startup
End Sub
Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
End Sub
'Excel保存時
Private Sub Application_WorkbookBeforeSave(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook, ByVal SaveAsUI As Boolean, ByRef Cancel As Boolean) Handles Application.WorkbookBeforeSave
Dim activeWorksheet As Excel.Worksheet = Application.ActiveSheet
If activeWorksheet IsNot Nothing Then
Dim nameCell As Excel.Range = activeWorksheet.Range("B2")
nameCell.Value2 = "Hello ExcelAddIn"
End If
End Sub End Class
3.デバック実行すると以下のようにExcelが起動されB2セルにセットした文字列が表示される。
4.Excelに配置したボタンからAddInを呼び出すようにする。
「2.」コードを修正
Public Class ThisAddIn
Private Sub ThisAddIn_Startup() Handles Me.Startup
End Sub
Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
End Sub
'Excel保存時
Private Sub Application_WorkbookBeforeSave(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook, ByVal SaveAsUI As Boolean, ByRef Cancel As Boolean) Handles Application.WorkbookBeforeSave
Dim activeWorksheet As Excel.Worksheet = Application.ActiveSheet
If activeWorksheet IsNot Nothing Then
Dim nameCell As Excel.Range = activeWorksheet.Range("B2")
nameCell.Value2 = "Hello ExcelAddIn"
End If
End Sub End Class
Private utilities As AddInUtilities
Protected Overrides Function RequestComAddInAutomationService() As Object
If utilities Is Nothing Then
utilities = New AddInUtilities()
End If
Return utilities
End Function
Private Sub ThisAddIn_Startup() Handles Me.Startup
End Sub
Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
End Sub
'Excel保存時
Private Sub Application_WorkbookBeforeSave(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook, ByVal SaveAsUI As Boolean, ByRef Cancel As Boolean) Handles Application.WorkbookBeforeSave
Dim activeWorksheet As Excel.Worksheet = Application.ActiveSheet
If activeWorksheet IsNot Nothing Then
Dim nameCell As Excel.Range = activeWorksheet.Range("B2")
nameCell.Value2 = "Hello ExcelAddIn"
End If
End Sub End Class
Private utilities As AddInUtilities
Protected Overrides Function RequestComAddInAutomationService() As Object
If utilities Is Nothing Then
utilities = New AddInUtilities()
End If
Return utilities
End Function
5.他のソリューション(ExcelVBA等)に公開するメンバーを宣言するインターフェイスを定義します。 このインターフェイスをアドイン プロジェクトで定義できます。
SampleExcelAddIn1プロジェクトにAddInUtilities.vbを追加
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
<ComVisible(True)> _
Public Interface IAddInUtilities
Sub ImportData()
End Interface
<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class AddInUtilities
Implements IAddInUtilities
' This method tries to write a string to cell A1 in the active worksheet.
Public Sub ImportData() Implements IAddInUtilities.ImportData
Dim activeWorksheet As Excel.Worksheet = Globals.ThisAddIn.Application.ActiveSheet
If activeWorksheet IsNot Nothing Then
Dim range1 As Excel.Range = activeWorksheet.Range("C3")
range1.Value2 = "Hello ExcelAddIn ボタン1アクション"
MessageBox.Show("ボタン1アクションでC3セルに値を設定")
End If
End Sub
End Class
Imports System.Windows.Forms
<ComVisible(True)> _
Public Interface IAddInUtilities
Sub ImportData()
End Interface
<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class AddInUtilities
Implements IAddInUtilities
' This method tries to write a string to cell A1 in the active worksheet.
Public Sub ImportData() Implements IAddInUtilities.ImportData
Dim activeWorksheet As Excel.Worksheet = Globals.ThisAddIn.Application.ActiveSheet
If activeWorksheet IsNot Nothing Then
Dim range1 As Excel.Range = activeWorksheet.Range("C3")
range1.Value2 = "Hello ExcelAddIn ボタン1アクション"
MessageBox.Show("ボタン1アクションでC3セルに値を設定")
End If
End Sub
End Class
6.Excelにマクロを作成
Excel側
SampleExcelAddIn1.xlsmを新規作成してボタンを配置
ボタンのイベントのマクロを作成
Sub ボタン1_Click()
'すでに"追加シート"シートがあるか確認
If Worksheets.Count = 1 Then
Set wkWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count))
wkWorkSheet.Name = "追加シート"
Else
Dim blShoyomst As Boolean
blShoyomst = False
For i = 1 To Worksheets.Count
Set wkWorkSheet = Worksheets(i)
If wkWorkSheet.Name = "追加シート" Then
blShoyomst = True
wkWorkSheet.Select
Exit For
End If
Next
'あらたに"追加シート"を挿入
If Not blShoyomst Then
Set wkWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count))
wkWorkSheet.Name = "追加シート"
End If
End If
Dim addIn As COMAddIn
Dim automationObject As Object
Set addIn = Application.COMAddIns("SampleExcelAddIn1") '← Visual Studioのアドイン
Set automationObject = addIn.Object
automationObject.ImportData '← 5.で作成したインターフェース
End Sub
'すでに"追加シート"シートがあるか確認
If Worksheets.Count = 1 Then
Set wkWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count))
wkWorkSheet.Name = "追加シート"
Else
Dim blShoyomst As Boolean
blShoyomst = False
For i = 1 To Worksheets.Count
Set wkWorkSheet = Worksheets(i)
If wkWorkSheet.Name = "追加シート" Then
blShoyomst = True
wkWorkSheet.Select
Exit For
End If
Next
'あらたに"追加シート"を挿入
If Not blShoyomst Then
Set wkWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count))
wkWorkSheet.Name = "追加シート"
End If
End If
Dim addIn As COMAddIn
Dim automationObject As Object
Set addIn = Application.COMAddIns("SampleExcelAddIn1") '← Visual Studioのアドイン
Set automationObject = addIn.Object
automationObject.ImportData '← 5.で作成したインターフェース
End Sub
作成したAddInを設定
開発>COMアドイン
8.ボタンクリックしてAddIn実行
0 件のコメント:
コメントを投稿