【发布时间】:2023-03-09 17:05:01
【问题描述】:
我在 bas 文件中有一个带有公共方法的 Excel VBA 加载项。此方法当前创建一个 VB6 COM 对象,该对象存在于正在运行的 VB6 exe/vbp 中。 VB6 应用程序加载数据,然后 Excel 加载项方法可以调用 VB6 COM 对象上的方法将数据加载到现有 Excel xls 中。这一切目前都在工作。
此后,我们将 VB6 应用程序转换为 C#。
我的问题是:用 C#/.NET 应用程序模仿这种行为的最好/最简单的方法是什么?
我在想我可能无法通过加载项方法将 .NET 应用程序中的数据提取到 Excel 中,因为 .Net 应用程序需要在加载数据的情况下运行(因此不使用独立的 C# 类库) .相反,也许我们可以通过从 C# 代码访问 VBA 加载项方法,将数据从 .NET 推送到 Excel?
以下是访问VB6应用程序的现有VBA方法:
Public Sub UpdateInDataFromApp()
Dim wkbInData As Workbook
Dim oFPW As Object
Dim nMaxCols As Integer
Dim nMaxRows As Integer
Dim j As Integer
Dim sName As String
Dim nCol As Integer
Dim nRow As Integer
Dim sheetCnt As Integer
Dim nDepth As Integer
Dim sPath As String
Dim vData As Variant
Dim SheetRange As Range
Set wkbInData = wkbOpen("InData.xls")
sPath = g_sPathXLSfiles & "\"
'Note: the following will bring up fpw app if not already running
Set oFPW = CreateObject("FPW.CProfilesData")
If oFPW Is Nothing Then
MsgBox "Unable to reference " & sApp
Else
.
.
.
sheetCnt = wkbInData.Sheets.Count 'get number of sheets in indata workbook
For j = 2 To sheetCnt 'set counter to loop over all sheets except the first one which is not input data fields
With wkbInData.Worksheets(j)
Set SheetRange = .UsedRange
End With
With SheetRange
nMaxRows = .Rows.Count 'get range of sheet(j)
nMaxCols = .Columns.Count 'get range of sheet(j)
Range(.Cells(2, 2), .Cells(nMaxRows, nMaxCols)).ClearContents 'Clears data from data range (51 Columns)
Range(.Cells(2, 2), .Cells(nMaxRows, nMaxCols)).ClearComments
End With
With oFPW 'vb6 object
For nRow = 2 To nMaxRows ' loop through rows
sName = SheetRange.Cells(nRow, 1) 'Field name
vData = .vntGetSymbol(sName, 0) 'Check if vb6 app identifies the name
nDepth = .GetInputTableDepth(sName) 'Get number of data items for this field name from vb6 app
nMaxCols = nDepth + 2 'nDepth=0, is single data item
For nCol = 2 To nMaxCols 'loop over deep screen fields
nDepth = nCol - 2 'current depth
vData = .vntGetSymbol(sName, nDepth) 'Get Data from vb6 app
If LenB(vData) > 0 And IsNumeric(vData) Then 'Check if data returned
SheetRange.Cells(nRow, nCol) = vData 'Poke the data in
Else
SheetRange.Cells(nRow, nCol) = vData 'Poke a zero in
End If
Next 'nCol
Next 'nRow
End With
Set SheetRange = Nothing
Next 'j
End If
Set wkbInData = Nothing
Set oFPW = Nothing
Exit Sub
.
.
.
End Sub
任何帮助将不胜感激。
【问题讨论】: