Преобразование VBA в VBS

У меня есть небольшой скрипт 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? Спасибо.


person dan    schedule 30.11.2012    source источник
comment
Если вам нужно Access.Application.Quit, вероятно, ваш VBScript должен автоматизировать экземпляр приложения Access. И если вы это сделаете, исходный код VBA может работать без изменений в экземпляре Access.   -  person HansUp    schedule 30.11.2012
comment
@HansUp Очевидно, мне не нужен Access.Application.Quit, потому что интерфейса нет вообще, я просто завершаю скрипт, и работа сделана. Однако меня по-прежнему интересует ваше решение: запуск экземпляра Access без изменений. Целью этого проекта Access 2003 MDB является сжатие всех других баз данных. Существует небольшой графический интерфейс с несколькими кнопками для выбора базы данных для сжатия. Это работает очень хорошо. Однако теперь я хочу, чтобы вся работа выполнялась автоматически раз в неделю, когда всех нет дома. Вот почему я создал сценарий VBS, который Windows может запускать со встроенным планировщиком заданий.   -  person dan    schedule 30.11.2012
comment
(очевидно, сценарий VBS сжимает ВСЕ базы данных без какого-либо графического интерфейса и выводит результаты в файл журнала)   -  person dan    schedule 30.11.2012
comment
Set objAccess = CreateObject("Access.Application") Это ключевое назначение объекта для COM-автоматизации MS Access. Вы должны быть в состоянии найти множество подробных примеров с небольшим поиском.   -  person HansUp    schedule 30.11.2012
comment
+1, спасибо, это похоже на надежное решение моей проблемы, и мне не придется иметь дело с VBS. Но просто для сведения, как вы думаете, возможно ли преобразовать объявление функции GetPrivateProfileString() из библиотеки kernel32 в VBS?   -  person dan    schedule 30.11.2012
comment
Я тоже задавался этим вопросом. Я никогда не пытался сделать это ни в одном из своих сценариев VBScript. Я нашел это обсуждение: forums.codeguru. com/ Я не знаю, является ли это окончательным ответом, но это не звучит многообещающе. Пожалуйста, дайте нам знать, если вы можете найти способ сделать это.   -  person HansUp    schedule 30.11.2012


Ответы (2)


Поскольку у вас есть MDB, который делает то, что вы хотите, запустите сценарий VBS, чтобы открыть этот mdb, и настройте макрос AutoExec для запуска функций, которые сжимают эти базы данных, а затем самостоятельно закрывают MDB. Это немного хакерски, но может оказаться наименее хлопотным.

person HelloW    schedule 30.11.2012
comment
Это похоже на надежное решение, о котором я не подумал, я поищу, как использовать CreateObject("Access.Application"), предоставленный HansUp, и попробую. - person dan; 30.11.2012

Жаль, что я не видел этого раньше, в любом случае, для дальнейшего использования здесь чистое решение 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
person peter    schedule 30.11.2012
comment
+1 за поворот, но он (очевидно) не использует функцию библиотеки kernel32. Но я понимаю, что это будет работать нормально. Однако я просто вставил эту часть кода, чтобы показать, с какой проблемой я столкнулся. Если на самом деле нет способа вернуть значение из функции VBS, это означает, что мне нужно начать с нуля, чтобы выполнить ту же работу, что и мой модуль VBA. VBA и VBS, несмотря на то, что они отличаются всего одной буквой, теперь выглядят НАМНОГО разными. Совсем не тот язык/синтаксис. - person dan; 30.11.2012
comment
в данном случае не из-за ядра32, которое сложно (но не невозможно) использовать в vbscript, но я мог бы привести примеры, в которых разница минимальна. Основное преимущество этого скрипта в том, что его можно использовать самостоятельно, без предварительной загрузки базы данных и последующего обращения к библиотеке. Если вам не нужна база данных для чего-то другого, ускорение будет значительным. - person peter; 01.12.2012
comment
@peter Ну, мне нужно прочитать INI-файл, чтобы получить все пути к базе данных, затем я хочу сделать резервную копию каждой базы данных, а затем сжать каждую. Думаю, мне не нужно запускать MDB, нет, но, учитывая, что эта процедура будет выполняться в одночасье, производительность не так важна, как экономия времени на преобразование всего этого кода каждый раз, когда я немного редактирую. - person dan; 04.12.2012
comment
если вы все равно запускаете vbs, оптимальным является сохранение всей логики там, вам не нужен ini для сохранения путей, подойдет простой массив (путь1, путь2,..), откройте их с помощью кода vba в вашем vbs, сделать резервную копию и сжать их там, очевидно, вам нужно также вести журнал, что также лучше всего сделать в vbs ... просто мое мнение - person peter; 04.12.2012