• 使用vba调用vb.net封装的dll,出现453错误


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Bad_Strawberry 2024-04-10 11:16 采纳率: 25% 浏览 3 首页/ 微软技术 / 使用vba调用vb.net封装的dll,出现453错误 .netvisual studio 我试着用vb.net写一个dll,并且用vba调用它,但出现453错误,确定路径及函数名称是正确的,我不知道是什么原因导致这个错误 程式有点长,简单的说就是这只程式主要根据使用者输入的资料型态建立1000000笔的乱数并排序存入excel Imports Microsoft.Office.Interop Imports System.Runtime.InteropServices Public Class Class1 Function processData(index As String) Dim amount As Integer = 1000000 Dim rnds As New Random(DateTime.Now.Millisecond) Dim stopwatch As New Stopwatch() stopwatch.Start() Dim data(amount - 1) As Object For i As Integer = 0 To amount - 1 Select Case index Case "int" data(i) = rnds.Next(Integer.MinValue, Integer.MaxValue) + rnds.Next(0, 2) Case "char" data(i) = rnds.Next(-128, 128) Case "float" Dim floatMin As Single = Single.MinValue Dim floatMax As Single = Single.MaxValue Dim floatRandom As Single = CSng(floatMin + rnds.NextDouble() * (floatMax - floatMin)) data(i) = floatRandom Case "double" Dim doubleMin As Double = Double.MinValue Dim doubleMax As Double = Double.MaxValue Dim doubleRandom As Double = doubleMin + rnds.NextDouble() * (doubleMax - doubleMin) data(i) = doubleRandom Case "unsigned char" data(i) = rnds.Next(0, 256) Case "long" data(i) = rnds.Next(-2147483648, 2147483647) + rnds.Next(0, 2) Case "short" data(i) = rnds.Next(Short.MinValue, Short.MaxValue) End Select Next stopwatch.Stop() Dim generateTime As TimeSpan = stopwatch.Elapsed Console.WriteLine("Generate time: " & generateTime.TotalSeconds & " seconds") stopwatch.Start() Array.Sort(data) If index = "float" Then For i As Integer = 0 To data.Length - 1 Dim str As String = String.Format("{0:F10}", data(i)) If str.Length > 10 Then data(i) = str.Substring(0, 10) Else data(i) = str End If Next End If If index = "double" Then For i As Integer = 0 To data.Length - 1 Dim str As String = String.Format("{0:F10}", data(i)) If str.Length > 10 Then data(i) = str.Substring(0, 10) Else data(i) = str End If Next End If stopwatch.Stop() Dim sortTime As TimeSpan = stopwatch.Elapsed Console.WriteLine("Sort time: " & sortTime.TotalSeconds & " seconds") Dim sortArray(amount - 1, 0) As Object For i = 0 To amount - 1 sortArray(i, 0) = data(i) Next Dim excelApp As Object = Nothing Dim workbook As Excel.Workbook = Nothing Dim worksheet As Excel.Worksheet = Nothing Try excelApp = CreateObject("Excel.Application") workbook = excelApp.Workbooks.Add() worksheet = workbook.Worksheets(1) worksheet.Range("A1").Resize(sortArray.GetLength(0), 1).Value = sortArray 'worksheet.Range("A1").Resize(sortArray.GetLength(0), 1).NumberFormat = "0" workbook.SaveAs("C:\Users\Desktop\sortout.xls") Catch ex As Exception Console.WriteLine("Error: " & ex.Message) Finally If worksheet IsNot Nothing Then Marshal.ReleaseComObject(worksheet) If workbook IsNot Nothing Then Marshal.ReleaseComObject(workbook) If excelApp IsNot Nothing Then Marshal.ReleaseComObject(excelApp) End Try Console.WriteLine("Total execution time: " & generateTime.TotalSeconds + sortTime.TotalSeconds & " seconds") End Function End Class 以下是我的VBA Declare PtrSafe Function processData Lib "C:\Users\Documents\Visual Studio 2015\Projects\randomdata\randomdata\bin\x64\Debug\randomdata.dll" (ByVal index As String) Sub CallProcessData() Dim index As String index = InputBox("Enter data type (int, char, float, double, unsigned char, long, short): ") processData index MsgBox "Data processed and saved to Excel successfully!" End Sub 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • GISer Liu 2024-04-10 12:33
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      问题分析:

      1. 根据错误代码453,这是VB6的错误代码,表示找不到指定的 DLL 项目文件。在这种情况下,通常是因为DLL无法正确加载或路径错误。
      2. 在VB.NET中编写DLL,并在VBA中调用时,需要确保DLL能够正确加载,并且路径设置正确。
        解决方案:
      3. 确保DLL能够正确加载。可能需要将DLL文件放置在VBA可以访问到的路径中,或者在VBA中正确指定DLL的路径。
      4. 检查VBA代码中对DLL的路径设置是否正确。路径应该是绝对路径,而不是相对路径。
      5. 确保VB.NET代码编译生成的DLL是针对64位的,因为你的VBA声明中使用了x64路径,这意味着你的DLL应该是64位的。如果是32位的DLL,则应该将VBA声明中的路径改为x86路径。
        代码修改建议:
      6. 确保VB.NET代码编译生成的DLL是64位的,然后将VBA声明中的路径改为对应的x64路径。
      7. 确保VBA中的processData函数调用时的参数传递正确,确保与VB.NET代码中的函数参数类型和顺序一致。
        修改后的VBA代码示例:
        vbaCopy code
        Declare PtrSafe Function processData Lib "C:\Users\Documents\Visual Studio 2015\Projects\randomdata\randomdata\bin\x64\Debug\randomdata.dll" (ByVal index As String) As Long
        Sub CallProcessData()
        Dim index As String
        index = InputBox("Enter data type (int, char, float, double, unsigned char, long, short): ")
        Dim result As Long
        result = processData(index)
        MsgBox "Data processed and saved to Excel successfully!"
        End Sub
        
        这样修改后,应该能够正确加载DLL并调用其中的函数了。如果仍然遇到问题,可能需要进一步检查DLL的编译设置、路径设置等是否正确。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-10 14:06
      关注

      【相关推荐】



      • 这篇博客: 在vb.net下如何操作已经打开的活动excel文件中的 一、原理是什么 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

        在两个不同的实体(两个线程或者进程甚至机器、在Managed和Unmanaged之间、托管和非托管之间)进行方法调用和参数传递的时候,具体的调用方法和参数的内存格式可能需要一定的转换,这个转换的过程叫做Marshal。

        Marshal就是把一个结构(类)序列化成一段内存,然后送到另一个进程(.net中Application domain)中供另一个进程中的函数使用。
        比如你的一个结构
        我理解的就是通过Marshal能够把一些进程给送到我们现在使用 的Excel.Application 中来


      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 00:07
      关注

      上午好☀️☀️☀️️
      本答案参考ChatGPT-3.5

      针对此问题,我提供以下解决方案:

      1. 确认函数名称和路径是否正确。从错误代码可以看出,453错误通常是由于名称不正确或程序集中未定义的名称而导致的。确保DLL的函数名正确,并确认文件路径是否正确。

      2. 使用Regasm工具注册DLL。请确保使用Regasm工具注册DLL,以确保它在系统中被正确安装和支持。

      3. 确保DLL和VBA使用匹配的平台位数。如果DLL是64位,但VBA是32位,则会发生错误。确保DLL和VBA使用相同的位数。

      以下是修改后的VBA代码,支持64位的DLL:

      Private Declare PtrSafe Function processData Lib "C:\Users\Documents\Visual Studio 2015\Projects\randomdata\randomdata\bin\Debug\randomdata.dll" (ByVal index As String) As Long

      Sub test() Dim ret As Long ret = processData("float") End Sub

      希望这些解决方案能够帮助到您!

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    网页游戏的测试流程
    【数学建模】层次分析
    校园新闻网站|基于SpringBoot+ Mysql+Java+B/S结构的校园新闻网站设计与实现(可运行源码+数据库+设计文档+部署说明)
    PLC中ST编程的自定义功能块
    构建基于 Ingress 的全链路灰度能力
    敏捷.敏捷项目管理第二版.Jim Highsmith
    二苯并环辛炔DBCO共价连接负载葡聚糖纳米粒子(IDNP)
    C语言典范编程
    mariadb 数据库连接使用
    爱上开源之golang入门至实战第三章goroutine分析
  • 原文地址:https://ask.csdn.net/questions/8086142