【问题标题】:Convert VBA to VBS将 VBA 转换为 VBS
【发布时间】:2012-12-01 01:07:48
【问题描述】:

我有一个带有一些功能的小 VBA 脚本,我想将其转换为单个 VBS 文件。

这是我得到的一个例子:

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Function ReadIniFileString(ByVal Sect As String, ByVal Keyname As String) As String
    Dim Worked As Long
    Dim RetStr As String * 128
    Dim StrSize As Long
    Dim iNoOfCharInIni As Integer
    Dim sIniString, sProfileString As String

    iNoOfCharInIni = 0
    sIniString = ""
    If Sect = "" Or Keyname = "" Then
        MsgBox "Erreur lors de la lecture des paramètres dans " & IniFileName, vbExclamation, "INI"
        Access.Application.Quit
    Else
        sProfileString = ""
        RetStr = Space(128)
        StrSize = Len(RetStr)
        Worked = GetPrivateProfileString(Sect, Keyname, "", RetStr, StrSize, IniFileName)
        If Worked Then
            iNoOfCharInIni = Worked
            sIniString = Left$(RetStr, Worked)
        End If
    End If
    ReadIniFileString = sIniString
End Function

然后,我需要使用此函数将一些值放入字符串中。 VBS 似乎不喜欢我的任何 var 声明 ((Dim) MyVar As MyType)。

如果我能够使该代码适应 VBS,我应该也能够完成我的其余功能。如何将其调整/转换为 VBS?谢谢。

【问题讨论】:

  • 如果您需要Access.Application.Quit,您的VBScript 可能应该自动化Access 应用程序实例。如果您这样做,原始 VBA 代码可能会在 Access 实例中原封不动地工作。
  • @HansUp 很明显,我不需要Access.Application.Quit,因为根本没有接口,我只是结束脚本,工作就完成了。但是,我仍然对您的解决方案感兴趣:运行未更改的 Access 实例。此 Access 2003 MDB 项目的目的是压缩所有其他数据库。有一个带有一些按钮的小 GUI,用于选择要压缩的数据库。它工作得很好。但是,我现在想在每个人都外出时,每周自动完成所有工作。这就是为什么我创建了一个 Windows 可以使用集成的任务计划程序运行的 VBS 脚本。
  • (很明显,VBS 脚本会在没有任何 GUI 的情况下压缩所有数据库,并将结果输出到日志文件中)
  • Set objAccess = CreateObject("Access.Application") 这是 MS Access 的 COM 自动化的关键对象分配。您应该能够通过一些搜索找到大量详细的示例。
  • +1,谢谢,它看起来是解决我问题的可靠方法,我不必处理 VBS。但是仅供参考,您认为可以将GetPrivateProfileString() 函数的声明从 kernel32 lib 转换为 VBS 吗?

标签: vba ms-access vbscript converter


【解决方案1】:

很遗憾,我之前没有看到这一点,无论如何,为了将来参考这里是一个纯 vbscript 解决方案,用于从 ini 文件中读取值。如果有人需要对使用的正则表达式进行解释,请发表评论。

'this is the contents of test.ini'
' [Brussels]
' Address = "Postbox 3245_58348 Brussels"

' [Copenhagen]
' Address = "Postbox 2455_5478347 Copenhagen"

' [Paris]
' Address = "Postbox 8546_5412557 Paris"

section = "Brussels"
key = "Address"

const ForReading = 1
set fso = CreateObject("Scripting.FileSystemObject")
set file = fso.OpenTextFile("test.ini", ForReading)

'returns "Postbox 3245_58348 Brussels"'
wscript.echo get_key_of_ini(file.readall, section, key)

function get_key_of_ini(readFile, section, key)
  set regEx = New RegExp
  with regEx
    .Pattern = "(\[" & section & "\]\r\n)([^\[]+)"
    .IgnoreCase = True 
    .Global = True
  end With

  set matches  = regEx.execute(readFile)
  for x = 0 to matches.count-1
    set match = matches(x)
    For i = 1 To match.subMatches.count-1
      subMatches = match.SubMatches(i)
      if trim(split(match.SubMatches(i),"=")(0)) = key then
        get_key_of_ini = trim(split(match.SubMatches(i),"=")(1))
      end if
    Next
  next
end function

【讨论】:

  • +1 用于周转,但它(显然)不使用 kernel32 库的功能。但我知道它会正常工作。但是,我只是粘贴了那部分代码以显示我面临的问题类型。如果真的没有办法从 VBS 函数返回值,这意味着我必须从头开始才能完成与我的 VBA 模块相同的工作。 VBA 和 VBS,尽管只有一个字母不同,但现在看起来 A LOT 不同。完全不同的语言/语法。
  • 在这种情况下不是因为 kernel32,这在 vbscript 中很难(但并非不可能)使用,但我可以给你一些差异最小的例子。该脚本的主要优点是它可以单独使用,而无需先加载数据库,然后再调用库。如果您不需要数据库来做其他事情,那么加速将是巨大的
  • @peter 好吧,我需要读取一个 INI 文件以获取所有数据库路径,然后我想对每个数据库进行备份,然后压缩每个数据库。我想我并不真的需要运行 MDB,不,但考虑到这个例程将在一夜之间运行,性能并不是问题,而是每次我进行一点编辑时节省转换所有这些代码的时间。
  • 如果你无论如何都启动一个 vbs,最佳的是将所有逻辑保留在那里,你不需要 ini 来保留路径,一个简单的 Array(path1, path2,..) 就可以了,打开它们在你的 vbs 中使用 vba 代码,在那里备份和压缩它们,显然你还需要记录 vbs 中最好的操作......只是我的意见
【解决方案2】:

既然你有一个 MDB 做你想做的事,运行 VBS 脚本来打开这个 mdb 并设置 AutoExec 宏来运行压缩这些数据库的函数,然后自动关闭 MDB。这有点 hacky,但可能被证明是最不麻烦的。

【讨论】:

  • 这似乎是一个我没有想到的可靠解决方案,我将搜索如何使用HansUp提供的CreateObject("Access.Application")并尝试一下。
猜你喜欢
  • 2023-03-26
  • 2015-05-24
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2016-06-09
相关资源
最近更新 更多