- Remove From My Forums
-
Вопрос
-
Доброго времени суток.
В организации на 250+ машинах сетевые параметры адаптеров установлены статикой (sic), необходимо заставить брать их по DHCP. Нашел пару скриптов, наиболее подходящим показался VBS (с которым я совершенно не знаком), т.к.
другой предполагает указание имени сетевого подключения (например, «Подключение по локальной сети»). Сам скрипт:
WMIC Path Win32_NetworkAdapterConfiguration Where «IPEnabled = True» Call SetDNSServerSearchOrderWMIC 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 | ||
|
При запуске ругается:
Строка: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
5,3712 gold badges26 silver badges41 bronze badges
asked Apr 23, 2014 at 17:14
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.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.
- Blocked your dim’d variables and removed
As ***
statements for vbscript compatibility - Set an access object so you could maintain the remainder of your code.
- Added the
acc.DBEngine.
beforeOpenDatabase
with additional parameters. - Renamed your Sub from
Form_Click
to ExecuteInsert, then placedExecuteInsert
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
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 | ||
|
При запуске ругается:
Строка: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
5,3412 gold badges25 silver badges41 bronze badges
asked Apr 23, 2014 at 17:14
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.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.
- Blocked your dim’d variables and removed
As ***
statements for vbscript compatibility - Set an access object so you could maintain the remainder of your code.
- Added the
acc.DBEngine.
beforeOpenDatabase
with additional parameters. - Renamed your Sub from
Form_Click
to ExecuteInsert, then placedExecuteInsert
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
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 SetDNSServerSearchOrderWMIC 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
-
Edited by
Answers
-
Как я уже говорил с vbs не сталкивался, решение предложенное в той теме Aleksey.T
выдает: строка 1, символ 1, несоответствие типа ‘Code’, код: 800A000D
НО оказывается якобы vbs скрипт который я привел использует обычные команды wmic.exe, которые можно использовать в пакетном файле и это работает. Тема закрыта.
-
Marked as answer by
Копылов Анатолий
Friday, September 19, 2014 8:47 AM
-
Marked as answer by
- Remove From My Forums
-
Question
-
Доброго времени суток.
В организации на 250+ машинах сетевые параметры адаптеров установлены статикой (sic), необходимо заставить брать их по DHCP. Нашел пару скриптов, наиболее подходящим показался VBS (с которым я совершенно не знаком), т.к.
другой предполагает указание имени сетевого подключения (например, «Подключение по локальной сети»). Сам скрипт:
WMIC Path Win32_NetworkAdapterConfiguration Where «IPEnabled = True» Call SetDNSServerSearchOrderWMIC 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
- Edited by
Answers
-
Как я уже говорил с vbs не сталкивался, решение предложенное в той теме Aleksey.T
выдает: строка 1, символ 1, несоответствие типа ‘Code’, код: 800A000D
НО оказывается якобы vbs скрипт который я привел использует обычные команды wmic.exe, которые можно использовать в пакетном файле и это работает. Тема закрыта.
- Marked as answer by
Копылов Анатолий
Friday, September 19, 2014 8:47 AM
- Marked as answer by
- Remove From My Forums
-
Вопрос
-
Вот текст скрипта:
Const ADS_PROPERTY_DELETE = 4
Const E_ADS_PROPERTY_NOT_FOUND = &h8000500DstrOU = «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.Executedim arrUsers()
dim intUserCount
intUserCount = -1Do Until objRecordSet.EOF
intUserCount = intUserCount + 1
ReDim Preserve arrUsers(intUserCount)
arrUsers(intUserCount) = «LDAP://DC1:389/» & objRecordSet.Fields(«distinguishedname»).Value
objRecordSet.MoveNextLoop
for i = 0 to UBound(arrUsers)
WScript.Echo «arrUsers(» & i & «) = » & arrUsers(i)
WScript.EchoSet 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 = objConnectionobjCommand.CommandText = _
«<LDAP://» & strOU & «>;» & _
«(&(objectclass=user)(objectcategory=person));» & _
«adspath,distinguishedname,sAMAccountName;subtree»
Set objRecordSet = objCommand.Executedim arrUsers()
dim intUserCount
intUserCount = -1Do Until objRecordSet.EOF
intUserCount = intUserCount + 1
ReDim Preserve arrUsers(intUserCount)
arrUsers(intUserCount) = objRecordSet.Fields(«distinguishedname»).Value
objRecordSet.MoveNextLoop
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.DescriptionarrMemberOf = objUser.GetEx(«memberOf») ‘ <================================================
ErrNumber0 = Err.Number
ErrDescription0 = Err.Descriptionif 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 = » & ErrDescription1elseif ErrNumber1 = 0 then
For Each Group in arrMemberOf
strLDAP = «LDAP://» & Group
Set objGroup = GetObject(strLDAP) ‘ <================================================
ErrNumber2 = Err.Number
ErrDescription2 = Err.Descriptionif not ErrNumber2 = 0 then
WScript.Echo «strLDAPUser = » & strLDAPUser
WScript.Echo «Err.Number2 = » & ErrNumber2WScript.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 = » & ErrNumber3WScript.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
nextobjRecordSet.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 |
#1 15.09.2015 11:10:40 Добрый день.
|
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
eremeev23rus, здравия. Можно в ВБА написать этот макрос, отладить и после перенести в ВБС. <#0> |
JayBhagavan, Спасибо, а данный макрос необходимо преобразовывать? |
|
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
eremeev23rus, а Вы попробуйте его так в ВБА запустить и узнаете. <#0> |
eremeev23rus Пользователь Сообщений: 24 |
#5 15.09.2015 11:29:20 JayBhagavan,
Подскажите, пожалуйста, что не так я сформировал? |
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
eremeev23rus, что не так я сходу не скажу. (у меня нет Вашего файла, с которым работает макрос) А что Вас не устраивает или на чём ошибка возникает, если она есть? <#0> |
JayBhagavan, при выполнении отображается ошибка: Предполагается наличие окончания инструкции, Код: 800A0401, ошибка компиляции. |
|
Влад Пользователь Сообщений: 1189 |
Нет в ВБС такие понятий как «Sheets» и «Cells» — это объекты книги/листа, поэтому должна быть указана полная ссылка на них. |
Влад, а можно пример? Для лучшего понимания. |
|
Влад Пользователь Сообщений: 1189 |
#10 15.09.2015 12:04:12 Пример:
|
||
Не удается сделать описаным методом. Может можно сделать, чтобы нажималась кнопка на листе в Excel? |
|
Hugo Пользователь Сообщений: 23101 |
Rows.Count возможно тоже непонятно для vbs. Изменено: Hugo — 15.09.2015 13:38:29 |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#13 15.09.2015 13:43:25
Изменено: JayBhagavan — 15.09.2015 14:09:42 <#0> |
|
Hugo Пользователь Сообщений: 23101 |
Ну и для vbs первой строкой нужно написать |
Hugo Пользователь Сообщений: 23101 |
Нашёл ещё нестыковку — в vbs нельзя писать |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#16 15.09.2015 13:55:51
Исправил.
То есть нужно убрать Sub, () и End Sub? <#0> |
||||
Hugo Пользователь Сообщений: 23101 |
Ещё — xlUp нужно заменить на -4162 |
Hugo Пользователь Сообщений: 23101 |
#18 15.09.2015 14:00:43
Да, или первой строкой вызывать этот sub |
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#19 15.09.2015 14:10:23 Hugo, благодарю за Ваши замечая. Вроде все учёл. <#0> |
Решил изучить платформу 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