VB Script If тогда End утверждение - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь преобразовать макрос в сценарий VB и столкнулся с проблемой в операторе if..then..end.Вот мой код.

Option Explicit

Public OpenedWB

Dim valueEntered, fileCount
Dim userResponse
Dim NewWB, NewWS
Dim i
Dim OpenedWBName
Dim Found
Dim FSO, txtFILE
Dim HostFolder
Dim dApproved, dPrepared, filearray()
Dim xlApp
Dim xlCalculationManual
Dim xlCalculationAutomatic, msoFileDialogFolderPicker, msoFileDialogViewSmallIcons

xlCalculationManual = -4135: xlCalculationAutomatic = -4105
msoFileDialogFolderPicker = 4: msoFileDialogViewSmallIcons = 7

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True

Set NewWB = xlApp.Workbooks.Add
NewWB.Windows(1).Visible = True
Set NewWS = NewWB.Worksheets.Add

Set FSO = CreateObject("Scripting.FileSystemObject")

With xlApp
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With

i = -1

'UI (Dynamic) Directory
With xlApp.FileDialog(msoFileDialogFolderPicker)
    .AllowMultiSelect = False
    .Title = "Select the folder to scan through sub-folders"
    .ButtonName = "Select this folder!"
    .InitialFileName = _
        "\\..somepath"
    .InitialView = msoFileDialogViewSmallIcons
    If .Show <> i Then End  'This is throwing an error (Expected statement error)
    HostFolder = .SelectedItems(1)
End With

Я не уверен, почему я получаю эту ошибку, поскольку она отлично работает в VBA, но я предполагаю, что это потому, что у меня есть код в подпроцедуре VBA.

Кто-нибудь может мне помочь с этим?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 июня 2018
If .Show <> i Then WScript.Quit
0 голосов
/ 09 июня 2018

Каково ваше намерение?Если вы хотите использовать End в качестве оператора, который завершает программу, то вы должны знать, что нет оператора End в VBScript , он существует только в "полном объеме" VB6,VBA и VB.NET , где это команда «Завершить программу» (но вы не должны использовать ее в любом случае, потому что она не выполняет очистку программы и может привести к утечке ресурсов, которые требуютраспоряжение).

Я думаю, что вы хотите вместо Exit заявление.Оператор Exit на самом деле не завершает программу полностью, он эквивалентен return и break на других языках:

https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/scripting-articles/t234253x%28v%3dvs.84%29

Синтаксис оператора Exitимеет следующие формы:

   Exit Do  
   Exit For  
   Exit Function  
   Exit Property  
   Exit Sub  

К сожалению, вы не можете использовать Exit в программном коде скрипта «верхнего уровня» (т.е. вне явного Sub или Function).Я рекомендую заключить вашу программу в Sub, а ваша программа верхнего уровня будет просто вызовом Sub и ничего больше.

Кроме того, не путайте его с Stopоператор - который на самом деле приостанавливает выполнение скрипта (например, точку останова) до тех пор, пока пользователь не возобновит его, поэтому это не настоящая команда "остановить выполнение".Он также не закрывает дескрипторы:

https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/scripting-articles/zw86czy2%28v%3dvs.84%29

Stop: приостанавливает выполнение.
Использование оператора Stop аналогично установке точки останова вcode.
Оператор Stop приостанавливает выполнение, но не закрывает файлы и не очищает переменные.

В вашем случае гораздо проще просто инвертировать If, какитак:

With xlApp.FileDialog(msoFileDialogFolderPicker)
    .AllowMultiSelect = False
    .Title = "Select the folder to scan through sub-folders"
    .ButtonName = "Select this folder!"
    .InitialFileName = "\\..somepath"
    .InitialView = msoFileDialogViewSmallIcons
    If .Show = i Then
        Set HostFolder = .SelectedItems(1)
    End If
End With

(я предполагаю, что HostFolder должен быть присвоен оператор Set, поскольку это Object вместо значения, но если он работает без Set, тогда это нормально)

TL; DR:

  • В VBScript нет единственного оператора End для завершения выполнения программы.Он существует только в VB6, VBA и VB.NET.
  • Оператор Stop фактически приостанавливает выполнение как точку останова, он не завершает выполнение.
  • Оператор Exit работает тольковнутри родительской структуры управления, Sub или Function, поэтому она не работает внутри программы верхнего уровня.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...