请求协助将指定VBA宏代码转换为C# WinForm实现
将指定VBA代码转换为C#(WinForm)
首先确保你的项目已添加Microsoft.Office.Interop.Excel引用(可通过NuGet安装Microsoft.Office.Interop.Excel包)。以下是对应功能的C#代码实现:
using Excel = Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; // 假设你已初始化Excel应用与工作簿,示例: // Excel.Application excelApp = new Excel.Application(); // Excel.Workbook workbook = excelApp.Workbooks.Open(@"你的Excel文件路径"); // 获取源工作表(第一个工作表) Excel.Worksheet sourceSheet = workbook.Worksheets[1]; // 对应VBA中的rng,可根据实际需求调整数据范围 Excel.Range dataRange = sourceSheet.UsedRange; // 获取AA列从AA2到最后一行的有效数据区域 Excel.Range uniqueValuesRange = sourceSheet.Range["AA2", sourceSheet.Cells[sourceSheet.Rows.Count, "AA"].End(Excel.XlDirection.xlUp)]; foreach (Excel.Range cell in uniqueValuesRange) { string targetSheetName = cell.Text; Excel.Worksheet existingSheet = null; // 检查是否存在同名工作表 try { existingSheet = workbook.Worksheets[targetSheetName]; } catch { } // 捕获工作表不存在的异常 // 存在则删除该工作表 if (existingSheet != null) { excelApp.DisplayAlerts = false; // 关闭删除确认提示 existingSheet.Delete(); excelApp.DisplayAlerts = true; Marshal.ReleaseComObject(existingSheet); } // 对源数据区域应用自动筛选(C列对应第3个字段) dataRange.AutoFilter(); dataRange.AutoFilter(3, cell.Value, Excel.XlAutoFilterOperator.xlFilterValues); // 复制筛选后的可见区域 Excel.Range visibleData = dataRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible); visibleData.Copy(); // 新建工作表并命名 Excel.Worksheet newSheet = workbook.Worksheets.Add(After: workbook.Worksheets[workbook.Worksheets.Count]); newSheet.Name = targetSheetName; // 粘贴数据到新工作表 newSheet.Range["A1"].PasteSpecial(Excel.XlPasteType.xlPasteAll); excelApp.CutCopyMode = false; // 取消复制模式 // 释放临时COM对象,避免内存泄漏 Marshal.ReleaseComObject(visibleData); Marshal.ReleaseComObject(newSheet); } // 最后记得释放所有Excel相关COM对象 Marshal.ReleaseComObject(dataRange); Marshal.ReleaseComObject(sourceSheet); // 后续依次释放workbook、excelApp等对象
关键细节说明:
- 工作表存在性判断:C#中直接访问不存在的工作表会抛出异常,因此用
try-catch替代VBA的GetWorksheet函数逻辑 - 自动筛选参数:C#中
AutoFilter方法的参数顺序与VBA不同,需注意字段索引、筛选值的对应关系 - COM对象释放:Excel Interop基于COM,必须手动释放对象以避免内存泄漏
- 删除工作表:关闭
DisplayAlerts可跳过系统的删除确认弹窗,提升操作流畅性
内容的提问来源于stack exchange,提问作者asmcrae1997
相关产品推荐
相关产品推荐

