Преобразование vba в vb6 и создание .dll - инструкции - подсказки, советы и риски

Мне нужно преобразовать огромное количество кода, написанного на VBA (Excel), в VB6. Но я действительно не знаю, о чем мне нужно позаботиться и с чего начать. Поэтому было бы здорово получить здесь подсказки от экспертов VB6.

Я уже установил MS Visual Studio и немного поигрался. Но я не эксперт по VB6 и толком не знаю, что мне делать.

Конечная цель - поместить весь код VBA, который в настоящее время помещен в один макрос excel vba, в проект VB6 и создать на его основе .dll. На эту .dll должна ссылаться excel, и excel должен работать так же, как сейчас :-)

Например, что мне нужно сделать, чтобы преобразовать этот код vba в VB6.

Public Function getParameterNumberOfMaterial() As Integer
10        On Error Resume Next
          Dim a As String
20        a = Sheets("Parameters").name

30        If IsNumeric(Application.Worksheets(a).range("C3").Value) Then
40            If Application.Worksheets(a).range("C3").Value > 0 Then

50                getParameterNumberOfMaterial = Application.Worksheets(a).range("C3").Value
60            Else
70                MsgBox "Please check cell C3 in the sheet 'Parameters'. It should include a numeric value which is greater than zero"
80                MsgBox "Parameter Number of Material/Cost is set to the default value of 10"
90                getParameterNumberOfMaterial = 10
100           End If
110       Else
120           MsgBox "Please check cell C3 in the sheet 'Parameters'. It should include a numeric value which is greater than zero"
130           MsgBox "Parameter Number of Material/Cost is set to the default value of 10"
140           getParameterNumberOfMaterial = 10
150       End If
160       On Error GoTo 0
End Function

Изменить: Да, и если можно преобразовать код vba в .dll, это тоже будет хорошо. Тогда мне не пришлось бы преобразовывать код. Но я думаю, что из кода vb6 можно создать только .dll.


person Thomas Kremmel    schedule 11.01.2010    source источник
comment
Можете ли вы рассмотреть возможность использования .NET?   -  person Rubens Farias    schedule 11.01.2010
comment
На самом деле да. Но в проекте vba около 8000 лок. Я думаю, преобразовать его в .NET было бы ужасной работой. Я думал, что vb6 имеет похожий синтаксис, и поэтому работы не составит большого труда. Как вы думаете, было бы неплохо выбрать .NET?   -  person Thomas Kremmel    schedule 11.01.2010


Ответы (3)


@Том

Хорошо, я на самом деле изучаю это вместе с вами, так что давайте,

Код VB.Net (я использую .net 2.0)


В Visual Studio 2005 откройте новый проект библиотеки классов. Затем удалите весь уже написанный там мусор и вставьте код.

'First thing to do is add a reference the Excel Runtime

Imports Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices


Namespace ExcelExample

' the following is an Attribute spcifying that the class can be accesses in a unmanaged (non-.net) way

Imports Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices


 Public Class ExcelVB


    Public Function getParameterNumberOfMaterial() As Integer
        On Error Resume Next
        Dim a As String
        Dim appInst As New Microsoft.Office.Interop.Excel.Application
        a = appInst.Sheets("Parameters").name

        If IsNumeric(appInst.Worksheets(a).range("C3").Value) Then
            If appInst.Worksheets(a).range("C3").Value > 0 Then

                getParameterNumberOfMaterial = appInst.Worksheets(a).range("C3").Value
            Else
                MsgBox("Please check cell C3 in the sheet 'Parameters'. It should include a numeric value which is greater than zero")
                MsgBox("Parameter Number of Material/Cost is set to the default value of 10")
                getParameterNumberOfMaterial = 10
            End If
        Else
            MsgBox("Please check cell C3 in the sheet 'Parameters'. It should include a numeric value which is greater than zero")
            MsgBox("Parameter Number of Material/Cost is set to the default value of 10")
            getParameterNumberOfMaterial = 10
        End If
        On Error GoTo 0
    End Function
End Class

End Namespace



Создайте решение, нажав F6, перейдите в Project-> Project Proerties и проверьте регистр для взаимодействия COm.

Таким образом, на выходе получается .DLL и .tlb, файл Excel должен ссылаться на файл .tlb,

вам необходимо зарегистрировать DLL с помощью regasm / codebase c: \ Excel \ dllname.dll

Затем вы можете получить доступ к функции из Excel.

Вот ссылка на мою папку проекта, разархивируйте ее, и вы найдете книгу Excel, которая содержит ссылку на .dll через .tlb

http://cid-4af152a1af4d7db8.skydrive.live.com/self.aspx/Documents/Debug.rar

Вот еще одна отличная статья

http://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/

person Vivek Bernard    schedule 11.01.2010
comment
Потрясающий!!!!!!!!!!!!!! Вивек, огромное тебе спасибо !!!!! Я просто могу сказать: ВАУ. Могу я заплатить вам пиво или что-то в этом роде? ;-) Надеюсь, вам понадобятся эти знания самому. Я попробую завтра. - person Thomas Kremmel; 11.01.2010
comment
Я бы с удовольствием выпил пива, но для меня это незаконно ... спасибо, вообще-то, ты заставлял меня много ковыряться ... - person Vivek Bernard; 12.01.2010
comment
Так что .. без пива ;-) Привет, спасибо еще раз. Это действительно хорошо работает + статья поможет мне начать. Собственно в феврале я начну рефакторинг кода. Если вас интересуют идеи, которые я понимаю, я могу отправить их вам. На самом деле ... 8000 loc ... вероятно, у меня будет какое-то понимание ;-) Еще раз спасибо за то, что помогли мне начать. Я занимался этой темой уже несколько дней. - person Thomas Kremmel; 12.01.2010

Конвертировать в VB6 легко.

  1. Создайте проект DLL VB6. Поищите в Интернете инструкции, как это сделать и как предоставлять методы, классы и функции.

  2. Добавьте ссылку на «Библиотеку Microsoft Office Excel ##».

  3. В процедуру проекта, которая будет представлена ​​как метод в DLL, добавьте следующий код:

    Dim E As Excel.Application
    Set E = GetObject(, "Excel.Application")
    'or if Excel is not running use CreateObject("Excel.Application")
    'You can use error handling to figure out which one you need.
    
  4. Продолжайте использовать свой обычный код VBA с одной модификацией: глобально доступные объекты, такие как ActiveSheet, ActiveWorkbook или Sheets, должны стать E.ActiveSheet, E.ActiveWorkbook и E.Sheets.

Если у вас есть формы в вашем проекте VBA, будет немного больше работы по их преобразованию, потому что формы совершенно разные в VB6 и VBA (они не работают одинаково, по большому счету).

person ErikE    schedule 21.12.2012

@Tom Tom

У вас не должно возникнуть проблем с преобразованием кода из .VBA в vb6. Фактически, в этом нет необходимости.

Проблема в контексте VB6, langugae не может понять, что

«Application.Worksheets (a) .range (« C3 »). Value)» означает,

объект Application имеет другое значение в VB6

VBA (имеющаяся у вас версия VBA) - это почти индивидуальная реализация VB6 в Excel (или word, или что-либо еще, что поставляется с MSO).

Было бы плохой идеей попытаться получить доступ к пользовательскому интерфейсу Excel из VB6 (я даже не уверен, возможно ли это)

вам следует отделить бизнес-логику от кода, а затем превратить ее в библиотеку VB6.

Например ваш код (насколько я понимаю) возвращает значение ячейки C3

Он очень сильно привязан к пользовательскому интерфейсу Excel, поэтому было бы очень непродуктивно, если вообще возможно, преобразовать ваш код в VB6.

потому что даже если вы конвертируете код, большинство переменных, таких как (Application.Worksheets (a) .range ("C3"). Value), должны вызываться из VBA, что бессмысленно

однако, если у вас есть другая чистая бизнес-логика, ее можно легко портировать (это забавно, потому что портировать действительно нечего)

person Vivek Bernard    schedule 11.01.2010
comment
Спасибо за ответ. Вы уверены, что это невозможно? Я прочитал статью об этом, и насколько я понимаю эту статью, они говорят, что это возможно: mrexcel.com/forum/showpost.php?p=954128&postcount=17. - person Thomas Kremmel; 11.01.2010
comment
Привет, @Tom Tom! Я имел в виду, что вы не можете ссылаться на переменные, связанные с VBA, такие как Application.Worksheets (a) .range (C3) .Value) в VB6. Если вы посмотрите статью mrexcel.com/forum/showpost.php? p = 954128 & postcount = 17 более внимательно вы увидите, что нет ни одной строчки кода, которая обращается к такой переменной, как Application.Worksheets (a) .range (C3). Value Evrything - это чистый VB6 (только бизнес-логика) Если у вас такой код, вы наверняка сможете его преобразовать. ты понимаешь, о чем я? - person Vivek Bernard; 11.01.2010
comment
Да, я понимаю, о чем вы. Но они также заявляют, что :) Также обратите внимание, что мы ничего не использовали в объектной модели Excel в приведенном выше примере. Большая часть вашего кода, несомненно, будет использовать множество объектов в библиотеках Excel и Office. Преобразование кода VBA в код VB обычно так же просто, как добавление ссылки в Excel, а затем полная квалификация ваших объектов. Вам также нужно будет распространить файлы lib и exp вместе с вашей dll. - person Thomas Kremmel; 11.01.2010
comment
Большая часть кода на самом деле жестко привязана к превосходству. Тем не менее было бы здорово создать из него .dll, так как процесс обновления будет намного проще. Представьте, с одной стороны, мне нужно собрать все книги Excel, а с другой стороны, я просто обновляю указанный .dll, и все работает нормально. - person Thomas Kremmel; 11.01.2010
comment
Привет, Том Том Только что понял, это жизнеспособно, пожалуйста, создайте библиотеку классов VB6, просто попробовал с VB.Net, это сработало ... Так мне и надо, :) - person Vivek Bernard; 11.01.2010
comment
Привет, Вивек, было бы здорово, если бы ты мог мне помочь. На самом деле, если это служит моим целям, я также мог бы использовать VB.net. Единственное, что раньше я никогда не пользовался VB.net. Больше JAVA и автоматизация excel с парнем vba ;-) Мне бы очень помогло, если бы вы опубликовали свой код VB.Net, о котором вы говорили, в новом ответе + добавьте несколько комментариев, которые могли бы помочь мне реализовать его самостоятельно. Большое спасибо. - person Thomas Kremmel; 11.01.2010
comment
Почему было бы плохой идеей пытаться получить доступ к пользовательскому интерфейсу Excel из VB6? Это прекрасно и возможно. Добавьте ссылку на MS Office Excel, затем объявите переменную Dim Ex As Excel.Application, а затем выполните всю автоматизацию для этого. Совершенно верно! - person ErikE; 22.12.2012