Ошибка компиляции microsoft vbscript предполагается наличие окончания инструкции

  • Remove From My Forums
  • Вопрос

  • Доброго времени суток.
    В организации на 250+ машинах сетевые параметры адаптеров установлены статикой (sic), необходимо заставить брать их по DHCP. Нашел пару скриптов, наиболее подходящим показался VBS (с которым я совершенно не знаком), т.к.
    другой предполагает указание имени сетевого подключения (например, «Подключение по локальной сети»). Сам скрипт:
    WMIC Path Win32_NetworkAdapterConfiguration Where «IPEnabled = True» Call SetDNSServerSearchOrder 

    WMIC Path Win32_NetworkAdapterConfiguration Where «IPEnabled = True» Call EnableDHCP

    выдает: предполагается наличие окончания инструкции. строка1, символ 11.

    пробовал использовать bat такого вида: 

    netsh interface ip set address name=»Подключение по локальной сети» source=dhcp 

    netsh interface ip set dnsservers name=»Подключение по локальной сети» source=dhcp 

    ощутил проблемы с кодировкой, 1 раз он отработал, хотя отписал козябру, НО я не могу понять как, т.к. повторить я этого не могу, пробовал 1251, 866, 869 — без толку.

    Подскажите что-нибудь пожалуйста.

    • Изменено

      19 сентября 2014 г. 8:19

Ответы

  • Как я уже говорил с vbs не сталкивался, решение предложенное в той теме Aleksey.T

    выдает: строка 1, символ 1, несоответствие типа ‘Code’, код: 800A000D

    НО оказывается якобы vbs скрипт который я привел использует обычные команды wmic.exe, которые можно использовать в пакетном файле и это работает. Тема закрыта.

    • Помечено в качестве ответа
      Копылов Анатолий
      19 сентября 2014 г. 8:47

Студворк — интернет-сервис помощи студентам

Есть скрипт:

Visual Basic
1
2
3
4
5
6
7
8
9
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshNetwork = WScript.CreateObject("WScript.Network")
LotusPath = "C:\Users\" & WshNetwork.UserName & "\Lotus\"
 
'Проверяем наличие папки Lotus в перемещаемом профиле, если такой папки не существует, то создаем ее
If FSO.FolderExists(LotusPath) = False Then
    FSO.CreateFolder(LotusPath)
    robocopy "C:\Program Files (x86)\Lotus" "C:\Users\%USERNAME%\Lotus" "notes.ini"
End If

При запуске ругается:
Строка:8
Символ:42
(это буква «L» после «(x86)\»)
Ошибка:Предполагается наличие окончания инструкции

Если эту строчку скопировать и запустить в cmd под тем же пользователем, она без проблем отрабатывается.
Что ОНО хочет от меня?

Добавлено через 18 минут
Поправка!Строка:8
Символ:42
(это первый символ второго параметра: «C:\Users\%USERNAME%\Lotus»)

I am trying to insert some records into MS Access Table with the help of below VB Script. But when am trying to execute it, it’s throwing Compilation error: Expected end of statement. Could someone please help me figure out where am I going wrong.

Private Sub Form_Click()
Dim dbs         As DAO.Database
Dim DbFullNAme  As String

DbFullName = "D:\G\Diamond\FINAL MS-Access\MS-Access project.accdb"
Set dbs = OpenDatabase(DbFullName)

dbs.Execute "INSERT INTO [2014_Status] ( Prompt, Project_Name, STATUS,Release_Name )SELECT     RoadMap.SPRF_CC, RoadMap.SPRF_Name, RoadMap.Project_Phase,RoadMap.Release_Name FROM RoadMap WHERE (((Exists (select 1 FROM [2014_Status] where RoadMap.SPRF_CC = [2014_Status].[Prompt]))=False));"
dbs.Close
End Sub

Pankaj Jaju's user avatar

Pankaj Jaju

5,3712 gold badges26 silver badges41 bronze badges

asked Apr 23, 2014 at 17:14

user2412576's user avatar

6

VBScript (as opposed to VBA or other dialects) does not support typed Dims. So

Dim dbs         As DAO.Database
Dim DbFullNAme  As String

need to be

Dim dbs
Dim DbFullNAme

VBscript has no native OpenDatabase() function. You need to use ADO to connect to your Access ‘database’. First create a connection

Set dbs = CreateObject("ADODB.Connection")

Then determine the connection string and

dbs.Open cs

The rest of your code should work.

Update wrt comment:

The error message:

D:\G\Diamond\FINAL MS-Access\query1.vbs(2, 9) Microsoft VBScript compilation error: Expected end of statement

prooves that the OT tried to write a VBScript (the addition of the misleading vba/access tags is (C) Pankaj Jaju).

answered Apr 23, 2014 at 17:29

Ekkehard.Horner's user avatar

Ekkehard.HornerEkkehard.Horner

38.4k2 gold badges45 silver badges96 bronze badges

3

So lets break down the real reason why this code doesn’t work.

You copied and pasted Visual Basic for Applications(VBA) into a .VBS(Visual Basic Script) file and expected it to work, I assume.

The problem with this is that VBA and VBScript are slightly different languages. Review the info section for both tags on stackoverflow when you get the opportunity.

For now lets just patch your code and maintain your DAO object so you don’t have to reconstruct your Database usage with ADODB.

ExecuteInsert
Sub ExecuteInsert()
    Dim dbs, DbFullName, acc
    Set acc = createobject("Access.Application")

    DbFullName = "D:\G\Diamond\FINAL MS-Access\MS-Access project.accdb"
    Set dbs = acc.DBEngine.OpenDatabase(DbFullName, False, False)
    dbs.Execute "INSERT INTO [2014_Status] ( Prompt, Project_Name, STATUS,Release_Name )SELECT     RoadMap.SPRF_CC, RoadMap.SPRF_Name, RoadMap.Project_Phase,RoadMap.Release_Name FROM RoadMap WHERE (((Exists (select 1 FROM [2014_Status] where RoadMap.SPRF_CC = [2014_Status].[Prompt]))=False));"
    dbs.Close
    msgbox "done"
End Sub

Changes made.

  1. Blocked your dim’d variables and removed As *** statements for vbscript compatibility
  2. Set an access object so you could maintain the remainder of your code.
  3. Added the acc.DBEngine. before OpenDatabase with additional parameters.
  4. Renamed your Sub from Form_Click to ExecuteInsert, then placed ExecuteInsert at the top of the code so that the vbscript activates the sub. If you just place a sub in a vbscript file, it will not necessarily run, you have to activate it directly.

This code is tested and functions. Best of luck to you.

answered Apr 23, 2014 at 19:20

Rich's user avatar

RichRich

4,1343 gold badges26 silver badges45 bronze badges

1

Adding to Ekkehard.Horner
http://www.csidata.com/custserv/onlinehelp/vbsdocs/vbs6.htm

VBScript has only one data type called a Variant. A Variant is a
special kind of data type that can contain different kinds of
information, depending on how it’s used. Because Variant is the only
data type in VBScript, it’s also the data type returned by all
functions in VBScript.

answered Apr 23, 2014 at 17:32

0

Решил изучить платформу Nanocad.

Создал файл .VBS и вставил туда код из файла api/ncX_app.chm

Dim nc As New nanoCAD.Application
nc.Utility.Prompt ("Hello CAD!")

Nanocad выдал ошибку:

Script file path или [./]: C:\Users\Amk_2\Desktop\example.vbserr: "Ошибка компиляции Microsoft VBScript" raised an exception "Предполагается наличие окончания инструкции" at line 1 pos 7
Dim nc As New nanoCAD.Application
      ^

Насколько я помню, VBS является безтиповым языком. Точнее не требует объявления типов.

Поэтому ругается на явное объявление

Dim nc As New nanoCAD.Application

Один из вариантов реализации вашего кода с помощью метода CreateObject

Dim nc
Set nc = CreateObject("nanoCAD.Application")
nc.Utility.Prompt ("Hello CAD!")


Изменено пользователем shteyn

Студворк — интернет-сервис помощи студентам

Есть скрипт:

Visual Basic
1
2
3
4
5
6
7
8
9
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshNetwork = WScript.CreateObject("WScript.Network")
LotusPath = "C:Users" & WshNetwork.UserName & "Lotus"
 
'Проверяем наличие папки Lotus в перемещаемом профиле, если такой папки не существует, то создаем ее
If FSO.FolderExists(LotusPath) = False Then
    FSO.CreateFolder(LotusPath)
    robocopy "C:Program Files (x86)Lotus" "C:Users%USERNAME%Lotus" "notes.ini"
End If

При запуске ругается:
Строка:8
Символ:42
(это буква «L» после «(x86)»)
Ошибка:Предполагается наличие окончания инструкции

Если эту строчку скопировать и запустить в cmd под тем же пользователем, она без проблем отрабатывается.
Что ОНО хочет от меня?

Добавлено через 18 минут
Поправка!Строка:8
Символ:42
(это первый символ второго параметра: «C:Users%USERNAME%Lotus»)

I am trying to insert some records into MS Access Table with the help of below VB Script. But when am trying to execute it, it’s throwing Compilation error: Expected end of statement. Could someone please help me figure out where am I going wrong.

Private Sub Form_Click()
Dim dbs         As DAO.Database
Dim DbFullNAme  As String

DbFullName = "D:GDiamondFINAL MS-AccessMS-Access project.accdb"
Set dbs = OpenDatabase(DbFullName)

dbs.Execute "INSERT INTO [2014_Status] ( Prompt, Project_Name, STATUS,Release_Name )SELECT     RoadMap.SPRF_CC, RoadMap.SPRF_Name, RoadMap.Project_Phase,RoadMap.Release_Name FROM RoadMap WHERE (((Exists (select 1 FROM [2014_Status] where RoadMap.SPRF_CC = [2014_Status].[Prompt]))=False));"
dbs.Close
End Sub

Pankaj Jaju's user avatar

Pankaj Jaju

5,3412 gold badges25 silver badges41 bronze badges

asked Apr 23, 2014 at 17:14

user2412576's user avatar

6

VBScript (as opposed to VBA or other dialects) does not support typed Dims. So

Dim dbs         As DAO.Database
Dim DbFullNAme  As String

need to be

Dim dbs
Dim DbFullNAme

VBscript has no native OpenDatabase() function. You need to use ADO to connect to your Access ‘database’. First create a connection

Set dbs = CreateObject("ADODB.Connection")

Then determine the connection string and

dbs.Open cs

The rest of your code should work.

Update wrt comment:

The error message:

D:GDiamondFINAL MS-Accessquery1.vbs(2, 9) Microsoft VBScript compilation error: Expected end of statement

prooves that the OT tried to write a VBScript (the addition of the misleading vba/access tags is (C) Pankaj Jaju).

answered Apr 23, 2014 at 17:29

Ekkehard.Horner's user avatar

Ekkehard.HornerEkkehard.Horner

38.4k2 gold badges44 silver badges94 bronze badges

3

So lets break down the real reason why this code doesn’t work.

You copied and pasted Visual Basic for Applications(VBA) into a .VBS(Visual Basic Script) file and expected it to work, I assume.

The problem with this is that VBA and VBScript are slightly different languages. Review the info section for both tags on stackoverflow when you get the opportunity.

For now lets just patch your code and maintain your DAO object so you don’t have to reconstruct your Database usage with ADODB.

ExecuteInsert
Sub ExecuteInsert()
    Dim dbs, DbFullName, acc
    Set acc = createobject("Access.Application")

    DbFullName = "D:GDiamondFINAL MS-AccessMS-Access project.accdb"
    Set dbs = acc.DBEngine.OpenDatabase(DbFullName, False, False)
    dbs.Execute "INSERT INTO [2014_Status] ( Prompt, Project_Name, STATUS,Release_Name )SELECT     RoadMap.SPRF_CC, RoadMap.SPRF_Name, RoadMap.Project_Phase,RoadMap.Release_Name FROM RoadMap WHERE (((Exists (select 1 FROM [2014_Status] where RoadMap.SPRF_CC = [2014_Status].[Prompt]))=False));"
    dbs.Close
    msgbox "done"
End Sub

Changes made.

  1. Blocked your dim’d variables and removed As *** statements for vbscript compatibility
  2. Set an access object so you could maintain the remainder of your code.
  3. Added the acc.DBEngine. before OpenDatabase with additional parameters.
  4. Renamed your Sub from Form_Click to ExecuteInsert, then placed ExecuteInsert at the top of the code so that the vbscript activates the sub. If you just place a sub in a vbscript file, it will not necessarily run, you have to activate it directly.

This code is tested and functions. Best of luck to you.

answered Apr 23, 2014 at 19:20

Rich's user avatar

RichRich

4,1043 gold badges26 silver badges44 bronze badges

1

Adding to Ekkehard.Horner
http://www.csidata.com/custserv/onlinehelp/vbsdocs/vbs6.htm

VBScript has only one data type called a Variant. A Variant is a
special kind of data type that can contain different kinds of
information, depending on how it’s used. Because Variant is the only
data type in VBScript, it’s also the data type returned by all
functions in VBScript.

answered Apr 23, 2014 at 17:32

0

  • Remove From My Forums
  • Question

  • Доброго времени суток.
    В организации на 250+ машинах сетевые параметры адаптеров установлены статикой (sic), необходимо заставить брать их по DHCP. Нашел пару скриптов, наиболее подходящим показался VBS (с которым я совершенно не знаком), т.к.
    другой предполагает указание имени сетевого подключения (например, «Подключение по локальной сети»). Сам скрипт:
    WMIC Path Win32_NetworkAdapterConfiguration Where «IPEnabled = True» Call SetDNSServerSearchOrder 

    WMIC Path Win32_NetworkAdapterConfiguration Where «IPEnabled = True» Call EnableDHCP

    выдает: предполагается наличие окончания инструкции. строка1, символ 11.

    пробовал использовать bat такого вида: 

    netsh interface ip set address name=»Подключение по локальной сети» source=dhcp 

    netsh interface ip set dnsservers name=»Подключение по локальной сети» source=dhcp 

    ощутил проблемы с кодировкой, 1 раз он отработал, хотя отписал козябру, НО я не могу понять как, т.к. повторить я этого не могу, пробовал 1251, 866, 869 — без толку.

    Подскажите что-нибудь пожалуйста.

    • Edited by

      Friday, September 19, 2014 8:19 AM

Answers

  • Как я уже говорил с vbs не сталкивался, решение предложенное в той теме Aleksey.T

    выдает: строка 1, символ 1, несоответствие типа ‘Code’, код: 800A000D

    НО оказывается якобы vbs скрипт который я привел использует обычные команды wmic.exe, которые можно использовать в пакетном файле и это работает. Тема закрыта.

    • Marked as answer by
      Копылов Анатолий
      Friday, September 19, 2014 8:47 AM

  • Remove From My Forums
  • Question

  • Доброго времени суток.
    В организации на 250+ машинах сетевые параметры адаптеров установлены статикой (sic), необходимо заставить брать их по DHCP. Нашел пару скриптов, наиболее подходящим показался VBS (с которым я совершенно не знаком), т.к.
    другой предполагает указание имени сетевого подключения (например, «Подключение по локальной сети»). Сам скрипт:
    WMIC Path Win32_NetworkAdapterConfiguration Where «IPEnabled = True» Call SetDNSServerSearchOrder 

    WMIC Path Win32_NetworkAdapterConfiguration Where «IPEnabled = True» Call EnableDHCP

    выдает: предполагается наличие окончания инструкции. строка1, символ 11.

    пробовал использовать bat такого вида: 

    netsh interface ip set address name=»Подключение по локальной сети» source=dhcp 

    netsh interface ip set dnsservers name=»Подключение по локальной сети» source=dhcp 

    ощутил проблемы с кодировкой, 1 раз он отработал, хотя отписал козябру, НО я не могу понять как, т.к. повторить я этого не могу, пробовал 1251, 866, 869 — без толку.

    Подскажите что-нибудь пожалуйста.

    • Edited by

      Friday, September 19, 2014 8:19 AM

Answers

  • Как я уже говорил с vbs не сталкивался, решение предложенное в той теме Aleksey.T

    выдает: строка 1, символ 1, несоответствие типа ‘Code’, код: 800A000D

    НО оказывается якобы vbs скрипт который я привел использует обычные команды wmic.exe, которые можно использовать в пакетном файле и это работает. Тема закрыта.

    • Marked as answer by
      Копылов Анатолий
      Friday, September 19, 2014 8:47 AM
  • Remove From My Forums
  • Вопрос

  • Вот текст скрипта:

    Const ADS_PROPERTY_DELETE = 4
    Const E_ADS_PROPERTY_NOT_FOUND  = &h8000500D

    strOU = «OU=Test,OU=Users,DC=name,DC=ru»

    Set objConnection = CreateObject(«ADODB.Connection»)
    objConnection.Open «Provider=ADsDSOObject;»
     Set objCommand = CreateObject(«ADODB.Command»)
    objCommand.ActiveConnection = objConnection
    objCommand.CommandText = _
        «<LDAP://dc=name,dc=ru>;(objectCategory=Group);» & _

            «distinguishedName,primaryGroupToken;subtree»  

    Set objRecordSet = objCommand.Execute

     
    objCommand.CommandText = _
      «<LDAP://» & strOU & «>;» & _
      «(&(objectclass=user)(objectcategory=person));» & _
      «adspath,distinguishedname,sAMAccountName;subtree»
    Set objRecordSet = objCommand.Execute

    dim arrUsers()
    dim intUserCount
    intUserCount = -1

    Do Until objRecordSet.EOF
      intUserCount = intUserCount + 1
      ReDim Preserve arrUsers(intUserCount)
      arrUsers(intUserCount) = «LDAP://DC1:389/» & objRecordSet.Fields(«distinguishedname»).Value
      objRecordSet.MoveNext

    Loop
    for i = 0 to UBound(arrUsers)
         WScript.Echo «arrUsers(» & i & «) = » & arrUsers(i)
         WScript.Echo

         

         Set objUser = GetObject(arrUsers(i))
         arrMemberOf = objUser.GetEx(«memberOf»)
        ‘ WScript.Echo arrMemberOf
         If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then
             WScript.Echo «The memberOf attribute is not set.»

        Else
            For Each Group in arrMemberOf Set objGroup = GetObject(Group)_
             objGroup.PutEx ADS_PROPERTY_DELETE, _
             «member», arrUsers (i)
             objGroup.SetInfo
            Next
        End If
    next

    При запуске скрипта появляется Ошибка компиляции Microsoft VBScript: Предполагается наличие окончания инструкции

    в строке For Each Group in arrMemberOf Set objGroup = GetObject(Group)_

    Подскажите пожалуйста в чем моя ошибка?

Ответы

  • Вот финальный поправленный скрипт. Проверенно работает.

    On Error Resume Next

    Const ADS_PROPERTY_DELETE = 4

    strOU = «OU=Test,OU=Users,OU=FMS,DC=noname,DC=com»

    Set objConnection = CreateObject(«ADODB.Connection»)
    objConnection.Open «Provider=ADsDSOObject;»
     Set objCommand = CreateObject(«ADODB.Command»)
    objCommand.ActiveConnection = objConnection

    objCommand.CommandText = _
      «<LDAP://» & strOU & «>;» & _
      «(&(objectclass=user)(objectcategory=person));» & _
      «adspath,distinguishedname,sAMAccountName;subtree»
    Set objRecordSet = objCommand.Execute

    dim arrUsers()
    dim intUserCount
    intUserCount = -1

    Do Until objRecordSet.EOF
      intUserCount = intUserCount + 1
       ReDim Preserve arrUsers(intUserCount)
      arrUsers(intUserCount) = objRecordSet.Fields(«distinguishedname»).Value
       objRecordSet.MoveNext

    Loop

    for i = 0 to UBound(arrUsers)
        ‘ WScript.Echo «arrUsers(» & i & «) = » & arrUsers(i)
         WScript.Echo
         ‘»LDAP://» &

        
         strLDAPUser = «LDAP://» & arrUsers(i)

         Set objUser = GetObject(strLDAPUser) ‘ <================================================
         ErrNumber1 = Err.Number
         ErrDescription1 = Err.Description

        arrMemberOf = objUser.GetEx(«memberOf») ‘ <================================================
        ErrNumber0 = Err.Number
        ErrDescription0 = Err.Description   

        if ErrNumber0 = -2147463155 then
            WScript.Echo «strLDAPUser = » & strLDAPUser
            WScript.Echo «The memberOf attribute is not set.»
        else
            If not ErrNumber1 = 0 Then
                WScript.Echo «strLDAPUser = » & strLDAPUser
                WScript.Echo «Err.Number1 = » & ErrNumber1
                WScript.Echo «Err.Description1 = » & ErrDescription1

            elseif ErrNumber1 = 0 then

                    For Each Group in arrMemberOf

                        strLDAP = «LDAP://» & Group
                        Set objGroup = GetObject(strLDAP) ‘ <================================================
                        ErrNumber2 = Err.Number
                        ErrDescription2 = Err.Description

                        if not ErrNumber2 = 0 then
                            WScript.Echo «strLDAPUser = » & strLDAPUser
                            WScript.Echo «Err.Number2 = » & ErrNumber2

                            WScript.Echo «Err.Description2 = » & ErrDescription2            

                            WScript.Echo «strLDAP = » & strLDAP            

                        else
                            objGroup.PutEx ADS_PROPERTY_DELETE, «member», Array(arrUsers(i))

                            objGroup.SetInfo ‘ <================================================
                            ErrNumber3 = Err.Number
                            ErrDescription3 = Err.Description
                            if not ErrNumber3 = 0 then
                                WScript.Echo «strLDAPUser = » & strLDAPUser
                                WScript.Echo «Err.Number3 = » & ErrNumber3

                                WScript.Echo «Err.Description3 = » & ErrDescription3
                            else
                            ‘
                            end if
                        end if
                    Next
            Else
                WScript.Echo «strLDAPUser = » & strLDAPUser
                WScript.Echo «Err.Number1 = » & ErrNumber1
                WScript.Echo «Err.Description1 = » & ErrDescription1
            End If
        end if
    next

    objRecordSet.Close
    Set objRecordSet = Nothing
    Set objCommand = Nothing
    objConnection.Close
    Set objConnection = Nothing
    WScript.quit

    • Помечено в качестве ответа

      29 сентября 2011 г. 12:32

Товарищи помогите кто знает советом решить следующую проблему.

Попытался в 1с использовать MSScriptControl, следующим образом:

Script=Новый COMОбъект(«MSScriptControl.ScriptControl»);

Script.Language=»vbscript»;

СтрокаСкрипта=»Private Declare Function URLDownloadToFile Lib «»urlmon.dll»» Alias «»URLDownloadToFileA»» (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

|Sub GetFile  

|Dim ret As Long  

|ret = URLDownloadToFile(0, «»http://www.mail.ru»», «»c:1.html»», 0, 0)  

|End Sub»;

Script.AddCode(СтрокаСкрипта);  

При выполнении последнего оператора выдается ошибка:

{Форма.Форма(93)}: Ошибка при вызове метода контекста (AddCode): Произошла исключительная ситуация (Ошибка компиляции Microsoft VBScript): Предполагается наличие окончания инструкции

Script.AddCode(СтрокаСкрипта);  

по причине:

Произошла исключительная ситуация (Ошибка компиляции Microsoft VBScript): Предполагается наличие окончания инструкции.

Этот же код написанный в екселе в качестве макроса прекрасно работает. Я так понимаю проблема в том, что я пытаюсь определить функцию URLDownloadToFile из библиотеки «urlmon.dll».

Не подскажите как правильно написать чтобы заработало?

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

1 2018-03-21 00:46:44

  • badhabit
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Тема: VBS: не получается сделать массив структур с массивом )

Добрый день. Не знаю правильно ли я использовал терминологию в заголовке, все ж С/С++ ближе… Но есть потребность сделать динамический массив структур, в свою очередь каждая из которых тоже содержит «мембером» динамический массив… Попробовал вот так:


Option Explicit

Main

Function Main
	Dim arr(), i
	For i = 0 To 10
		ReDim Preserve arr(i)
		Set arr(i) = New struct
		arr(i).sVar1 = "str" & i & " var1"
		arr(i).sVar2 = "str" & i & " var2"
		
		Dim j
		For j = 0 To 10
			ReDim Preserve arr(i).aArr(j)
			arr(i).aArr(j) = 121212 + j
		Next		
	Next
	
	For i = 0 To UBound(arr)
		WScript.Echo "i: " & i & " var1: " & arr(i).sVar1 & " var2: " & arr(i).sVar2
	Next
	
End Function


Class struct
  Public aArr()
  Public sVar1
  Public svar2  
End Class

На строке

ReDim Preserve arr(i).aArr(j)

валится с ошибкой:

Ошибка компиляции Microsoft VBScript: Предполагается наличие окончания инструкции

Подскажите, что делаю не так…

2 Ответ от Xameleon 2018-03-21 14:37:31

  • Xameleon
  • Разработчик
  • Неактивен

Re: VBS: не получается сделать массив структур с массивом )

badhabit, а можно увидеть скрипт целиком ? А то объявления struct не видно.

На первый взгляд, как я понимаю, беда в том, что Вы пытаетесь «редимить» свойство объекта. К сожалению, VBScript хочет после Redim получить прямую ссылку на массив. Думаю в Вашем случае может помочь что-то типа:


Option Explicit

Main

Function Main
	Dim arr(), i, propArray
	For i = 0 To 10
		ReDim Preserve arr(i)
		Set arr(i) = New struct
		arr(i).sVar1 = "str" & i & " var1"
		arr(i).sVar2 = "str" & i & " var2"
		
		Dim j
		propArray = arr(i).aArr
		For j = 0 To 10
			ReDim Preserve propArray(j)
			propArray(j) = 121212 + j
		Next
		arr(i).aArr = propArray		
	Next
	
	For i = 0 To UBound(arr)
		WScript.Echo "i: " & i & " var1: " & arr(i).sVar1 & " var2: " & arr(i).sVar2
	Next
	
End Function

Не уверен, что Вы выбрали правильный путь. Думаю всё-таки стоит взглянуть на всю картину целиком.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3 Ответ от badhabit 2018-03-21 16:28:20 (изменено: badhabit, 2018-03-21 19:29:16)

  • badhabit
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: не получается сделать массив структур с массивом )

Xameleon, так я привёл весь скрипт, просто проскролить надо, в самом низу есть объявление класса struct
Пс. Ваш способ попробую

4 Ответ от badhabit 2018-03-21 20:32:29

  • badhabit
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: не получается сделать массив структур с массивом )


Option Explicit

Main

Function Main
	Dim arr(), i, propArray
	For i = 0 To 10
		ReDim Preserve arr(i)
		Set arr(i) = New struct
		arr(i).sVar1 = "str" & i & " var1"
		arr(i).sVar2 = "str" & i & " var2"
		
		Dim j
		propArray = arr(i).aArr
		For j = 0 To 10
			ReDim Preserve propArray(j)
			propArray(j) = 121212 + j
		Next
		arr(i).aArr = propArray		
	Next
	
	Dim k
	For i = 0 To UBound(arr)
		WScript.Echo "i: " & i & " var1: " & arr(i).sVar1 & " var2: " & arr(i).sVar2
		Dim zzz()
		zzz = arr(i).aArr
		For k = 0 To UBound(zzz) - 1
			WScript.Echo zzz(k)
		Next
	Next	 
	
End Function


Class struct
  Public aArr()
  Public sVar1
  Public svar2  
End Class

теперь ругается тут

говрит
несоответствие типа

5 Ответ от Xameleon 2018-03-22 13:37:20

  • Xameleon
  • Разработчик
  • Неактивен

Re: VBS: не получается сделать массив структур с массивом )

badhabit,

badhabit пишет:

Xameleon, так я привёл весь скрипт, просто проскролить надо, в самом низу есть объявление класса struct

Прошу прощения. Не заметил.

Тогда вот так можно сделать:

Option Explicit

Main

Function Main
	Dim arr(), i, propArray
	For i = 0 To 10
		ReDim Preserve arr(i)
		Set arr(i) = New struct
		arr(i).sVar1 = "str" & i & " var1"
		arr(i).sVar2 = "str" & i & " var2"
		
		Dim j
		propArray = arr(i).aArr
		For j = 0 To 10
			ReDim Preserve propArray(j)
			propArray(j) = 121212 + j
		Next
		arr(i).aArr = propArray		
	Next
	
	Dim k
	For i = 0 To UBound(arr)
		WScript.Echo "i: " & i & " var1: " & arr(i).sVar1 & " var2: " & arr(i).sVar2
		Dim zzz
		zzz = arr(i).aArr
		For k = 0 To UBound(zzz) - 1
			WScript.Echo zzz(k)
		Next
	Next	 
	
End Function


Class struct
	Public aArr
	Public sVar1
	Public svar2
	Private Sub Class_Initialize()
		aArr = Array()
	End Sub
End Class

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

6 Ответ от badhabit 2018-03-25 11:45:39

  • badhabit
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: не получается сделать массив структур с массивом )

Xameleon, спасибо большое. Все заработало. Вот ещё ссылка по теме https://stackoverflow.com/questions/480 … n-vbscript

7 Ответ от Xameleon 2018-03-25 16:19:00

  • Xameleon
  • Разработчик
  • Неактивен

Re: VBS: не получается сделать массив структур с массивом )

badhabit, рад, что пригодилось. Вообще, ИМХО, VBS классы больше подразумеваются под объектную модель, нежели под структуры. Возможно Вашу задачу можно решить иначе. Если поведаете о конечной цели, возможно смогу посоветовать что-то более подходящее.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

8 Ответ от badhabit 2018-03-25 17:35:12

  • badhabit
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: не получается сделать массив структур с массивом )

Да в принципе надо было получить то — что получилось, без разницы как это называть.)) Получился динамический массив «объектов» и в каждом еще по одному динамическому массиву… Добавив в «структуру» конструктор и метод, в принципе получил класс))
Просто писать на vbs самый, в настоящий момент, удобный вариант, а синтаксис я его не шибко хорошо знаю, так что еще раз спасибо за помощь!

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

 

eremeev23rus

Пользователь

Сообщений: 24
Регистрация: 07.09.2015

#1

15.09.2015 11:10:40

Добрый день.
Возникла потребность создать VBS файл.
Данныйц фал должен открывать одну книгу, затирить в ней данные в диапазоне [A2:Hn], затем открывать другой файл копировать данные в таком же диапазоне и заливать в первую книгу.
Затем выполнить 2 макроса.
Из VBS знаю только как открыть файл игнорируя ошибок и сохранить его. Подскажите каким способом это можно реализовать.

Код
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Visible = false
ExcelApp.displayalerts = false
ExcelApp.Workbooks.Open "Путь к файлу"
ExcelApp.ActiveWorkbook.refreshall
ExcelApp.ActiveWorkbook.Save
ExcelApp.Workbooks.Close
Set ExcelAp = Nothing
 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

eremeev23rus, здравия. Можно в ВБА написать этот макрос, отладить и после перенести в ВБС.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

JayBhagavan, Спасибо, а данный макрос необходимо преобразовывать?

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

eremeev23rus, а Вы попробуйте его так в ВБА запустить и узнаете. :)

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

eremeev23rus

Пользователь

Сообщений: 24
Регистрация: 07.09.2015

#5

15.09.2015 11:29:20

JayBhagavan,

Код
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Visible = false
ExcelApp.displayalerts = false
ExcelApp.Workbooks.Open "K:Исходник.xls"

iLastRow = Sheets("Консолидации общий").Cells(Rows.Count, 8).End(xlUp).Row
For i = 2 To iLastRow - 1
    a = LCase(Sheets("Консолидации общий").Cells(i, 1).Value)
    b = LCase(Sheets("Консолидации общий").Cells(i, 2).Value)
    c = LCase(Sheets("Консолидации общий").Cells(i, 3).Value)
    d = LCase(Sheets("Консолидации общий").Cells(i, 4).Value)
    e = LCase(Sheets("Консолидации общий").Cells(i, 5).Value)
    f = LCase(Sheets("Консолидации общий").Cells(i, 6).Value)
    g = LCase(Sheets("Консолидации общий").Cells(i, 7).Value)
    h = LCase(Sheets("Консолидации общий").Cells(i, 8).Value)
    For j = i + 1 To iLastRow
        a1 = LCase(Sheets("Консолидации общий").Cells(j, 1).Value)
        b1 = LCase(Sheets("Консолидации общий").Cells(j, 2).Value)
        c1 = LCase(Sheets("Консолидации общий").Cells(j, 3).Value)
        d1 = LCase(Sheets("Консолидации общий").Cells(j, 4).Value)
        e1 = LCase(Sheets("Консолидации общий").Cells(j, 5).Value)
        f1 = LCase(Sheets("Консолидации общий").Cells(j, 6).Value)
        g1 = LCase(Sheets("Консолидации общий").Cells(j, 7).Value)
        h1 = LCase(Sheets("Консолидации общий").Cells(j, 8).Value)
    If a = e1 And b = f1 And c = g1 And d = h1 And e = a1 And f = b1 And g = c1 And h = d1 Then
    Cells(j, 1) = a
    Cells(j, 2) = b
    Cells(j, 3) = c
    Cells(j, 4) = d
    Cells(j, 5) = e
    Cells(j, 6) = f
    Cells(j, 7) = g
    Cells(j, 8) = h
    End If
    Next j
Next i

ExcelApp.ActiveWorkbook.Save
ExcelApp.Workbooks.Close
Set ExcelAp = Nothing

Подскажите, пожалуйста, что не так я сформировал?

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

eremeev23rus, что не так я сходу не скажу. (у меня нет Вашего файла, с которым работает макрос) А что Вас не устраивает или на чём ошибка возникает, если она есть?
ПС Чтобы сократить текст кода используйте конструкцию With … End With для Sheets(«Консолидации общий»). И сравнение можно упростить, например:
1) через массивы, чтобы не создавать для каждой яч. переменную (это же брррррррр)
2) или формировать две строки с разделителем через Join и их сравнивать
Всё вышесказанное — имхо, которое может быть ошибочным, но это я бы попытался реализовать будь у меня такая потребность.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

JayBhagavan, при выполнении отображается ошибка: Предполагается наличие окончания инструкции, Код: 800A0401, ошибка компиляции.
Я предполагаю, что VBA код я неверно перенес.

 

Влад

Пользователь

Сообщений: 1189
Регистрация: 24.12.2012

Нет в ВБС такие понятий как «Sheets» и «Cells» — это объекты книги/листа, поэтому должна быть указана полная ссылка на них.

 

Влад, а можно пример? Для лучшего понимания.

 

Влад

Пользователь

Сообщений: 1189
Регистрация: 24.12.2012

#10

15.09.2015 12:04:12

Пример:

Код
....
Set wb = ExcelApp.Workbooks.Open("K:Исходник.xls")
....
iLastRow = wb.Sheets("Консолидации общий").Cells(Rows.Count, 8).End(xlUp).Row
 

Не удается сделать описаным методом. Может можно сделать, чтобы нажималась кнопка на листе в Excel?

 

Hugo

Пользователь

Сообщений: 23101
Регистрация: 22.12.2012

Rows.Count возможно тоже непонятно для vbs.
Я всегда указывал чьи это rows.

Изменено: Hugo15.09.2015 13:38:29

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#13

15.09.2015 13:43:25

Скрытый текст

Изменено: JayBhagavan15.09.2015 14:09:42

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Hugo

Пользователь

Сообщений: 23101
Регистрация: 22.12.2012

Ну и для vbs первой строкой нужно написать
jjj_vbs

 

Hugo

Пользователь

Сообщений: 23101
Регистрация: 22.12.2012

Нашёл ещё нестыковку — в vbs нельзя писать
next переменная

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#16

15.09.2015 13:55:51

Цитата
Hugo написал: в vbs нельзя писать next переменная

Исправил.

Цитата
Hugo написал: Ну и для vbs первой строкой нужно написать
jjj_vbs

То есть нужно убрать Sub, () и End Sub?

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Hugo

Пользователь

Сообщений: 23101
Регистрация: 22.12.2012

Ещё — xlUp нужно заменить на -4162

 

Hugo

Пользователь

Сообщений: 23101
Регистрация: 22.12.2012

#18

15.09.2015 14:00:43

Цитата
JayBhagavan написал:
То есть нужно убрать Sub, () и End Sub?

Да, или первой строкой вызывать этот sub

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#19

15.09.2015 14:10:23

Hugo, благодарю за Ваши замечая. Вроде все учёл.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

Решил изучить платформу Nanocad.

Создал файл .VBS и вставил туда код из файла api/ncX_app.chm

Dim nc As New nanoCAD.Application
nc.Utility.Prompt ("Hello CAD!")

Nanocad выдал ошибку:

Script file path или [./]: C:UsersAmk_2Desktopexample.vbserr: "Ошибка компиляции Microsoft VBScript" raised an exception "Предполагается наличие окончания инструкции" at line 1 pos 7
Dim nc As New nanoCAD.Application
      ^

Насколько я помню, VBS является безтиповым языком. Точнее не требует объявления типов.

Поэтому ругается на явное объявление

Dim nc As New nanoCAD.Application

Один из вариантов реализации вашего кода с помощью метода CreateObject

Dim nc
Set nc = CreateObject("nanoCAD.Application")
nc.Utility.Prompt ("Hello CAD!")


Изменено 8 июня, 2011 пользователем shteyn

Like this post? Please share to your friends:
  • Флуниджект инструкция по применению для животных крс
  • Принтер кэнон пиксма g3415 инструкция по применению
  • Зарядное устройство диолд изу 8 инструкция по применению
  • Иран ходро саманд мануал
  • Lanbena pore treatment serum shrink pores инструкция по применению