Конвертировать VBA в VB6 и создать. DLL - как - советы, советы и риски - PullRequest
4 голосов
/ 11 января 2010

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

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

Конечная цель - собрать весь код VBA, который в настоящее время помещен в один макрос VBA Excel, в проект 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, это также будет хорошо. Тогда бы мне не пришлось конвертировать код. Но я думаю, что возможно создать .dll только из кода vb6.

Ответы [ 3 ]

5 голосов
/ 11 января 2010

@ Том

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

код 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 и Check Register для взаимодействия COm

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

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

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

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

http://cid -4af152a1af4d7db8.skydrive.live.com / self.aspx / Документы / Debug.rar

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

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

2 голосов
/ 22 декабря 2012

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

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

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

  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 (они долго не работают одинаково).

0 голосов
/ 11 января 2010

@ Том Том

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

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

"Application.Worksheets (a) .range (" C3 "). Value)",

объект. Приложение имеет другое значение в VB6

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

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

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

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

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

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

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

...