宏与VBA集成
引言:Excel自动化的"智能机器人"
在Excel自动化开发中,如果说基础操作是"手动驾驶",那么宏与VBA集成就是"自动驾驶"!它们就像是给Excel装上了"智能机器人",能够自动执行复杂的业务逻辑,实现真正的无人值守操作。
想象一下这样的场景:每天凌晨2点,当整个办公室都沉浸在宁静中时,你的Excel自动化系统却正在"辛勤工作"——自动下载最新的销售数据、执行复杂的计算分析、生成精美的报表、甚至自动发送邮件给相关领导。这一切都不需要人工干预,就像有一个不知疲倦的机器人24小时为你服务!
MudTools.OfficeInterop.Excel项目就像是专业的"智能机器人制造工厂",它提供了完整的宏执行和VBA集成支持。从简单的Excel 4.0宏到复杂的VBA脚本,从基础的自动化任务到高级的业务流程,每一个功能都能让你的Excel自动化达到新的高度。
本篇将带你探索宏与VBA集成的奥秘,学习如何通过代码创建智能、高效、可靠的企业级自动化解决方案。准备好让你的Excel系统拥有"自主思考"和"自动执行"的能力了吗?
宏的录制和执行
宏录制基础概念
宏录制是Excel自动化的重要功能,它能够记录用户的操作并生成可重复执行的代码。
// 宏录制模式枚举
public enum MacroRecordingMode
{
RelativeReferences = 1, // 相对引用录制
AbsoluteReferences = 2, // 绝对引用录制
MixedReferences = 3 // 混合引用录制
}宏录制管理器
/// <summary>
/// 宏录制管理器 - 提供宏录制和管理功能
/// </summary>
public class MacroRecordingManager
{
private readonly IExcelApplication _application;
private readonly List<RecordedMacro> _recordedMacros;
public MacroRecordingManager(IExcelApplication application)
{
_application = application ?? throw new ArgumentNullException(nameof(application));
_recordedMacros = new List<RecordedMacro>();
}
/// <summary>
/// 开始录制宏
/// </summary>
public void StartRecording(string macroName, MacroRecordingMode mode = MacroRecordingMode.AbsoluteReferences)
{
if (string.IsNullOrWhiteSpace(macroName))
throw new ArgumentException("宏名称不能为空");
try
{
// 设置录制模式
_application.RecordRelative = mode == MacroRecordingMode.RelativeReferences;
// 开始录制
_application.StartRecording(macroName);
Console.WriteLine($"开始录制宏: {macroName}");
}
catch (Exception ex)
{
throw new InvalidOperationException($"开始录制宏失败: {ex.Message}", ex);
}
}
/// <summary>
/// 停止录制宏
/// </summary>
public RecordedMacro StopRecording()
{
try
{
// 停止录制
var macroCode = _application.StopRecording();
// 创建录制宏对象
var recordedMacro = new RecordedMacro
{
Name = _application.RecordingMacroName,
Code = macroCode,
RecordingTime = DateTime.Now,
Mode = _application.RecordRelative ? MacroRecordingMode.RelativeReferences : MacroRecordingMode.AbsoluteReferences
};
_recordedMacros.Add(recordedMacro);
Console.WriteLine($"停止录制宏: {recordedMacro.Name}");
return recordedMacro;
}
catch (Exception ex)
{
throw new InvalidOperationException($"停止录制宏失败: {ex.Message}", ex);
}
}
/// <summary>
/// 执行录制的宏
/// </summary>
public object ExecuteRecordedMacro(string macroName)
{
var macro = _recordedMacros.FirstOrDefault(m => m.Name == macroName);
if (macro == null)
throw new ArgumentException($"未找到录制的宏: {macroName}");
try
{
// 执行宏代码
return _application.Run(macroName);
}
catch (Exception ex)
{
throw new InvalidOperationException($"执行录制的宏失败: {ex.Message}", ex);
}
}
/// <summary>
/// 获取所有录制的宏
/// </summary>
public IEnumerable<RecordedMacro> GetRecordedMacros()
{
return _recordedMacros.AsReadOnly();
}
}
/// <summary>
/// 录制宏信息类
/// </summary>
public class RecordedMacro
{
public string Name { get; set; } = string.Empty;
public string Code { get; set; } = string.Empty;
public DateTime RecordingTime { get; set; }
public MacroRecordingMode Mode { get; set; }
}宏录制应用案例
/// <summary>
/// 数据录入宏录制管理器
/// </summary>
public class DataEntryMacroManager
{
private readonly MacroRecordingManager _recordingManager;
public DataEntryMacroManager(MacroRecordingManager recordingManager)
{
_recordingManager = recordingManager;
}
/// <summary>
/// 录制数据录入宏
/// </summary>
public RecordedMacro RecordDataEntryMacro()
{
try
{
// 开始录制数据录入宏
_recordingManager.StartRecording("DataEntryMacro", MacroRecordingMode.RelativeReferences);
// 这里可以执行数据录入操作
// 实际应用中,这些操作会被自动录制
// 停止录制
return _recordingManager.StopRecording();
}
catch (Exception ex)
{
throw new InvalidOperationException($"录制数据录入宏失败: {ex.Message}", ex);
}
}
/// <summary>
/// 执行数据录入宏
/// </summary>
public void ExecuteDataEntryMacro()
{
try
{
_recordingManager.ExecuteRecordedMacro("DataEntryMacro");
Console.WriteLine("数据录入宏执行完成");
}
catch (Exception ex)
{
throw new InvalidOperationException($"执行数据录入宏失败: {ex.Message}", ex);
}
}
}VBA代码的编程调用
VBA宏执行基础
VBA(Visual Basic for Applications)是Excel的强大脚本语言,通过编程调用可以实现复杂的自动化功能。
/// <summary>
/// VBA宏执行管理器 - 提供VBA宏的编程调用功能
/// </summary>
public class VbaMacroExecutionManager
{
private readonly IExcelApplication _application;
private readonly Dictionary<string, VbaMacroInfo> _vbaMacros;
public VbaMacroExecutionManager(IExcelApplication application)
{
_application = application ?? throw new ArgumentNullException(nameof(application));
_vbaMacros = new Dictionary<string, VbaMacroInfo>();
}
/// <summary>
/// 执行VBA宏
/// </summary>
public object ExecuteVbaMacro(string macroName, params object[] args)
{
if (string.IsNullOrWhiteSpace(macroName))
throw new ArgumentException("VBA宏名称不能为空");
try
{
// 执行VBA宏
return _application.Run(macroName, args);
}
catch (Exception ex)
{
throw new InvalidOperationException($"执行VBA宏'{macroName}'失败: {ex.Message}", ex);
}
}
/// <summary>
/// 注册VBA宏信息
/// </summary>
public void RegisterVbaMacro(string name, string description, string moduleName,
string procedureName, VbaMacroType type)
{
_vbaMacros[name] = new VbaMacroInfo(name, description, moduleName, procedureName, type);
}
/// <summary>
/// 执行带参数的VBA函数
/// </summary>
public object ExecuteVbaFunction(string functionName, params object[] parameters)
{
// 构建完整的函数调用
string fullFunctionName = $"ThisWorkbook.{functionName}";
return ExecuteVbaMacro(fullFunctionName, parameters);
}
/// <summary>
/// 执行工作表级别的VBA宏
/// </summary>
public object ExecuteWorksheetMacro(string sheetName, string macroName, params object[] args)
{
string fullMacroName = $"'{sheetName}'!{macroName}";
return ExecuteVbaMacro(fullMacroName, args);
}
/// <summary>
/// 执行模块级别的VBA宏
/// </summary>
public object ExecuteModuleMacro(string moduleName, string macroName, params object[] args)
{
string fullMacroName = $"{moduleName}.{macroName}";
return ExecuteVbaMacro(fullMacroName, args);
}
/// <summary>
/// 获取VBA宏信息
/// </summary>
public VbaMacroInfo GetVbaMacroInfo(string name)
{
return _vbaMacros.TryGetValue(name, out var info) ? info : null;
}
}
/// <summary>
/// VBA宏信息类
/// </summary>
public class VbaMacroInfo
{
public string Name { get; }
public string Description { get; }
public string ModuleName { get; }
public string ProcedureName { get; }
public VbaMacroType Type { get; }
public VbaMacroInfo(string name, string description, string moduleName,
string procedureName, VbaMacroType type)
{
Name = name;
Description = description;
ModuleName = moduleName;
ProcedureName = procedureName;
Type = type;
}
/// <summary>
/// 获取完整的宏名称
/// </summary>
public string FullName => $"{ModuleName}.{ProcedureName}";
}
/// <summary>
/// VBA宏类型枚举
/// </summary>
public enum VbaMacroType
{
SubProcedure, // Sub过程
Function, // Function函数
EventHandler // 事件处理程序
}常用VBA功能封装
/// <summary>
/// 常用VBA功能封装管理器
/// </summary>
public class CommonVbaFunctionManager
{
private readonly VbaMacroExecutionManager _vbaManager;
public CommonVbaFunctionManager(VbaMacroExecutionManager vbaManager)
{
_vbaManager = vbaManager;
}
/// <summary>
/// 显示消息框
/// </summary>
public void ShowMessageBox(string message, string title = "提示")
{
_vbaManager.ExecuteVbaMacro("ShowMessageBox", message, title);
}
/// <summary>
/// 显示输入框
/// </summary>
public string ShowInputBox(string prompt, string title = "输入")
{
var result = _vbaManager.ExecuteVbaMacro("ShowInputBox", prompt, title);
return result?.ToString() ?? string.Empty;
}
/// <summary>
/// 显示文件选择对话框
/// </summary>
public string ShowFileDialog(string initialPath = "", string filter = "所有文件 (*.*)|*.*")
{
var result = _vbaManager.ExecuteVbaMacro("ShowFileDialog", initialPath, filter);
return result?.ToString() ?? string.Empty;
}
/// <summary>
/// 显示文件夹选择对话框
/// </summary>
public string ShowFolderDialog(string initialPath = "")
{
var result = _vbaManager.ExecuteVbaMacro("ShowFolderDialog", initialPath);
return result?.ToString() ?? string.Empty;
}
/// <summary>
/// 保存工作簿
/// </summary>
public void SaveWorkbookAs(string filePath)
{
_vbaManager.ExecuteVbaMacro("SaveWorkbookAs", filePath);
}
/// <summary>
/// 导出工作表为PDF
/// </summary>
public void ExportToPdf(string sheetName, string filePath)
{
_vbaManager.ExecuteVbaMacro("ExportToPdf", sheetName, filePath);
}
/// <summary>
/// 发送邮件
/// </summary>
public void SendEmail(string to, string subject, string body, string attachmentPath = "")
{
_vbaManager.ExecuteVbaMacro("SendEmail", to, subject, body, attachmentPath);
}
/// <summary>
/// 数据验证
/// </summary>
public bool ValidateData(string dataRange, string validationRule)
{
var result = _vbaManager.ExecuteVbaMacro("ValidateData", dataRange, validationRule);
return Convert.ToBoolean(result);
}
/// <summary>
/// 数据清理
/// </summary>
public void CleanData(string dataRange)
{
_vbaManager.ExecuteVbaMacro("CleanData", dataRange);
}
/// <summary>
/// 数据转换
/// </summary>
public void TransformData(string sourceRange, string destinationRange, string transformationRule)
{
_vbaManager.ExecuteVbaMacro("TransformData", sourceRange, destinationRange, transformationRule);
}
}自定义函数的创建
自定义函数基础概念
自定义函数允许开发者创建专用的计算函数,扩展Excel的公式功能。
/// <summary>
/// 自定义函数管理器 - 提供自定义函数的创建和管理功能
/// </summary>
public class CustomFunctionManager
{
private readonly IExcelApplication _application;
private readonly Dictionary<string, CustomFunctionInfo> _customFunctions;
public CustomFunctionManager(IExcelApplication application)
{
_application = application ?? throw new ArgumentNullException(nameof(application));
_customFunctions = new Dictionary<string, CustomFunctionInfo>();
}
/// <summary>
/// 创建自定义函数
/// </summary>
public void CreateCustomFunction(string functionName, string description,
string category, string parameterInfo, string vbaCode)
{
if (string.IsNullOrWhiteSpace(functionName))
throw new ArgumentException("函数名称不能为空");
if (string.IsNullOrWhiteSpace(vbaCode))
throw new ArgumentException("VBA代码不能为空");
try
{
// 注册函数信息
var functionInfo = new CustomFunctionInfo
{
Name = functionName,
Description = description,
Category = category,
ParameterInfo = parameterInfo,
VbaCode = vbaCode,
CreatedTime = DateTime.Now
};
_customFunctions[functionName] = functionInfo;
// 在实际应用中,这里需要将VBA代码添加到工作簿模块中
// 简化实现:记录函数信息
Console.WriteLine($"创建自定义函数: {functionName}");
}
catch (Exception ex)
{
throw new InvalidOperationException($"创建自定义函数失败: {ex.Message}", ex);
}
}
/// <summary>
/// 执行自定义函数
/// </summary>
public object ExecuteCustomFunction(string functionName, params object[] parameters)
{
if (!_customFunctions.ContainsKey(functionName))
throw new ArgumentException($"未找到自定义函数: {functionName}");
try
{
// 执行自定义函数
return _application.Run(functionName, parameters);
}
catch (Exception ex)
{
throw new InvalidOperationException($"执行自定义函数失败: {ex.Message}", ex);
}
}
/// <summary>
/// 获取所有自定义函数
/// </summary>
public IEnumerable<CustomFunctionInfo> GetCustomFunctions()
{
return _customFunctions.Values;
}
}
/// <summary>
/// 自定义函数信息类
/// </summary>
public class CustomFunctionInfo
{
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string Category { get; set; } = "用户定义";
public string ParameterInfo { get; set; } = string.Empty;
public string VbaCode { get; set; } = string.Empty;
public DateTime CreatedTime { get; set; }
}常用自定义函数实现
/// <summary>
/// 常用自定义函数实现管理器
/// </summary>
public class CommonCustomFunctionManager
{
private readonly CustomFunctionManager _functionManager;
public CommonCustomFunctionManager(CustomFunctionManager functionManager)
{
_functionManager = functionManager;
}
/// <summary>
/// 创建财务计算函数
/// </summary>
public void CreateFinancialFunctions()
{
// 创建净现值计算函数
string npvCode = @"
Function CalculateNPV(rate As Double, cashflows As Range) As Double
Dim npv As Double
Dim i As Integer
npv = 0
For i = 1 To cashflows.Count
npv = npv + cashflows(i) / (1 + rate) ^ i
Next i
CalculateNPV = npv
End Function";
_functionManager.CreateCustomFunction(
"CalculateNPV",
"计算净现值",
"财务",
"rate: 贴现率, cashflows: 现金流范围",
npvCode);
// 创建内部收益率计算函数
string irrCode = @"
Function CalculateIRR(cashflows As Range, guess As Double) As Double
' 简化的IRR计算实现
CalculateIRR = 0.1 ' 简化实现
End Function";
_functionManager.CreateCustomFunction(
"CalculateIRR",
"计算内部收益率",
"财务",
"cashflows: 现金流范围, guess: 初始猜测值",
irrCode);
}
/// <summary>
/// 创建统计计算函数
/// </summary>
public void CreateStatisticalFunctions()
{
// 创建移动平均计算函数
string movingAvgCode = @"
Function MovingAverage(data As Range, period As Integer) As Double
Dim sum As Double
Dim i As Integer
sum = 0
For i = data.Count - period + 1 To data.Count
sum = sum + data(i)
Next i
MovingAverage = sum / period
End Function";
_functionManager.CreateCustomFunction(
"MovingAverage",
"计算移动平均值",
"统计",
"data: 数据范围, period: 期间",
movingAvgCode);
// 创建标准差计算函数
string stdDevCode = @"
Function StandardDeviation(data As Range) As Double
Dim mean As Double
Dim sumSquares As Double
Dim i As Integer
mean = Application.WorksheetFunction.Average(data)
sumSquares = 0
For i = 1 To data.Count
sumSquares = sumSquares + (data(i) - mean) ^ 2
Next i
StandardDeviation = Sqr(sumSquares / (data.Count - 1))
End Function";
_functionManager.CreateCustomFunction(
"StandardDeviation",
"计算样本标准差",
"统计",
"data: 数据范围",
stdDevCode);
}
/// <summary>
/// 创建文本处理函数
/// </summary>
public void CreateTextFunctions()
{
// 创建文本提取函数
string extractTextCode = @"
Function ExtractText(text As String, startPos As Integer, length As Integer) As String
ExtractText = Mid(text, startPos, length)
End Function";
_functionManager.CreateCustomFunction(
"ExtractText",
"提取文本子串",
"文本",
"text: 原始文本, startPos: 起始位置, length: 提取长度",
extractTextCode);
// 创建文本格式化函数
string formatTextCode = @"
Function FormatText(text As String, formatType As String) As String
Select Case formatType
Case 'Upper': FormatText = UCase(text)
Case 'Lower': FormatText = LCase(text)
Case 'Proper': FormatText = StrConv(text, vbProperCase)
Case Else: FormatText = text
End Select
End Function";
_functionManager.CreateCustomFunction(
"FormatText",
"格式化文本",
"文本",
"text: 原始文本, formatType: 格式类型(Upper/Lower/Proper)",
formatTextCode);
}
}安全性和权限管理
宏安全性管理
宏安全性是Excel自动化的重要考虑因素,确保系统安全运行。
/// <summary>
/// 宏安全性管理器 - 提供宏安全性和权限管理功能
/// </summary>
public class MacroSecurityManager
{
private readonly IExcelApplication _application;
private readonly List<SecurityRule> _securityRules;
public MacroSecurityManager(IExcelApplication application)
{
_application = application ?? throw new ArgumentNullException(nameof(application));
_securityRules = new List<SecurityRule>();
}
/// <summary>
/// 设置宏安全性级别
/// </summary>
public void SetMacroSecurityLevel(MacroSecurityLevel level)
{
try
{
switch (level)
{
case MacroSecurityLevel.DisableAll:
_application.AutomationSecurity = 3; // 禁用所有宏
break;
case MacroSecurityLevel.EnableWithWarnings:
_application.AutomationSecurity = 2; // 启用带警告的宏
break;
case MacroSecurityLevel.EnableAll:
_application.AutomationSecurity = 1; // 启用所有宏
break;
}
Console.WriteLine($"设置宏安全性级别: {level}");
}
catch (Exception ex)
{
throw new InvalidOperationException($"设置宏安全性级别失败: {ex.Message}", ex);
}
}
/// <summary>
/// 添加安全规则
/// </summary>
public void AddSecurityRule(SecurityRule rule)
{
_securityRules.Add(rule);
Console.WriteLine($"添加安全规则: {rule.Name}");
}
/// <summary>
/// 验证宏执行权限
/// </summary>
public bool ValidateMacroExecution(string macroName, string userContext)
{
var rule = _securityRules.FirstOrDefault(r => r.AppliesToMacro(macroName));
if (rule == null)
{
// 如果没有特定规则,使用默认规则
return _securityRules.Any(r => r.IsDefaultRule && r.Validate(userContext));
}
return rule.Validate(userContext);
}
/// <summary>
/// 获取当前安全性设置
/// </summary>
public MacroSecurityInfo GetSecurityInfo()
{
return new MacroSecurityInfo
{
SecurityLevel = (MacroSecurityLevel)_application.AutomationSecurity,
RuleCount = _securityRules.Count,
LastUpdated = DateTime.Now
};
}
}
/// <summary>
/// 宏安全性级别枚举
/// </summary>
public enum MacroSecurityLevel
{
DisableAll = 3, // 禁用所有宏
EnableWithWarnings = 2, // 启用带警告的宏
EnableAll = 1 // 启用所有宏
}
/// <summary>
/// 安全性规则类
/// </summary>
public class SecurityRule
{
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public List<string> AllowedUsers { get; set; } = new List<string>();
public List<string> AllowedMacros { get; set; } = new List<string>();
public bool IsDefaultRule { get; set; } = false;
/// <summary>
/// 验证规则是否适用于指定宏
/// </summary>
public bool AppliesToMacro(string macroName)
{
return IsDefaultRule || AllowedMacros.Contains(macroName);
}
/// <summary>
/// 验证用户上下文
/// </summary>
public bool Validate(string userContext)
{
return IsDefaultRule || AllowedUsers.Contains(userContext);
}
}
/// <summary>
/// 宏安全性信息类
/// </summary>
public class MacroSecurityInfo
{
public MacroSecurityLevel SecurityLevel { get; set; }
public int RuleCount { get; set; }
public DateTime LastUpdated { get; set; }
}数字签名管理
/// <summary>
/// 数字签名管理器 - 提供宏数字签名管理功能
/// </summary>
public class DigitalSignatureManager
{
private readonly IExcelApplication _application;
private readonly List<DigitalCertificate> _trustedCertificates;
public DigitalSignatureManager(IExcelApplication application)
{
_application = application ?? throw new ArgumentNullException(nameof(application));
_trustedCertificates = new List<DigitalCertificate>();
}
/// <summary>
/// 添加可信证书
/// </summary>
public void AddTrustedCertificate(DigitalCertificate certificate)
{
_trustedCertificates.Add(certificate);
Console.WriteLine($"添加可信证书: {certificate.Name}");
}
/// <summary>
/// 验证数字签名
/// </summary>
public SignatureValidationResult ValidateSignature(string macroName)
{
try
{
// 在实际应用中,这里需要检查宏的数字签名
// 简化实现:模拟验证过程
var result = new SignatureValidationResult
{
MacroName = macroName,
IsValid = true,
CertificateName = "模拟证书",
ValidationTime = DateTime.Now
};
return result;
}
catch (Exception ex)
{
return new SignatureValidationResult
{
MacroName = macroName,
IsValid = false,
ErrorMessage = ex.Message,
ValidationTime = DateTime.Now
};
}
}
/// <summary>
/// 获取可信证书列表
/// </summary>
public IEnumerable<DigitalCertificate> GetTrustedCertificates()
{
return _trustedCertificates.AsReadOnly();
}
}
/// <summary>
/// 数字证书类
/// </summary>
public class DigitalCertificate
{
public string Name { get; set; } = string.Empty;
public string Issuer { get; set; } = string.Empty;
public DateTime ExpiryDate { get; set; }
public string Thumbprint { get; set; } = string.Empty;
}
/// <summary>
/// 签名验证结果类
/// </summary>
public class SignatureValidationResult
{
public string MacroName { get; set; } = string.Empty;
public bool IsValid { get; set; }
public string CertificateName { get; set; } = string.Empty;
public string ErrorMessage { get; set; } = string.Empty;
public DateTime ValidationTime { get; set; }
}综合应用案例
完整的销售自动化系统
/// <summary>
/// 销售自动化系统 - 完整的销售数据处理自动化解决方案
/// </summary>
public class SalesAutomationSystem
{
private readonly MacroRecordingManager _recordingManager;
private readonly VbaMacroExecutionManager _vbaManager;
private readonly CustomFunctionManager _functionManager;
private readonly MacroSecurityManager _securityManager;
private readonly DigitalSignatureManager _signatureManager;
public SalesAutomationSystem(IExcelApplication application)
{
_recordingManager = new MacroRecordingManager(application);
_vbaManager = new VbaMacroExecutionManager(application);
_functionManager = new CustomFunctionManager(application);
_securityManager = new MacroSecurityManager(application);
_signatureManager = new DigitalSignatureManager(application);
InitializeSystem();
}
/// <summary>
/// 初始化系统
/// </summary>
private void InitializeSystem()
{
// 设置安全性
SetupSecurity();
// 注册自定义函数
RegisterCustomFunctions();
// 注册VBA宏
RegisterVbaMacros();
Console.WriteLine("销售自动化系统初始化完成");
}
/// <summary>
/// 设置安全性
/// </summary>
private void SetupSecurity()
{
// 设置宏安全性级别
_securityManager.SetMacroSecurityLevel(MacroSecurityLevel.EnableWithWarnings);
// 添加安全性规则
var salesRule = new SecurityRule
{
Name = "销售数据处理规则",
Description = "允许销售部门执行数据处理宏",
AllowedUsers = new List<string> { "销售主管", "数据分析师" },
AllowedMacros = new List<string> { "ProcessSalesData", "GenerateSalesReport" }
};
_securityManager.AddSecurityRule(salesRule);
// 添加默认规则
var defaultRule = new SecurityRule
{
Name = "默认安全规则",
Description = "基础安全控制规则",
IsDefaultRule = true
};
_securityManager.AddSecurityRule(defaultRule);
}
/// <summary>
/// 注册自定义函数
/// </summary>
private void RegisterCustomFunctions()
{
var commonFunctions = new CommonCustomFunctionManager(_functionManager);
commonFunctions.CreateFinancialFunctions();
commonFunctions.CreateStatisticalFunctions();
commonFunctions.CreateTextFunctions();
}
/// <summary>
/// 注册VBA宏
/// </summary>
private void RegisterVbaMacros()
{
_vbaManager.RegisterVbaMacro(
"ProcessSalesData",
"处理销售数据",
"SalesModule",
"ProcessSalesData",
VbaMacroType.Function);
_vbaManager.RegisterVbaMacro(
"GenerateSalesReport",
"生成销售报告",
"SalesModule",
"GenerateSalesReport",
VbaMacroType.Function);
_vbaManager.RegisterVbaMacro(
"SendSalesEmail",
"发送销售邮件",
"SalesModule",
"SendSalesEmail",
VbaMacroType.Function);
}
/// <summary>
/// 执行销售数据处理
/// </summary>
public object ProcessSalesData(string userContext, params object[] parameters)
{
// 验证执行权限
if (!_securityManager.ValidateMacroExecution("ProcessSalesData", userContext))
{
throw new UnauthorizedAccessException($"用户'{userContext}'没有执行销售数据处理的权限");
}
// 验证数字签名
var signatureResult = _signatureManager.ValidateSignature("ProcessSalesData");
if (!signatureResult.IsValid)
{
throw new SecurityException($"宏签名验证失败: {signatureResult.ErrorMessage}");
}
// 执行VBA宏
return _vbaManager.ExecuteVbaMacro("ProcessSalesData", parameters);
}
/// <summary>
/// 生成销售报告
/// </summary>
public object GenerateSalesReport(string userContext, params object[] parameters)
{
// 验证执行权限
if (!_securityManager.ValidateMacroExecution("GenerateSalesReport", userContext))
{
throw new UnauthorizedAccessException($"用户'{userContext}'没有生成销售报告的权限");
}
// 验证数字签名
var signatureResult = _signatureManager.ValidateSignature("GenerateSalesReport");
if (!signatureResult.IsValid)
{
throw new SecurityException($"宏签名验证失败: {signatureResult.ErrorMessage}");
}
// 执行VBA宏
return _vbaManager.ExecuteVbaMacro("GenerateSalesReport", parameters);
}
/// <summary>
/// 录制销售数据录入宏
/// </summary>
public RecordedMacro RecordSalesDataEntryMacro()
{
var dataEntryManager = new DataEntryMacroManager(_recordingManager);
return dataEntryManager.RecordDataEntryMacro();
}
/// <summary>
/// 获取系统安全信息
/// </summary>
public MacroSecurityInfo GetSecurityInfo()
{
return _securityManager.GetSecurityInfo();
}
}总结
本篇详细介绍了MudTools.OfficeInterop.Excel项目中的宏与VBA集成功能,包括宏录制执行、VBA代码编程调用、自定义函数创建以及安全性权限管理等关键技术。通过实际的代码示例和应用案例,展示了如何创建专业级的企业自动化解决方案。
核心要点回顾
- 宏录制执行:提供了完整的宏录制和管理功能,支持相对引用和绝对引用录制
- VBA编程调用:实现了VBA宏的编程调用,支持函数、工作表级别和模块级别的宏执行
- 自定义函数:创建了财务、统计、文本处理等领域的专用计算函数
- 安全性管理:提供了完善的宏安全性和权限管理,包括数字签名验证
- 综合应用:通过完整的销售自动化系统案例,展示了宏与VBA集成的实际应用
这些功能的应用能够显著提升Excel自动化的专业性和安全性,为企业级数据处理和业务流程自动化提供强有力的支持。