You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助将指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:23:16