VBS макрос Метод Выполнение объекта 'IWshShell3' не удалось только дроссели на большие файлы Word - PullRequest
2 голосов
/ 13 января 2020

Я действительно новичок в VBA. Я вставил только последнюю часть этого саба, но могу помочь, если поможет. Буду признателен за любую помощь. Я искал несколько дней, но большинство проблем с этой ошибкой вызвано пробелами в имени пути. Спасибо большое!

Этот макрос читает заголовок, затем каждую таблицу в открытом документе Word, а затем записывает каждую строку в переменную htmlFile. Затем он запускает файл PowerShell ps1, который записывает файл HTML в путь сохранения.

Отлично работает на меньших документах Word, но когда я запускаю его на больших файлах, я получаю эту ошибку:

Ошибка времени выполнения '-2147024690 (800700ce)': сбой метода «Выполнение» объекта «IwshShell3»

Код (все в подпрограмме перед этим битом считывало каждую таблицу в открытом слове выполните c и запишите htmlFile в виде HTML кода):

Sub WriteHtml()
    Dim htmlFile AS String, strText As String

    '
    ' fill htmlFile with HTML code ...

    htmlFile = htmlFile & strText

    Dim pwFileLocation, htmlFileLocation As String
    pwFileLocation = "'O:\Docketbk\DocketToWeb\processFile.ps1'"

    'htmlFileLocation = "'W:" & stringSplits(1) & "'"
    htmlFileLocation = "'Q:\OIT\Web Sites\This Site\Regulatory\Docketbk\" & stringSplits(1) & "'"
    fileNameFinal = Left(ActiveDocument.Name, InStrRev(ActiveDocument.Name, ".") - 1) & ".html"

    Dim shell, command1
    command1 = "powershell -noexit -command powershell.exe -Executionpolicy Bypass -File " & pwFileLocation & "-htmlContent ""'" & htmlFile & """' -savePath " & htmlFileLocation & " -fileName """ & fileNameFinal & """"
    Set shell = CreateObject("WScript.Shell")
    shell.Run command1, 1

End Sub

КОД МОЩНОСТИ:

param(
   [string] $htmlContent,
   [string] $savePath,
   [string] $fileName
)
$fullFilePath = $savePath + "\" + $fileName 

Function CreateHtmlFile()
{
        if (!(Test-Path -Path $fullFilePath)){
            New-Item  $fullFilePath -ItemType File
            WriteHtmlFile       
        } else {
             WriteHtmlFile
        }
}
Function WriteHtmlFile()
{
        Set-Content $fullFilePath $htmlContent.Replace('$DubQ','"')     
}
createHtmlFile

КОД ПЕРЕМЕЩЕНИЯ МОЩНОСТИ:

param(
   [string] $oldFileLocation,
   [string] $newFileLocation
)

net use W: \\MYSERVERNAME\Websites\PUC\Regulatory\Docketbk

Function MoveFile
{
    $moveDirectory = $oldFileLocation + "/*" 
    Copy-Item -Path $MoveDirectory  -Destination $newFileLocation -Container -Recurse -force
}

MoveFile

1 Ответ

0 голосов
/ 13 января 2020

Я болею за простоту. И большинство (если не все) ваши проблемы, похоже, происходят от , а не , что делает его простым. У вас слишком много движущихся частей, слишком много уровней косвенности. Вы можете попытаться решить эту проблему, взглянув на нее, и вы можете попытаться упростить свой подход.

Все, что вы делаете - создаете строку HTML, записываете ее в файл, копируете папки - можно достигнуто в коде VBA. Я не вижу ничего, что потребовало бы PowerShell.

Для операций с файловой системой Scripting.FileSystemObject очень удобно, и его использует следующий код. Давайте сделаем это доступным путем обращения к библиотеке «Microsoft Scripting Runtime» через меню «Инструменты» → «Ссылки» в VBA IDE.

Теперь у нас есть две базовые c операции, создающие HTML из исходного документа и записи данного текста в файл.

Dim FSO As New Scripting.FileSystemObject

Function CreateHtml(sourceDoc As Document) As String
    ' Creates HTML from the tables of the given document.
    Dim html As String, text As String

    ' ... build html from sourceDoc
    html = html & text

    CreateHtml = html
End Function

Sub WriteTextToFile(content As String, path As String, Optional fileName As String)
    ' Writes a string to a Unicode file. Target will be overwritten if it exists.
    Dim targetPath As String

    If fileName > "" Then
        targetPath = FSO.BuildPath(path, fileName)
    Else
        targetPath = path
    End If

    With FSO.CreateTextFile(fileName:=targetPath, overwrite:=True, unicode:=True)
        .Write content
    End With
End Sub

И теперь мы можем объединить те в подпункте, который я назвал HtmlWorkflow, из-за отсутствия лучшего имени:

Sub HtmlWorkflow()
    Dim stringSplits As Variant, html as String

    stringSplits = Split("something", "delimiter")
    html = CreateHtml(sourceDoc:=ActiveDocument)

    WriteTextToFile _
        content:=html, _
        path:="Q:\OIT\Web Sites\This Site\Regulatory\Docketbk\" & stringSplits(1), _
        fileName:=FSO.GetBaseName(ActiveDocument.Name) & ".html" _

    FSO.CopyFolder _
        Source:="Q:\whatever\your\source\folder\path\is", _
        Destination:="\\whatever\your\destination\folder\path\is"
End Sub

Примечания:

  • Я использую именованные параметры в своих вызовах функций - это может сохранить некоторые временные переменные и делает вещи в основном самодокументируемыми.
  • _ в конце строки - символ продолжения строки VB. Его использование облегчает чтение длинных строк кода.
  • Разделение элементов на отдельные функции упрощает отладку и тестирование (теперь вы можете вызывать CreateHtml() для любого открытого документа, независимо от того, активен он или нет. нет), и его легко использовать повторно (WriteTextToFile не имеет значения, какой файл или какой контент).
  • Документация для FileSystemObject находится здесь: https://docs.microsoft.com/en-us/office/vba/language/reference/objects-visual-basic-for-applications
...