Вызов метода надстройки Excel из приложения C # или наоборот - PullRequest
0 голосов
/ 13 ноября 2009

У меня есть надстройка Excel VBA с открытым методом в bas-файле. Этот метод в настоящее время создает COM-объект VB6, который существует в работающем VB6 exe / vbp. Приложение VB6 загружает данные, а затем метод надстройки Excel может вызывать методы для COM-объекта VB6 для загрузки данных в существующий Excel xls. Это все в настоящее время работает.
С тех пор мы преобразовали наше приложение VB6 в C #.
Мой вопрос: каков наилучший / самый простой способ имитировать это поведение с приложением C # / .NET? Я думаю, что не могу получить данные из приложения .NET в Excel из метода надстройки, поскольку приложение .Net должно работать с загруженными данными (поэтому не следует использовать автономную библиотеку классов C #) , Может быть, мы можем вместо этого перенести данные из .NET в Excel, используя метод надстройки VBA из кода C #?
Ниже приведен существующий метод VBA для доступа к приложению VB6:

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  

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 16 ноября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...