На главную страницу RastrWin

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


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

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

Тема: «Rastr и Excel » в форуме: Макро   Просмотров: 33702
 
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
 
 
Ну да. Ссылка на поле в таблице узлов. И всё же обратная ссылка из узлов в ветви не работает, жаль. Спасибо за идею по перебору в цикле из отмеченных ветвей. Эта выборка будет меньше вроде как, чем перебор всей таблицы узлов.
 
Профиль
Наверх


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

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


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





Работает на «Битрикс: Управление сайтом» © «Битрикс», 2001-2006