ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 39863|回复: 34

[分享] vb.net开发Excel入门讲解(8讲)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-4-1 15:59 | 显示全部楼层 |阅读模式
2003 年Microsoft .NET Framework  发布从此让VB摆脱玩具语言,用微软的话:VB与C++为同一核心(中间语言库)。
在论坛中看见很多朋友还在使用VB6.0进行开发,现结合一个程序开发实例和大家学习VB.NET与EXCEL的开发
大致分为8将:
1:.NET框架概述(转帖);
2:VB.NET语法(转帖);
3:窗体、控件、类概述(转帖,演示VB.NET创建COM DLL在EXCEL中调用);
4:EXCEL的COM对象创建、销毁(演示EXCEL嵌入主程序窗体、强制结束EXCEL、主程序进程);
5:EXCEL的COM对象的操作(演示在VB.NET中调用VBA过程);
6:数据库操作(演示SQL、ACCESS的连接,数据的读写);
7:线程与委托(演示SQL异步读取数据);
8:错误捕捉与程序发布。
限于个人的精力与水平,如有错误请及时指出,共同进步。
程序实例下载地址:http://www.halfpotwater.com/RuanJian/0001.rar
程序实例展示图片:

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-1 16:00 | 显示全部楼层
. .NET概述
    .NET,相信你早已听过这个名词,Microsoft 推出它已经有三,四年之久了,但你对它的了解又有多少呢?
    .NET 最重大的意义在于改变当前人们使用电脑的面貌,就像微软所宣传的一样:“Empower people through great software any time, any place and on any device." 微软希望.NET能做到让任何人从任何地方,在任何时间,使用任何装置来获得互联网上的服务。听起来觉得真的很不错,但实现起来却并不是那么简单的。
    作为一个程序员,理解.NET 最简单的方式是把它看作是执行代码的环境。.NET 管理代码的执行——启动代码,给它赋予相应的权限,为它分配内存以存储其数据,帮助释放某些不再需要的内存和资源等。除了执行这些任务外,.NET 还要使用一个非常复杂的类库——所谓的 .NET 基类,以便在Windows 上执行大量的任务。对这一任务,.NET 承担了双重角色;管理代码的执行和为代码提供服务。
    .NET 包括了其开发工具——Visual Studio.NET,目前最新版本是Visual Studio.NET 2005 Beta 2;1. 公共语言规范(Common Language Specification),使其能支持多种编程语言,如 VB,C++.,C# 等;2. Web Service,新一代的网络服务模式;3. 一个巨大而复杂的基础类函数库,直接提供了许许多多你要用到的功能;4. 公共语言运行环境。
1106020092739.jpg   原图不让盗链,帮你改了一下图片。——ldy

2:VB.NET语法: 请浏览:http://www.bianceng.cn/Programming/VB_NET/200705/1292.htm  
该页有详细的VB.NET语法、visual basic.net的常用控件说明。

[ 本帖最后由 ldy 于 2009-4-1 18:59 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-1 16:00 | 显示全部楼层
3:VB.NET语法: 请浏览:http://www.bianceng.cn/Programming/VB_NET/200705/1292.htm  
该页有详细的VB.NET语法、visual basic.net的常用控件说明。
下面具体演示在VB.NET(2005)中创建COM DLL并在EXCEL中调用:
1:开启Microsoft Visual Studio 2005;
2:在文件——>新建项目中选择:
    WINDOE——>类库 名称:Money(在名称中填入您想编写的DLL名称);
3:删除默认的Class1.vb;
4:项目——>添加新项,选择COM类名称MyMoney.vb
5:VB.NET 内的程序代码:
<ComClass(MyMoney.ClassId, MyMoney.InterfaceId, MyMoney.EventsId)> _
Public Class MyMoney
    Public Event Give(ByVal Money As Int32) '声明事件
#Region "COM GUID"
    ' 这些 GUID 提供此类的 COM 标识
    ' 及其 COM 接口。若更改它们,则现有的
    ' 客户端将不再能访问此类。
    Public Const ClassId As String = "ecd294c3-f12e-4434-92f8-d33d94cdda52"
    Public Const InterfaceId As String = "52358a61-c8bc-44b0-b492-46ea8967b5ce"
    Public Const EventsId As String = "40a8942f-4afa-4ef4-ab7f-d677729d4ec6"
#End Region

    ' 可创建的 COM 类必须具有一个不带参数的 Public Sub New()
    ' 否则, 将不会在
    ' COM 注册表中注册此类,且无法通过
    ' CreateObject 创建此类。
    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub Mov(ByVal mov As Int32) '声明一个过程
        MsgBox("您想要完成的动作")
        RaiseEvent Give(mov) '引发事件
    End Sub
End Class

6:点击生成按键生成: Money.dll

7:在VBA中引用:Money.tlb
在 Visual Studio 2005\Projects\Money\Money\bin\Debug 目录下.
8:VBA内的代码:
Private WithEvents Money As MyMoney

Private Sub CommandButton1_Click()
Money.Mov (12312)

End Sub

Private Sub Money_Give(ByVal Money As Long)
MsgBox Money
End Sub

Private Sub UserForm_Activate()
Set Money = New MyMoney
End Sub

代码比较简单,可能比较容易理解。

[ 本帖最后由 超音速自行车 于 2009-4-1 17:36 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-1 16:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
4:EXCEL的COM对象创建、销毁(演示EXCEL嵌入主程序窗体、强制结束EXCEL、主程序进程);
EXCEL的COM对象创建、销毁请参见:
http://bingning.net/VB/SOURCE/programing/xlsclass.html
该页有许多VB.NET操作EXCEL的代码
现演示在程序窗体中嵌入EXCEL
方法一:使用.NET的WebBrowser控件:
Me.WebBrowser1.Navigate("C:\Documents and Settings\Administrator\My Documents\冶金成本报表.xls")
方法二:使用微软提供的控件:
下载控件:
   Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim Execl As Microsoft.Office.Interop.Excel.Application
        Me.AxFramerControl1.Open("C:\Documents and Settings\Administrator\My Documents\冶金成本报表.xls")
        Execl = Me.AxFramerControl1.ActiveDocument.application
        Execl.ActiveCell.Value = "12344"
    End Sub
方法三:使用API
Imports System.Runtime.InteropServices '使用该语句后可以使用 DllImport 来引用 Dll 内的函数
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Integer, ByVal nIndex As Integer) As Integer
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
    Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
    Public Declare Function SetParent Lib "user32" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
    <DllImport("user32.dll")> Public Shared Function SendMessage(ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
    End Function
    Private Declare Function ShowWindow Lib "user32.dll " (ByVal hwnd As Int32, ByVal nCmdShow As Int32) As Int32
    Private Const WM_SYSCOMMAND As Int32 = &H112
    Private Const SC_MAXIMIZE As Int32 = &HF030
    Public Const SW_SHOW = 5
    Public Const GWL_STYLE = -16
    Public Const WS_BORDER = &H800000
    Private Const WS_DLGFRAME = &H400000
    Public Const SWP_NOMOVE = &H2S
    Public Const SWP_NOSIZE = &H1S
    Public Const SWP_NOZORDER = &H4S
    Public Const SWP_FRAMECHANGED = &H20S


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim Execl As New Microsoft.Office.Interop.Excel.Application '创建EXCEL实例
        Execl.Workbooks.Add() '添加工作簿
        Execl.Visible = True 'EXCEL窗口显示。注意必须显示。
        Execl.ScreenUpdating = False '关闭EXCEL荧屏更新
        Dim h As IntPtr = Execl.Hwnd '获得EXCEL句柄
        Dim lStyle As Int32 = GetWindowLong(h, GWL_STYLE)
        lStyle = lStyle And Not WS_BORDER
        SetWindowLong(h.ToInt32, GWL_STYLE, lStyle)
        SetParent(h, Me.Panel1.Handle) '设置EXCEL的父容器
        SetWindowPos(h, IntPtr.Zero, 0, 0, 0, 0, _
         SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_FRAMECHANGED)
        SendMessage(h, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
        ShowWindow(h, SW_SHOW)
        Execl.Visible = True
        Execl.ScreenUpdating = True
    End Sub
强制结束EXCEL进程
在正常运行中建议使用Application.Quit()退出 EXCEL,但有时需要强制结束EXCEL程序可以使用:
Public Function Killexcel() As Boolean '强制终止EXCEL进程.
        Dim Pro As Process() = Process.GetProcesses '获得当前运行的所有进程
        For Each pr As Process In Pro
            Try
                If pr.ProcessName.Contains("EXCEL") = True Then '获得进程的名称,如果名称包含EXCEL就结束该进程。
                    pr.Kill()
                    Return True
                End If
            Catch ex As Exception

            End Try
        Next
        Return False
    End Function
强制结束主程序:
有时主程序有线程或其他未结束的进程,虽然点击关闭或使用: Application.Exit()结束程序可能仍无相应可以使用:
System.Environment.Exit(System.Environment.ExitCode)'强制结束当前程序.

[ 本帖最后由 超音速自行车 于 2009-4-1 19:35 编辑 ]

dsoframer.rar

46.87 KB, 下载次数: 418

使用微软提供的OFFICE文档嵌入控件

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-1 16:02 | 显示全部楼层
5:EXCEL的COM对象的操作(演示在VB.NET中调用VBA过程);

EXCEL的COM对操作参见:
http://bingning.net/VB/SOURCE/programing/xlsclass.html
该页有许多VB.NET操作EXCEL的代码
在VB.NET中调用VBA过程(函数)可以加快程序的运行速度。
现演VB.NET创建VBA模块、过程,再调用后删除该过程.
Dim Excel As Microsoft.Office.Interop.Excel.Application
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Excel = New Microsoft.Office.Interop.Excel.Application
        Excel.Workbooks.Add()
        Excel.Visible = True
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Excel IsNot Nothing Then Excel.Quit()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        '开启VBA访问,并将VBA宏安全设置为高.
        Dim Reg As Microsoft.Win32.RegistryKey = My.Computer.Registry.CurrentUser
        'EXCEL 2003安全设置
        Dim EReg As Microsoft.Win32.RegistryKey = Reg.CreateSubKey("Software\Microsoft\Office\11.0\Excel\Security")
        EReg.SetValue("Level", "3", Microsoft.Win32.RegistryValueKind.DWord)
        EReg.SetValue("DontTrustInstalledFiles", "0", Microsoft.Win32.RegistryValueKind.DWord)
        EReg.SetValue("AccessVBOM", "1", Microsoft.Win32.RegistryValueKind.DWord)
        EReg.Close()
        'EXCEL 2007安全设置
        EReg = Reg.CreateSubKey("Software\Microsoft\Office\12.0\Excel\Security")
        EReg.SetValue("Level", "3", Microsoft.Win32.RegistryValueKind.DWord)
        EReg.SetValue("DontTrustInstalledFiles", "0", Microsoft.Win32.RegistryValueKind.DWord)
        EReg.SetValue("AccessVBOM", "1", Microsoft.Win32.RegistryValueKind.DWord)
        EReg.Close()
        Reg.Close() '关闭注册表

        '在.NET开发环境中对系统的操作非常简单:
        ' 比如获得显示尺寸:
        ' My.Computer.Screen.Bounds
        '播放声音文件:
        ' My.Computer.Audio.Play("c:\miues.wav", AudioPlayMode.Background)

        '获得系统特殊文件夹:我的文档
        '  System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)




        Dim Vba As Microsoft.Vbe.Interop.VBComponent = Nothing
        For xh As Int32 = 1 To Excel.VBE.ActiveVBProject.VBComponents.Count
            If Excel.VBE.ActiveVBProject.VBComponents.Item(xh).Name = "NET" Then
                Excel.VBE.ActiveVBProject.VBComponents.Remove(Excel.VBE.ActiveVBProject.VBComponents.Item(xh)) '删除该模块
                Exit For
            End If
        Next
        '添加 NET 模块。
        Excel.VBE.ActiveVBProject.VBComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule).Name = "NET"
        For xh As Int16 = 1 To Excel.VBE.ActiveVBProject.VBComponents.Count
            If Excel.VBE.ActiveVBProject.VBComponents.Item(xh).Name = "NET" Then
                Vba = Excel.VBE.ActiveVBProject.VBComponents.Item(xh)
            End If
        Next
        Vba.CodeModule.AddFromString(My.Settings.VBA) '添加VBA代码,可以是多个过程或函数。
        Vba.Activate()
        Excel.Run("NET_VBA", 10, 10)'传递参数到该过程,最多30个,数组在VBA需声明为Variant类型。
        '删除指定的过程。
        If Vba.CodeModule.Find("NET_VBA", 0, 0, Vba.CodeModule.CountOfLines, 0, False, False, False) = True Then
            Dim StarLins, EndLins As Int16
            StarLins = Vba.CodeModule.ProcStartLine("NET_VBA", Microsoft.Vbe.Interop.vbext_ProcKind.vbext_pk_Proc)
            EndLins = Vba.CodeModule.ProcCountLines("NET_VBA", Microsoft.Vbe.Interop.vbext_ProcKind.vbext_pk_Proc)
            Vba.CodeModule.DeleteLines(StarLins, EndLins)
        End If




    End Sub

End Class

'VBA 的过程.
'Public Sub NET_VBA(ByVal X As Integer, ByVal Y As Integer)
'    For xh = 1 To X
'        For xy = 1 To Y
'            Cells(xh, xy) = xh & "---" & xy
'        Next
'    Next
'End Sub

提供完整程序文件:

[ 本帖最后由 超音速自行车 于 2009-4-1 21:40 编辑 ]

VAB.rar

51.9 KB, 下载次数: 372

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-1 16:02 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-1 16:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
7:讲预留位置

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-1 16:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
8:讲预留位置

TA的精华主题

TA的得分主题

发表于 2009-4-1 16:20 | 显示全部楼层
这个内容我太想学了,谢谢,期待中

TA的精华主题

TA的得分主题

发表于 2009-4-1 17:01 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 23:33 , Processed in 0.046843 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表