VSTO開髮指南(VB版) 第三章 Excel編程

来源:https://www.cnblogs.com/xiehaofeng/archive/2020/02/05/12266373.html
-Advertisement-
Play Games

通過前兩章的內容,有了一定的基礎,但進入第三章,實例的步驟非常多,並且隨著VS版本的升級,部分功能菜單界面發生了很大變化,所以,第三章的案例我將逐步編寫! 實例3.1的目標就是給Excel寫一個載入巨集,實質就是寫一個Excel函數,並通過在註冊表中註冊,實現像自帶函數那樣的功能。 步驟一:Visua ...


通過前兩章的內容,有了一定的基礎,但進入第三章,實例的步驟非常多,並且隨著VS版本的升級,部分功能菜單界面發生了很大變化,所以,第三章的案例我將逐步編寫!

實例3.1的目標就是給Excel寫一個載入巨集,實質就是寫一個Excel函數,並通過在註冊表中註冊,實現像自帶函數那樣的功能。

步驟一:Visual Studio 2013創建AutomationAddin類庫。

            文件——新建——項目——模板——Visual Basic——類庫——名稱中輸入“AutomationAddin”——確定。

           

 

 

步驟二:在class1.vb代碼文件中書寫代碼:

          

Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

<ClassInterface(ClassInterfaceType.AutoDual), ComVisible(True)> _
Public Class MyFunctions

    Public Function MultiplyNTimes(ByVal number1 As Double, ByVal number2 As Double, ByVal timesToMultiply As Double) As Double

        Dim result As Double = number1
        For i As Double = 0 To timesToMultiply
            result = result * number2
        Next

        Return result
    End Function

    <ComRegisterFunctionAttribute()> _
    Public Shared Sub RegisterFunction(ByVal type As Type)
        Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type))
    End Sub
    <ComUnregisterFunctionAttribute()> _
    Public Shared Sub UnregisterFunction(ByVal type As Type)
        Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type), False)
    End Sub

    Private Shared Function GetSubKeyName(ByVal type As Type) _
      As String
        Dim s As New System.Text.StringBuilder()

        s.Append("CLSID\{")
        s.Append(type.GUID.ToString().ToUpper())
        s.Append("}\Programmable")

        Return s.ToString()
    End Function

End Class

步驟三:項目——“AutomationAddin”屬性——>編譯——>選中“為COM互操作註冊”覆選框(在編譯頁的最下端)

               

 

 步驟四:生成——生成解決方案。  註:若生成解決方案成功,則就意味著已經將巨集成功註冊到了註冊表。

              

 

 步驟五:新建一個Excel文件,並選擇“開發工具”——“載入項”——“自動化”——“AutomationAddin.MyFunctions”——確定。當提示不能找到mscoree.dll的錯誤信息時選擇“否”。

             

 

            

 

          

 

 

 步驟六:應用剛寫的函數MultiplyNTimes,第一個數是基數,第二個數乘第一個數,第三個數表示乘的次數,MultiplyNTimes(1,2,3)=1X2X2X2=16

              在Excel中輸入值:10,3,5   並選中單元格——“插入函數”——或選擇類別中的“AutomationAddin.MyFunctions”——選擇函數中的“MultiplyNTimes”——確定

             在函數參數對話框中填入所需參數E2,E3,E4單元格,點“確定”,全部完成。

             

 

             

 

            

 

            

 

           

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • A類調用B類的靜態方法,除了載入B類,但是B類的一個未被調用的方法間接使用到的C類卻也被載入了,這個有意思的場景來自一個提問: "方法中使用的類型為何在未調用時嘗試載入?" 。 場景如下: 添加JVM varbose參數進行執行,輸出是: main方法執行 ,而 方法裡面只有列印語句,所以理論上應該 ...
  • 要分析JVM的源碼,結合資料直接閱讀是一種方式,但是遇到一些想不通的場景,必須要結合調試,查看執行路徑以及參數具體的值,才能搞得明白。所以我們先來把JVM的源碼進行編譯,並能夠使用GDB進行調試。 編譯環境 本文使用的JDK版本:OpenJDK7,分支b147 下載頁面:https://downlo ...
  • numpy庫中矩陣的常用方法 1 矩陣轉置 從上圖可以看出:使用方法a.T可以將矩陣a轉置。 2 均值與方差 註意:方法a.mean()會對矩陣a的所有元素求均值,a.var()也是考慮矩陣a的所有元素求方差。 當然,也可以選取矩陣的某一行或某一列使用mean與var求均值與方差。 3 設置零矩陣 ...
  • java中棧記憶體與堆記憶體(JVM記憶體模型) Java中堆記憶體和棧記憶體詳解1 和 Java中堆記憶體和棧記憶體詳解2 都粗略講解了棧記憶體和堆記憶體的區別,以及代碼中哪些變數存儲在堆中、哪些存儲在棧中。記憶體中的堆和棧到底是什麼 詳細講述了程式在記憶體中的模型,從可執行文件(ELF)格式的編譯介紹了堆和棧,主要是... ...
  • 文件下載 1.開啟fileinfo擴展 2.fileinfo函數 finfo_open 創建一個fileinfo資源 finfo_close 關閉fileinfo資源 finfo_file 返回一個文件的信息 FILEINFO_MIME_TYPE 返回mime類型 FILEINFO_MIME_TYP ...
  • 平衡二叉樹(AVL樹)的自平衡(LL->R、RR->L、LR->LR、RL->RL)、增、刪 等操作。 main.cpp: #include <iostream> #include "AVLTree.h" using namespace std; int main() { AVLTree<int> ...
  • 用 C 寫一個 Redis 數據同步小工具 Intro 為了實現 redis 的數據遷移而寫的一個小工具,將一個實例中的 redis 數據同步到另外一個實例中。(原本打算找一個已有的工具去做,找了一個 nodejs 的小工具,結果折騰了好久都沒裝上。。。於是就自己寫了這個小工具) 之所以自己寫一個工 ...
  • WPF應用程式中的程式集資源與其他.NET應用程式中的程式集資源在本質上是相同的。基本概念是為項目添加文件,從而Visual studio可將其嵌入到編譯過的應用程式的EXE或DLL文件中。WPF程式集資源與其他應用程式中的程式集資源之間的重要區別是引用他們的定址系統不同。 在前面章節已討論過程式集 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...