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


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

Авторизация

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



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


Подписка

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

Hits 66850612
6715
Hosts 3525086
1226
Visitors 53086841
6548

62


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

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

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

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


Тема: «Адресное извлечение информации из ячеек таблицы » в форуме: Макро   Просмотров: 22966
 
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 04.09.2008 12:11:13
 
 
Здравствуйте. Вопрос такой.

Для того, чтобы получить информацию (например, ток) из определенной ячейки таблицы (например, vetv) можно использовать следующее:
Rastr.Tables("vetv").Cols­("ie").Z(n), где n - номер строки, начинающийся с 0.

Как можно по другому извлекать инфорацию из ячеек при помощи ip, pq и np (номера начала и конца, номер паралельной ветви), т.е. зная эти три параметра???
 
Профиль
Наверх
Андрей Крутенёв
Гость
 
Создано: 04.09.2008 13:01:48
 
 
Через выборку SetSel

А зачем это нужно?
 
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 04.09.2008 13:35:28
 
 
Цитата
А зачем это нужно?

Я выполняю серию расчетов режимов, отключая поочередно по одному элементу и контролирую загрузку линий по отношению к допустимому значению. При превышении заданного значения в Excel появляется соответствующее предупреждении о том, что при отключении той или иной линии перезрузятся те или иные линии по отношению к заданному значению.

Для поочередного отключения линий я каждый раз прохожу циклом таблицу vetv и нахожу нужную линию и sel=1. Для того что-бы отключить след. линию, я заново загружаю файл с режимом (как бы востанавливаю расчетный режим).

Все это крайне медленно работает!
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 04.09.2008 13:37:26
 
 
Цитата
Андрей Крутенёв пишет:
Через выборку SetSel

Поясните, пожалуйста, какие входящие параметры у данного метода и что они обозначают?
 
Профиль
Наверх
Андрей Крутенёв
Гость
 
Создано: 04.09.2008 16:53:12
 
 
например, вот кусок текста макро:

Код
Set ktr=tvetv.Cols("ktr")  
viborka="ip=18543&iq=1833­7"   
tvetv.SetSel viborka
ktr.Calc "1"
viborka="ip=18543&iq=1833­8"   
tvetv.SetSel viborka
ktr.Calc "1"


Здесь, если ветвь попадает в выборку, то пересчитывается её коэффициент трансформации.

Т.е. в выборке может быть не один элемент...
Например, "na=1" и многое другое.
 
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 05.09.2008 08:26:14
 
 
Спасибо за представленный код. Но...

Приведенный Вами пример демонстрирует как можно адресно изменять данные в ячейках. А каким образом можно осуществить чтение из ячейки? Например, мне нужно вывести на экран значение тока (или мощности Р) в начале ветви "ip=18543&iq=1833?7&np=1"­...
 
Профиль
Наверх
Владимир Неуймин
Администратор
 
Всего сообщений: 268
Дата регистрации: 13.03.2007
Создано: 05.09.2008 10:20:03
 
 
Для ускорения работы не нужно использовать конструкции типа

Код
for i=0 to tvetv.Size-1
a=Rastr.Tables("vetv").Co­ls?("ie").Z(n)
next
в цикле.
Быстрее будет так

Код
Set tvetv=Rastr.Tables("vetv"­)
Set cie=cols.Cols?("ie")
for i=0 to tvetv.Size-1
    a=cie.Z(i)
next
Еще лучше сразу сформулировать критерий поиска, например, линий перегруженных по току

Код
tvetv.SetSel("ib>i_dop") ' Выбираем линии перегруженные по току

j= tvetv.FindNextSel(-1)

while j<>-1

a=cie.Z(j)

j= tvetv.FindNextSel(j)
wend
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 05.09.2008 11:05:46
 
 
Спасибо за представленные примеры "кода", но, как я Вас понимаю, чтение из определенной ячейки невозможно без прохождения цикла, находя нужную строку, удовлетворяющую условию поиска...
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 05.09.2008 11:28:35
 
 
Еще попрос про метод SetSel.
Возвращает ли этот метод какой-нить результат. Если, да, то какой?
 
Профиль
Наверх
Владимир Неуймин
Администратор
 
Всего сообщений: 268
Дата регистрации: 13.03.2007
Создано: 08.09.2008 10:08:55
 
 
Цитата
Михаил Реутов пишет:
Спасибо за представленные примеры "кода", но, как я Вас понимаю, чтение из определенной ячейки невозможно без прохождения цикла, находя нужную строку, удовлетворяющую условию поиска...


Код
tvetv.SetSel("ip=18543&iq­=1833?7&np=1")
j= tvetv.FindNextSel(-1)
if j<>-1 then a=cie.Z(j)

можно в sub завернуть при желании ....
 
Профиль
Наверх
Владимир Неуймин
Администратор
 
Всего сообщений: 268
Дата регистрации: 13.03.2007
Создано: 08.09.2008 10:10:16
 
 
Цитата
Михаил Реутов пишет:
Еще попрос про метод SetSel.
Возвращает ли этот метод какой-нить результат. Если, да, то какой?


нет ничего не возвращает ...
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 08.09.2008 11:33:59
 
 
Цитата
Владимир Неуймин пишет:
Код
tvetv.SetSel("ip=18543&iq­=1833?7&np=1")
j= tvetv.FindNextSel(-1)
if j<>-1 then a=cie.Z(j)

можно в sub завернуть при желании ....


Благодарю за еще один способ. Надо будет попробывать. Но я, немного покапавшись в справке к Растру, нашел следующий способ:
Код
cie=Rastr.Calc("val", "vetv", "ie", "ip=18543&iq=1833?7&np=1"­)

Я не могу судить о быстроте данного способа (метода), поскольку я не знаю "что в нем зашито", но, одно точно могу сказать, скорость работы моего макроса меня устраивает...
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1042
Дата регистрации: 23.04.2007
Создано: 08.09.2008 12:24:56
 
 
Мне сдается что восстанавливать режим путем чтения файла как-то расточительно. Включите то, что было отключено, отключите что-то новое, да и просто пересчитайте. Лучше наверное с плоского старта, а то вдруг после расчета с отключением оно развалится. Насчет чтения, я не очень понял что Вы хотите выбрать. Если перегруженные линии, то без выборки не обойтись. Но я так вижу что Вы конкретные ip;iq;np читатете. В этом случае я просто бы сделал в начале программы вектор (или как он там, "массив") с индексами нужных элементов и использовал бы его на всех итерациях цикла отключения. Сделать этот массив конечно придется SetSelом, но это же только 1 раз.
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 08.09.2008 12:55:41
 
 
Цитата
Евгений Машалов пишет: ... Лучше наверное с плоского старта, а то вдруг после расчета с отключением оно развалится. ...

При расчете режима использую вот такое
Код
Rastr.rgm "ps"

Цитата
Евгений Машалов пишет: ...Насчет чтения, я не очень понял что Вы хотите выбрать. Если перегруженные линии, то без выборки не обойтись
...

Евгений, макросы я пишу не в Растре, а в Excel. Растр я вообще не запускаю.
В Excel у меня забит эквивалент таблицы vetv, кое-что убрано, кое-что добавлено. Мне так удобней. Да и табличный процессор Excel работает быстрее, чем в Растре.
Вот к примеру. Ток по линии может оганичивается не только по ВЛ, но и по оборудованию (ТТ, ВЧЗ), которое навешано по концам ВЛ. Поэтому у меня в Excel имеется два столбца: в одном доп. ток по ВЛ и зависит от температуры, а в другой доп. ток по оборудованию и не зависит от температуры.
Запуская свой макрос в Excel, он просит указать на файл *.rg2. После чего в фоновом режиме происходит расчет режимов, где происходит соответствие токов по линиям с допустимыми токами. Результат формируется тут же, в Excel, в виде загрузки линии по току (в процентах).
Цитата
...Но я так вижу что Вы конкретные ip;iq;np читатете. В этом случае я просто бы сделал в начале программы вектор (или как он там, "массив") с индексами нужных элементов и использовал бы его на всех итерациях цикла отключения...

Евгений, я согласен, что такой метод имеет право существовать, но "сколько программистов, столько варианов кодов решения одной и той же задачи". А хотя... надо будет тоже попробывать... Спасибо.
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1042
Дата регистрации: 23.04.2007
Создано: 09.09.2008 11:55:07
 
 
Ну вот в колонку (невидимую, скажем) Excel и вписать индексы ветвей, и извлекать данные уже по ним, а не по выборке
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 09.09.2008 12:24:53
 
 
Цитата
Евгений Машалов пишет:
Ну вот в колонку (невидимую, скажем) Excel и вписать индексы ветвей, и извлекать данные уже по ним, а не по выборке

У меня в Excel имеется три столбца ip, iq, np. Цикл, проходя их, находит в объете ветвей (Rastr.Tables("vetv")) нужную ветвь и отключает ее, расчитывает режим. Внутри этого цикла другой цикл из каждой ветви извлекает значение тока и ... (читать выше). Потом отключенная линия включается и отключается следующая, расчет режима. И все заново...
Я предлагаю больше не обсуждать что и как у меня там, если Вас интересует я могу выслать код макроса...
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 09.09.2008 15:25:43
 
 
Цитата
Евгений Машалов пишет:
Мне сдается что восстанавливать режим путем чтения файла как-то расточительно.

Если транформатор в Растре задан тремя линиями (трехобмоточный или АТ) и одна линия отключена(например, ВН), на НН "сидит" нагрузка или генератор, связь с сетью по ветки СН. Как в этом случае отключать ветку СН? Ведь Растр вдобавок отключит еще и ветку НН, и узел средней точки. Такой случай может получиться и для транзита, состоящий из нескольких ветвей когда с одной стороны он разомкнут, а с другой отключается линия: Растр весь транзит отключит.

Как вернуться к первоначальной схеме, не загружая заново файл с режимом?
 
Профиль
Наверх
Евгений Машалов
Администратор

 
Всего сообщений: 1042
Дата регистрации: 23.04.2007
Создано: 09.09.2008 16:18:26
 
 
Простейший способ: делаем колонку StaBase типа bool в узлах и в ветвях (Rastr.Tables("node").Col­s.Add("StaBase")). Перед всеми расчетами пишем что-то типа Rastr.Tables("node").Cols­("StaBase").Calc("sta") (и для ветвей аналогично). Делаем отключения, расчеты и все такое. Для возврата к исходному режиму пишем Rastr.Tables("node").Cols­("StaBase").Calc("StaBase­") и т.д. Можно также запомнить напряжения и углы, если не хочется пересчитывать.

Цитата
Я предлагаю больше не обсуждать что и как у меня там, если Вас интересует я могу выслать код макроса...


Ну не обсуждать, так не обсуждать. Вроде тему насчет того что медленно работает я не начинал. Код не интересует...
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 09.09.2008 16:52:25
 
 
Спасибо большое за простейший способ, помогло...
 
Профиль
Наверх
Бекжан Мукатов
Посетитель
 
Всего сообщений: 17
Дата регистрации: 06.01.2010
Создано: 01.09.2010 14:02:11
 
 
Здравствуйте! Помогите пожалуйста в следующем вопросе:
Мне необходимо извлечь имя узла в цикле.
Конструкция:
Rastr.Tables("vetv").Cols­ ("ie").Z(n), где n - номер строки,
не подходит, так как я использую не номер строки, а сквозную нумерацию.

Вот часть кода:
For ii=0 to kol2-1
P=Rastr.Calc("val","node"­,"pn","numeraciya="&nomer­+ii)
Q=Rastr.Calc("val","node"­,"qn","numeraciya="&nomer­+ii)
ny=Rastr.Calc("val","node­","ny","numeraciya="&nome­r+ii)

If (P<cod Or Q<cod) Then
Rastr.printp "Отриц.нарг. в узле " & ny & ???ИМЯ???
Else
End If
Next
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 01.09.2010 14:44:09
 
 
Этим способом Rastr.Calc("val","node"?,­"name","ny="&X), где Х - номер узла (не строки) можно извлечь название только одного узла, нескольких - только через цикл. Воспользуйтесь лучше нижеприведенным кодом:
Код

Dim node, row
Set node = Rastr.Tables("node")
node.SetSel "pn<0|qn<0"
row = node.FindNextSel(-1)
While row <>-1
     Rastr.printp "Отриц.нарг. в узле " & node.Cols("name").Z(row)
     row = node.FindNextSel(row)
Wend
Set node = Nothing
 
Профиль
Наверх
Бекжан Мукатов
Посетитель
 
Всего сообщений: 17
Дата регистрации: 06.01.2010
Создано: 01.09.2010 15:54:49
 
 
Спасибо Михаил! Все работает как надо
 
Профиль
Наверх
Виталий Чумаченко
Посетитель
 
Всего сообщений: 18
Дата регистрации: 28.04.2011
Создано: 11.05.2011 13:53:54
 
 
Михаил,я заинтересовался Вашим макросом. Дело в том, что я как раз недавно начал разбираться с написанием макросов в растре. Как раз написал макрос последовательного отключения выделенных ветвей и узлов и ввод в таблицу контролируемых параметров результатов расчёта режима. Однако столкнулся с проблемой отключения нескольких элементов одновременно...Не могли бы Вы прислать этот скрипт для ознакомления?...Мне кажется, что расчёт через Excel будет удобнее для решения моей задачи...в Excel ещё не пробовал писать...
 
Профиль
Наверх
Михаил Реутов
Постоянный посетитель
 
Всего сообщений: 224
Дата регистрации: 21.11.2007
Создано: 01.06.2011 08:41:20
 
 
to Виталий Чумаченко
Дело было давно, и "этот скрипт" как таковой уже не "существует" (нз где он у меня на компе, может удалил его). Но есть другие срипты в Экселе. Что конкретно Вас интересует?
 
Профиль
Наверх



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


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







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