На главную страницу
Русский English
 


Поддержка
Форум
Техподдержка
Закрытый разделПерсональная

Авторизация

Запомнить меня на этом компьютере
  Забыли свой пароль?
  Регистрация



Поиск по сайту


Подписка

Изменение параметров

Hits 61134698
8888
Hosts 2881553
2510
Visitors 47915659
8318

15


Главная / Поддержка / Форумы / Макро

Форум «Макро»

Версия для печати Версия для печати

Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация

Сообщения 26 - 41 из 41
Начало | Пред. | 1 2 | След. | Конец 

Тема: «Rastr и Excel » в форуме: Макро   Просмотров: 36663
 
Nick_A
Посетитель
 
Всего сообщений: 40
Дата регистрации: 30.09.2021
Создано: 18.04.2022 12:06:07
 
 
Добрый день. Подскажите пожалуйста, в чем ошибка при выполнении:
spExcel.Sheets.Add(After = spExcel.Sheets(spExcel.Sh­eets.Count))
По отдельности элементы вроде распознаются. Просто добавить лист удалось, но тот помещается перед последним активным (не подходит). Подсчитать листы тоже удалось (и это уже по идеи можно использовать как аргумент номера листа, после которого нужно добавить новый.
Спасибо.
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1000
Дата регистрации: 23.04.2007
Создано: 18.04.2022 13:30:33
 
 
Здравствуйте. В Вашем вопросе что-то про RastrWin есть ?
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 40
Дата регистрации: 30.09.2021
Создано: 18.04.2022 13:40:48
 
 
Нуу как бы не очень... Просто пытаюсь это написать на встроенном в RastrWin VBS, синтаксис которого отличается от того, что предлагается например на Microsoft Docs.
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1000
Дата регистрации: 23.04.2007
Создано: 18.04.2022 14:54:33
 
 
Естественно vbs не равен vba. Вы пытаетесь использовать именованный аргумент, который vbs видимо считает переменной и может даже отправляет в Add результат сравнения. Попробуйте убрать "After=" и поставить _второй_ аргумент, ибо функция Add принимает их 4 - "до, после, и что-то там еще"

Код
Set xl = CreateObject("Excel.Appli­cation")
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
Посетитель
 
Всего сообщений: 40
Дата регистрации: 30.09.2021
Создано: 18.04.2022 17:50:10
 
 
Да, то, что нужно. Не знал, что вместо аргумента можно вписать Null, а наивный вариант (,wb.sheets.count) не прошёл. Спасибо
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 40
Дата регистрации: 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).Valu­e then
            spNodePn.z(i) = spNodePn.z(i) + spWoSheet.Cells(j,2).Valu­e
            spNodeQn.z(i) = spNodeQn.z(i) + spWoSheet.Cells(j,3).Valu­e
            spNodePg.z(i) = spNodePg.z(i) + spWoSheet.Cells(j,4).Valu­e
            spNodeQg.z(i) = spNodeQg.z(i) + spWoSheet.Cells(j,5).Valu­e
       spNodeSel.z(i) = True
        End If
    next
next



Код
for j = 2 to Counter
    spNode.SetSel "ny=" & spWoSheet.Cells(j,1).Valu­e
    spNodePn.Calc("pn+" & Round(spWoSheet.Cells(j,2­).Value,3))
    spNodeQn.Calc("qn+" & spWoSheet.Cells(j,3).Valu­e)
    spNodePg.Calc("pg+" & spWoSheet.Cells(j,4).Valu­e)
    spNodeQg.Calc("qg+" & spWoSheet.Cells(j,5).Valu­e)
    spNodeSel.Calc("1")
next


В предварительно обнулённые узлы записывается нагрузка. Плюс необходим т.к. нагрузка в один узел может скидываться из двух. Первый метод использует вложенные циклы, работает верно, но долго. Второй метод использует выборки (пока не до конца понимаю, на чём работает данный принцип... наверн что-то похожее на словари в Python). Он работет быстрее, но не верно. Округляет значения из эксель до целого, да еще и в меньшую сторону, из-за чего over90% нагрузок просто превращаются в ноль. Функция round не подходит. Можно как-то передавать этой переменной значение с заданной точностью?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1000
Дата регистрации: 23.04.2007
Создано: 10.08.2022 18:37:59
 
 
Может Calc парсит значение с запятой в разделителе вещественного числа вместо точки ?
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 40
Дата регистрации: 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  ' обновить содержимое открытых окон

Все заработало. Теперь парсит как дробное число.
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1000
Дата регистрации: 23.04.2007
Создано: 11.08.2022 18:56:37
 
 
И Вам спасибо
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 40
Дата регистрации: 30.09.2021
Создано: 17.08.2022 12:53:29
 
 
Дополню немного. Calc парсит c дробной частью при обороте макроса в указанные инструкции только в случае вот такой записи:

Код

spNodePg.Calc("pg+" & spWoSheet.Cells(j,4).Valu­­e)


Если же нужно заменить значение в ячейке на новое, логично подумать, что можно делать так:

Код

spNodePg.Calc(spWoSheet.C­ells(j,4).Valu­e)

... но нет) тоже парсит без дробной части. Можно сделать вот так:

Код

spNodePg.Calc("0")
spNodePg.Calc("pg+" & spWoSheet.Cells(j,4).Valu­­e)


То есть предварительно обнулить, а затем прибавить, результат даёт нужный.
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 40
Дата регистрации: 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" (номер территории).

Заранее спасибо)

 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1000
Дата регистрации: 23.04.2007
Создано: 23.08.2022 23:16:33
 
 
Код
spVetv.SetSel "ip.npa="&ryp&"|iq.npa="&­­ryp

Цитата
Здесь мы делаем выборку ветвей (выбираем все ветки, у которой номер начала или номер конца равен загадочной переменной "ryp"). Но условие подходит/не подходит проверяется в таблице узлы, это именно её атрибут "npa" (номер территории).

Нет. Эта выборка возвращает ветви, у которых номер территории одного из узлов равен ryp. Никаких номеров узлов в выборке не участвует.
У поля в БД может быть ссылка на другое поле в БД. У ветвей, в частности, номера узлов начала/кончала ссылаются на номера узлов в соответствующей таблице. Фич дает две:
1. меняем номер узла в таблице узлы - номера узлов ветвей меняются автоматически.
2. Можно делать выборки по полям в таблице, куда идет ссылка. Например
Код
ip.sel|iq.sel

Возвращает ветви, у которых один или оба узла отмечены. Работает семантически так - находятся узлы ip (или iq), и через точку делается доступ к его полям. Ну ссылка она короче и есть ссылка.
Чтобы сделать выборку "хотя бы одна" нужен цикл. Не знаю как сделать чтобы одной выборкой. Да и обратная ссылка от узлов к ветвям в выборках недоступна. Проще отобрать отмеченные ветви и из них добраться до узлов.
 
Профиль
Наверх
Nick_A
Посетитель
 
Всего сообщений: 40
Дата регистрации: 30.09.2021
Создано: 24.08.2022 10:40:52
 
 
Ну да. Ссылка на поле в таблице узлов. И всё же обратная ссылка из узлов в ветви не работает, жаль. Спасибо за идею по перебору в цикле из отмеченных ветвей. Эта выборка будет меньше вроде как, чем перебор всей таблицы узлов.
 
Профиль
Наверх
Михаил Одинцов
Постоянный посетитель
 
Всего сообщений: 133
Дата регистрации: 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
Заглянувший
 
Всего сообщений: 4
Дата регистрации: 19.01.2023
Создано: 05.09.2023 08:38:41
 
 
Цитата
То возвращается значение ошибки


Это случайно не похоже на эту тему?
https://www.rastrwin.ru/s­upport/forum/...ssage1061­7

Тоже с таким столкнулся.
 
Профиль
Наверх
Михаил Одинцов
Постоянный посетитель
 
Всего сообщений: 133
Дата регистрации: 22.07.2008
Создано: 12.09.2023 14:44:14
 
 
Цитата
Это случайно не похоже на эту тему?
https://www.rastrwin.ru/s­­upport/forum/...ssage106­1­7

Не знаю, вроде не очень похоже.
Во-первых Вы потльзуетесь интерфейсом из раздела 20.2 и на странице 399 написано, что "Пока интерфейс находится в экспериментальном статусе и никакого контроля допустимости изменения параметров не предусмотрено. Поэтому в ряде случаев несоответствие исходных
данных подготовленной модели может приводить к ошибкам вплоть до системных."
. Т.е. может он и не работает нормально.
Во-вторых у Вас ошибка вроде выдается, когда идет обращение к циклу перебора контролируемых величин, может просто вы забыли контролируемые величины загрузить. Т.е. у Вас инициализация и первый шаг расчета сработали.
Я пользуюсь интерфейсом из 20.1.1-20.1.4, он должен быть стабильным. При этом наблюдаю разные результаты работы макроса на разных машинах, и такое ощущение, что это именно проблема Windows или Office, т.к. все началось при переходе на новые версии.
 
Профиль
Наверх


Сообщения 26 - 41 из 41
Начало | Пред. | 1 2 | След. | Конец 

Читают тему
гостей: 1, пользователей: 0, из них скрытых: 0


Список форумов
Новые темы
Список тем
Поиск по форумам
Помощь
Войти
Регистрация







Программный комплекс «RasrWin»
Программный комплекс «RastrWin»
© «RastrWin», 1988-2019