Nick_A
Посетитель
Всего сообщений: 45
Дата регистрации: 30.09.2021
|
Создано:
18.04.2022 12:06:07
|
Добрый день. Подскажите пожалуйста, в чем ошибка при выполнении:
spExcel.Sheets.Add(After = spExcel.Sheets(spExcel.Sheets.Count))
По отдельности элементы вроде распознаются. Просто добавить лист удалось, но тот помещается перед последним активным (не подходит). Подсчитать листы тоже удалось (и это уже по идеи можно использовать как аргумент номера листа, после которого нужно добавить новый.
Спасибо.
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
18.04.2022 13:30:33
|
Здравствуйте. В Вашем вопросе что-то про RastrWin есть ?
|
|
|
Nick_A
Посетитель
Всего сообщений: 45
Дата регистрации: 30.09.2021
|
Создано:
18.04.2022 13:40:48
|
Нуу как бы не очень... Просто пытаюсь это написать на встроенном в RastrWin VBS, синтаксис которого отличается от того, что предлагается например на Microsoft Docs.
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
18.04.2022 14:54:33
|
Естественно vbs не равен vba. Вы пытаетесь использовать именованный аргумент, который vbs видимо считает переменной и может даже отправляет в Add результат сравнения. Попробуйте убрать "After=" и поставить _второй_ аргумент, ибо функция Add принимает их 4 - "до, после, и что-то там еще"
Код |
---|
Set xl = CreateObject("Excel.Application")
xl.visible = True
Set wb = xl.Workbooks.Add()
wb.Sheets.Add(Null, wb.Sheets(wb.Sheets.Count)).Name = "Вторая"
wb.Sheets.Add(Null, wb.Sheets(wb.Sheets.Count)).Name = "Третья" |
А так, на будущее
|
|
|
Nick_A
Посетитель
Всего сообщений: 45
Дата регистрации: 30.09.2021
|
Создано:
18.04.2022 17:50:10
|
Да, то, что нужно. Не знал, что вместо аргумента можно вписать Null, а наивный вариант (,wb.sheets.count) не прошёл. Спасибо
|
|
|
Nick_A
Посетитель
Всего сообщений: 45
Дата регистрации: 30.09.2021
|
Создано:
10.08.2022 17:01:36
|
|
Добрый день. Столкнулся вот с такой особенностью. С помощью макроса переношу из эксель в Растр нагрузки и генерацию в узлы. Немного разобрался с выборками и решил выполнить рефакторинг кода. Вот два фрагмента:
Код |
---|
for i = 0 to spNode.size - 1
for j = 2 to Counter
if spNodeNy.z(i) = spWoSheet.Cells(j,1).Value then
spNodePn.z(i) = spNodePn.z(i) + spWoSheet.Cells(j,2).Value
spNodeQn.z(i) = spNodeQn.z(i) + spWoSheet.Cells(j,3).Value
spNodePg.z(i) = spNodePg.z(i) + spWoSheet.Cells(j,4).Value
spNodeQg.z(i) = spNodeQg.z(i) + spWoSheet.Cells(j,5).Value
spNodeSel.z(i) = True
End If
next
next |
Код |
---|
for j = 2 to Counter
spNode.SetSel "ny=" & spWoSheet.Cells(j,1).Value
spNodePn.Calc("pn+" & Round(spWoSheet.Cells(j,2).Value,3))
spNodeQn.Calc("qn+" & spWoSheet.Cells(j,3).Value)
spNodePg.Calc("pg+" & spWoSheet.Cells(j,4).Value)
spNodeQg.Calc("qg+" & spWoSheet.Cells(j,5).Value)
spNodeSel.Calc("1")
next |
В предварительно обнулённые узлы записывается нагрузка. Плюс необходим т.к. нагрузка в один узел может скидываться из двух. Первый метод использует вложенные циклы, работает верно, но долго. Второй метод использует выборки (пока не до конца понимаю, на чём работает данный принцип... наверн что-то похожее на словари в Python). Он работет быстрее, но не верно. Округляет значения из эксель до целого, да еще и в меньшую сторону, из-за чего over90% нагрузок просто превращаются в ноль. Функция round не подходит. Можно как-то передавать этой переменной значение с заданной точностью?
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
10.08.2022 18:37:59
|
Может Calc парсит значение с запятой в разделителе вещественного числа вместо точки ?
|
|
|
Nick_A
Посетитель
Всего сообщений: 45
Дата регистрации: 30.09.2021
|
Создано:
11.08.2022 11:02:20
|
Да, так и оказалось. Обернул макрос в следующие инструкции:
Код |
---|
D=setlocale("en-us") ' установить разделитель точка для операций ввода-вывода
Rastr.LockEvent=True ' блокировка изменения информации в открытых окнах
Rastr.LogEnable=False ' блокировка вывода в протокол
####
Rastr.LogEnable=True
Rastr.LockEvent=False
Rastr.SendChangeData 0,"","",0 ' обновить содержимое открытых окон
|
Все заработало. Теперь парсит как дробное число.
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
11.08.2022 18:56:37
|
И Вам спасибо
|
|
|
Nick_A
Посетитель
Всего сообщений: 45
Дата регистрации: 30.09.2021
|
Создано:
17.08.2022 12:53:29
|
Дополню немного. Calc парсит c дробной частью при обороте макроса в указанные инструкции только в случае вот такой записи:
Код |
---|
spNodePg.Calc("pg+" & spWoSheet.Cells(j,4).Value)
|
Если же нужно заменить значение в ячейке на новое, логично подумать, что можно делать так:
Код |
---|
spNodePg.Calc(spWoSheet.Cells(j,4).Value)
|
... но нет) тоже парсит без дробной части. Можно сделать вот так:
Код |
---|
spNodePg.Calc("0")
spNodePg.Calc("pg+" & spWoSheet.Cells(j,4).Value)
|
То есть предварительно обнулить, а затем прибавить, результат даёт нужный.
|
|
|
Nick_A
Посетитель
Всего сообщений: 45
Дата регистрации: 30.09.2021
|
Создано:
23.08.2022 11:50:03
|
Добрый день. А подскажите пожалуйста. Как задать выборку узлов по условию "хотя бы одна из отходящих ветвей отмечена"?
Пока реализация вот такая:
Код |
---|
for i = 0 to spNode.size - 1
spVetv.SetSel "(ip="&spNodeNy.z(i)&"|iq="&spNodeNy.z(i)&")&sel=1"
if spVetv.Count > 0 then spNodeSel.z(i) = True
next
|
То есть для каждого узла делается выборка ветвей и проверяется ее размер (<> 0). А можно ли сделать что-то вроде такого: ?
Код |
---|
spVetv.SetSel "ip.npa="&ryp&"|iq.npa="&ryp
|
Здесь мы делаем выборку ветвей (выбираем все ветки, у которой номер начала или номер конца равен загадочной переменной "ryp"). Но условие подходит/не подходит проверяется в таблице узлы, это именно её атрибут "npa" (номер территории).
Заранее спасибо)
|
|
|
Евгений Машалов
Администратор
Всего сообщений: 1059
Дата регистрации: 23.04.2007
|
Создано:
23.08.2022 23:16:33
|
|
Код |
---|
spVetv.SetSel "ip.npa="&ryp&"|iq.npa="&ryp |
Цитата |
---|
Здесь мы делаем выборку ветвей (выбираем все ветки, у которой номер начала или номер конца равен загадочной переменной "ryp"). Но условие подходит/не подходит проверяется в таблице узлы, это именно её атрибут "npa" (номер территории). |
Нет. Эта выборка возвращает ветви, у которых номер территории одного из узлов равен ryp. Никаких номеров узлов в выборке не участвует.
У поля в БД может быть ссылка на другое поле в БД. У ветвей, в частности, номера узлов начала/кончала ссылаются на номера узлов в соответствующей таблице. Фич дает две:
1. меняем номер узла в таблице узлы - номера узлов ветвей меняются автоматически.
2. Можно делать выборки по полям в таблице, куда идет ссылка. Например
Возвращает ветви, у которых один или оба узла отмечены. Работает семантически так - находятся узлы ip (или iq), и через точку делается доступ к его полям. Ну ссылка она короче и есть ссылка.
Чтобы сделать выборку "хотя бы одна" нужен цикл. Не знаю как сделать чтобы одной выборкой. Да и обратная ссылка от узлов к ветвям в выборках недоступна. Проще отобрать отмеченные ветви и из них добраться до узлов.
|
|
|
Nick_A
Посетитель
Всего сообщений: 45
Дата регистрации: 30.09.2021
|
Создано:
24.08.2022 10:40:52
|
Ну да. Ссылка на поле в таблице узлов. И всё же обратная ссылка из узлов в ветви не работает, жаль. Спасибо за идею по перебору в цикле из отмеченных ветвей. Эта выборка будет меньше вроде как, чем перебор всей таблицы узлов.
|
|
|
Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
31.08.2023 14:17:11
|
Добрый день, коллеги!
Может кто сталкивался с проблемой макро Рустаб+Excel:
Есть макрос в Excel, который перебирает заранее созданные сценарии, строит и сохраняет графики переходных процессов.
Раньше работали на 32-разрядной версии офиса и растра.
В связи с тем, что модели от СО передаются для 64 разрядной версии перешли на 64 разрядные версии Рустаба и Excel.
При этом на первых же моделях от СО споткнулись на том, что при выполнении расчета ЭМППП
nRes = spFWDynamic.Run
Либо происходит зависание Excel, либо его самопроизвольная ошибка. Обычный расчет УР происходит без проблем.
При этом на другом компьютере на версии 2.8.1.6427 все работает, версия текущая 2.8.1.6430
Также есть такой эффект, что если запускаешь все в Рустабе, то все считает без ошибок, при этом если запускаешь
nRes = spFWDynamic.Run
То возвращается значение ошибки.
|
|
|
george zorin
Заглянувший
Всего сообщений: 5
Дата регистрации: 19.01.2023
|
Создано:
05.09.2023 08:38:41
|
Цитата |
---|
То возвращается значение ошибки |
Это случайно не похоже на эту тему?
https://www.rastrwin.ru/support/forum/...ssage10617
Тоже с таким столкнулся.
|
|
|
Михаил Одинцов
Постоянный посетитель
Всего сообщений: 148
Дата регистрации: 22.07.2008
|
Создано:
12.09.2023 14:44:14
|
Не знаю, вроде не очень похоже.
Во-первых Вы потльзуетесь интерфейсом из раздела 20.2 и на странице 399 написано, что "Пока интерфейс находится в экспериментальном статусе и никакого контроля допустимости изменения параметров не предусмотрено. Поэтому в ряде случаев несоответствие исходных
данных подготовленной модели может приводить к ошибкам вплоть до системных.". Т.е. может он и не работает нормально.
Во-вторых у Вас ошибка вроде выдается, когда идет обращение к циклу перебора контролируемых величин, может просто вы забыли контролируемые величины загрузить. Т.е. у Вас инициализация и первый шаг расчета сработали.
Я пользуюсь интерфейсом из 20.1.1-20.1.4, он должен быть стабильным. При этом наблюдаю разные результаты работы макроса на разных машинах, и такое ощущение, что это именно проблема Windows или Office, т.к. все началось при переходе на новые версии.
|
|
|