下面是一个面向初学者的详细教程,涵盖你在 VB.NET 和 VBA 中操作 Excel 单元格的三个核心问题:
- 如何读取单元格的值?
- 如何在工作表中查找某个值?
- 如何将值写回(赋值)到 Excel 单元格?
同时,我会适当对比 VBA(Visual Basic for Applications) 与 VB.NET(Visual Basic .NET) 在处理 Excel 时的区别,帮助你理解两者适用的场景。
📌 前提知识
-
VBA
:内嵌于 Excel 的宏语言,直接运行在 Excel 应用程序内部。适合自动化 Excel 任务、快速原型开发。
-
:独立的 .NET 编程语言,需通过 COM 互操作或第三方库(如 EPPlus、ClosedXML)来操作 Excel。适合开发独立应用程序、处理大量数据、跨平台等场景。
⚠️ 注意:VB.NET 操作 Excel 通常需要引用 Microsoft Excel 对象库(即通过 COM 互操作),但这种方式在服务器环境(如 ASP.NET)中不推荐。更现代的做法是使用 EPPlus (仅支持 .xlsx)或 ClosedXML(基于 Open XML,无需安装 Excel)。
一、读取单元格的值
✅ VBA 示例(在 Excel 内部编写)
sql
Sub ReadCellValue() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") ' 读取 A1 单元格的值 Dim cellValue As Variant cellValue = ws.Range("A1").Value ' 显示出来 MsgBox "A1 的值是: " & cellValueEnd Sub
go
💡提示:
go
1).Value 是最常用的属性,返回单元格的实际内容(数字、文本、日期等)。
2)如果你需要原始公式,用 .Formula;
go
3)如果要显示格式后的文本(比如带千分位的数字),用 .Text。
✅ VB.NET 示例(通过 Excel COM 互操作)
首先,在项目中添加引用:
- 项目 → 添加引用 → COM → "Microsoft Excel xx.x Object Library"
nginx
Imports Excel = Microsoft.Office.Interop.ExcelSub ReadCellValue() ' 启动 Excel 应用 Dim excelApp As New Excel.Application Dim workbook As Excel.Workbook Dim worksheet As Excel.Worksheet ' 打开工作簿(路径需修改) workbook = excelApp.Workbooks.Open("C:\test\example.xlsx") worksheet = CType(workbook.Sheets("Sheet1"), Excel.Worksheet) ' 读取 A1 的值 Dim cellValue As Object = worksheet.Range("A1").Value ' 显示 MessageBox.Show("A1 的值是: " & cellValue.ToString()) ' 关闭并释放资源(非常重要!) workbook.Close() excelApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook) System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)End Sub
go
⚠️注意: VB.NET 使用 COM 互操作时,必须手动释放对象,否则 Excel 进程会残留在后台!
二、在工作表中查找某个值
✅ VBA 查找示例
sql
Sub FindValue() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") Dim foundCell As Range Set foundCell = ws.Range("A1:D100").Find(What:="Apple", LookIn:=xlValues) If Not foundCell Is Nothing Then MsgBox "找到 'Apple' 在 " & foundCell.Address Else MsgBox "未找到" End IfEnd Sub
Find方法非常高效,支持设置查找范围、是否区分大小写、匹配整个单元格等选项。
✅ VB.NET 查找示例(COM 方式)
powershell
Dim searchRange As Excel.Range = worksheet.Range("A1:D100")Dim foundCell As Excel.Range = CType(searchRange.Find("Apple", LookIn:=Excel.XlFindLookIn.xlValues), Excel.Range)If foundCell IsNot Nothing Then MessageBox.Show($"找到 'Apple' 在 {foundCell.Address}")Else MessageBox.Show("未找到")End If
与 VBA 类似,但语法更"正式",且需要处理类型转换。
三、将值写入(赋值)到 Excel 单元格
✅ VBA 写入示例
cs
Sub WriteCellValue() ThisWorkbook.Sheets("Sheet1").Range("B2").Value = "Hello from VBA!"End Sub
go
简单直接!也可以批量写入数组:
apache
Dim data(1 To 2, 1 To 2) As Variantdata(1, 1) = "Name"data(1, 2) = "Age"data(2, 1) = "Alice"data(2, 2) = 30ThisWorkbook.Sheets("Sheet1").Range("D1:E2").Value = data
✅ VB.NET 写入示例
makefile
worksheet.Range("B2").Value = "Hello from VB.NET!"' 或者写入数组(注意:VB.NET 数组默认从 0 开始,但 Excel 要求从 1 开始)Dim data(,) As Object = { {"Name", "Age"}, {"Bob", 25}}worksheet.Range("D1:E2").Value = data
注意:二维数组必须是
Object(,)类型,且维度要匹配目标区域。
🔍 VBA 与 VB.NET 对比总结
| 功能 | VBA | VB.NET |
|---|---|---|
| 运行环境 | 必须在 Excel 内部 | 独立应用程序,可调用 Excel |
| 开发便捷性 | 极其简单,适合非程序员 | 需要 Visual Studio,配置稍复杂 |
| 性能 | 中等,适合小到中型任务 | 可更高(尤其用 EPPlus/ClosedXML 时) |
| 资源管理 | 自动管理 | 必须手动释放 COM 对象 |
| 部署 | 无需额外安装(只要 Excel) | 需 .NET Framework + Excel(若用 COM) |
| 现代替代方案 | 无 | 可用 EPPlus(免 Excel 安装,更快更安全) |
🧩 推荐:VB.NET 使用 EPPlus(更现代的方式)
如果你不想依赖 Excel 安装,推荐使用 EPPlus(NuGet 包):
-
安装 NuGet 包:
Install-Package EPPlus -
代码示例:
swift
Imports OfficeOpenXml' 必须在程序开始启用 License(EPPlus 5+ 要求)ExcelPackage.LicenseContext = LicenseContext.NonCommercialUsing package As New ExcelPackage(New FileInfo("C:\test\example.xlsx")) Dim ws = package.Workbook.Worksheets("Sheet1") ' 读取 Dim val = ws.Cells("A1").Value ' 写入 ws.Cells("B2").Value = "Written by EPPlus" ' 保存 package.Save()End Using
✅ 优点:速度快、无 Excel 依赖、线程安全、支持样式/图表等。
❌ 缺点:只支持 .xlsx(不支持 .xls)。
✅ 给初学者的建议
-
如果你只是想自动化 Excel 文件 (比如每天整理报表),用 VBA 就够了,学习成本低。
-
如果你要开发独立软件 (比如一个数据导入工具),或者处理成千上万行数据 ,建议用 VB.NET + EPPlus。
-
避免在 VB.NET 中滥用 Excel COM 互操作,除非你清楚资源释放机制。
希望这份教程对你有帮助!如果你有具体场景(比如"我想在 B 列找名字为 Tom 的人,然后在 C 列填他的工资"),欢迎继续提问,我可以给出完整代码 😊

作者开发的插件: