将 vba 转换为 vb6 并创建 .dll - 如何 - 提示、技巧和风险

发布于 2024-08-17 14:37:19 字数 1466 浏览 6 评论 0原文

我应该将用 VBA (Excel) 编写的大量代码转换为 VB6。但我真的不知道我必须照顾什么或从哪里开始。因此,如果能从 VB6 专家那里得到一些提示那就太好了。

我已经安装了 MS Visual Studio 并进行了一些尝试。但我不是 VB6 专家,并不真正知道我必须做什么。

最终目标是将当前放置在一个 Excel VBA 宏中的所有 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。

I should convert a huge load of code which was written in VBA (Excel) to VB6. But I really do not know what I have to take care of or where to begin. Therefore it would be great to get some hints here from the VB6 experts.

I installed already MS Visual Studio and played a bit around. But I'm not a VB6 expert and do not really know what I have to do.

The final goal is to have all the VBA code, which is currently placed in one excel vba macro into a VB6 project and create a .dll out of it. This .dll should be referenced by the excel and the excel should run like it does now :-)

For example what do I have to do to convert this vba code to 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

Edit: Yes and if it is possible to convert vba code into a .dll this would be fine also. Then I would not have to convert the code. But I think it is only possible to create a .dll out of vb6 code.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

淡淡離愁欲言轉身 2024-08-24 14:37:19

@Tom

好吧,我实际上正在和你一起学习这个,所以这里是

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 并检查 Register for COm interop

因此输出是 .DLL 和 .tlb ,Excel 文件应引用 .tlb 文件,

您必须通过 regasm /codebase c:\Excel 注册 DLL \dllname.dll

然后您可以从 Excel 访问该函数。

这是我的项目文件夹的链接,解压它,
对 .dll 的引用

您将找到一个 Excel 工作簿,其中包含通过 .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/

@Tom

Ok, I'm actually learning this with you, so here goes,

VB.Net code (I am using .net 2.0)


In Visual Studio 2005 open a new Class Library Project
Then remove all the garbage already written there and paste the code

'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



Build the solution by pressing F6
go to Project->Project Proerties and Check Register for COm interop

So the output is a .DLL and a .tlb , the Excel file should reference the .tlb file,

you have to register the DLL by regasm /codebase c:\Excel\dllname.dll

Then you can access the Function from Excel.

Heres a link to my project folder unrar it,
and you'll find a an excel workbook that contains a reference to the .dll via the .tlb

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

Heres another great article

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

过度放纵 2024-08-24 14:37:19

转换为 VB6 很容易。

  1. 创建 VB6 DLL 项目。在 Web 上搜索如何执行此操作以及如何公开方法、类和函数的说明。

  2. 添加对“Microsoft Office Excel ## 库”的引用。

  3. 在将作为 DLL 中的方法公开的项目过程中,添加以下代码:

    Dim E As Excel.Application
    设置 E = GetObject(, "Excel.Application")
    '或者如果 Excel 未运行,请使用 CreateObject("Excel.Application")
    “您可以使用错误处理来确定您需要哪一个。
    
  4. 继续使用常规 VBA 代码,进行一项修改:全局访问对象,例如 < code>ActiveSheet 或 ActiveWorkbookSheets 必须变为 E.ActiveSheetE.ActiveWorkbook 和 < code>E.Sheets。

如果您的 VBA 项目中有表单,则转换它们会需要更多工作,因为 VB6 和 VBA 中的表单完全不同(从长远来看,它们的工作方式并不相同)。

Converting to VB6 is easy.

  1. Create a VB6 DLL project. Search on the web for instructions how to do this and how to expose methods, classes, and functions.

  2. Add a reference to "Microsoft Office Excel ## library".

  3. In a procedure of the project that will be exposed as a method in the DLL, add the following code:

    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. Proceed with your normal VBA code, with one modification: Globally accessed objects such as ActiveSheet or ActiveWorkbook or Sheets must become E.ActiveSheet, E.ActiveWorkbook and E.Sheets.

If you have forms in your VBA project it will be a bit more work to convert them because forms are completely different in VB6 and VBA (they don't work the same by a long shot).

留一抹残留的笑 2024-08-24 14:37:19

@Tom Tom

将代码从 .VBA 转换为 vb6 应该没有问题。事实上,您实际上不需要这样做。

问题是在 VB6 上下文中,语言无法理解

“Application.Worksheets(a).range("C3").Value)”的含义,

对象 Application 在 VB6

VBA(您拥有的 VBA 版本)中具有不同的含义是几乎是 Excel(或 word 或 MSO 附带的任何内容)中 VB6 的自定义实现。

尝试从 VB6 访问 Excel UI 是一个坏主意(我什至不确定是否可能),

您应该做的是将业务逻辑与代码分开,然后将其放入 VB6 库中。

例如,您的代码(据我所知)返回单元格 C3 的值,

它与 Excel UI 密切相关,因此如果不是不可能将代码转换为 VB6,那将非常适得其反。

因为即使您转换代码,大多数变量(如 (Application.Worksheets(a).range("C3").Value) 也必须从 VBA 调用,这是毫无意义的,

但是如果您有任何其他纯业务逻辑,那么可以轻松移植(这很有趣,因为真的没有什么可移植的)

@Tom Tom

You should have no trouble in converting the code from .VBA to vb6.as a matter of fact you virtually don't have to.

The problem is in VB6 context, the langugae cannot understand what

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

the object Application has a different meaning in VB6

VBA (the VBA version you have) is almost a customized implementation of VB6 in Excel(or word , or anything that comes with MSO).

It would be a bad Idea to try to access Excel UI from VB6 (I'm not even sure if its possible )

what you should do is seperate the bussiness logic from the Code then make it into a VB6 library.

For example your code (as I understand) returns the value of the cell C3

It is very much tied to the Excel UI, so it would be very counter productive if not impossible to convert you code to VB6.

because even if you convert the code, most of the variables like (Application.Worksheets(a).range("C3").Value) must be called from VBA, which is pointless

however if you have any other pure Bussiness logic, that can be ported (its funny because theres really nothing to port) easily

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文