Глобальная переменная

Автор Alex16, 22 ноября 2016, 15:32

0 Пользователи и 1 гость просматривают эту тему.

Alex16

Цитата: JohnSUN от 25 ноября 2016, 10:01ты пока глянешь, как я поизмывался над TestList
Спасибо. Прикольно. Нашел для себя полезное. Спасибо за фишку;) Но по моей задаче - переделка пока не в тему. Хотя я пока только бегло просмотрел.
По порядку:
Цитировать'Global LastUserID%   - не нужен он для этой задачи, не нужен и всё тут
Все таки нужен. Повторяюсь. Нет необходимости вызывать ColoredRep при переходе от пользователя к пользователю. Только от пользователя к общему и наоборот.
ЦитироватьRem Константы перенес сюда, чтобы не терялись среди кода
.....
' Sub Main - это плохое имя для процедуры события. Обычно словом Main обозначают Главное Действие, а подготовка списка - это не оно
согласен на 100%
Цитировать'   I = GetCtrl("SpisUsr").SelectedItems(0) ' Отыскать контрол, который только что сработал?
'   LoadRep(I)
' Можно проще   LoadRep(oEvent.Selected)
' Но можно передать в LoadRep не индекс элемента, а прямо его текст. Мало ли, вдруг в какой-то момент
' поменяется порядок элементов в списке? Поэтому
А тут я не согласен :) Мне, как раз,  не важен порядок в списке, более того и список(кол-во) и имена могут меняться. Единственно - "общий" всегда будет первым.
Чуть позже продолжу.... отвлекают на работе...

JohnSUN

Цитата: Alex16 от 25 ноября 2016, 13:38
по моей задаче - переделка пока не в тему.
Как не в тему? Ты ж говорил тормозит? Значит переделка нужна. Может быть и не такая, как в TestList, но нужна.
Цитата: Alex16 от 25 ноября 2016, 13:38Нет необходимости вызывать ColoredRep при переходе от пользователя к пользователю. Только от пользователя к общему и наоборот.
Мне, как раз,  не важен порядок в списке, более того и список(кол-во) и имена могут меняться. Единственно - "общий" всегда будет первым.
Прости моё тугодумие - а на фига тогда вообще этих юзеров в списке перечислять? Дал один переключатель-радиокнопку "Общий/Пользовательский" и до свидания!
И зачем ты вообще этот список прилепил? Ты же изначально вроде бы хотел по системному имени пользователя ориентироваться? То есть, прямо при открытии книги "Ты кто такой?" и ОДИН РАЗ ЗА ВЕСЬ СЕАНС заблокировался и перекрасился...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: Alex16 от 25 ноября 2016, 11:03
Может тогда на момент долгой работы макроса, как-то блокировать (например ListBox.Enabled = False <ColoredRep> ListBox.Enabled = True) И выводить окошко <Идет загрузка данных...>?
Если это так, то каким способом это лучше сделать, не усугубив ситуацию?
1. Выводить окошко <Идет загрузка :o реактора :o ...>
2. Запускать макрос на ночь, утром будет готово :P ...

А если серьёзно, тормоза из-за раскраски в макросе, причём скорость раскраски разных диапазонов различна и непостоянна. Попробуйте отказаться от раскраски. Помимо этого, макросы слишком усложнены, есть и лишний код и неправильный.

По названию темы: не вижу для чего использовать гоблинные ;D переменные в вашем документе, вполне хватает обычных.

Структура документа (листы, диапазоны и т.д.) DailyRep.ods сохранится или будут революционные изменения?

Alex16

#48
Цитата: JohnSUN от 25 ноября 2016, 11:46на фига тогда вообще этих юзеров в списке перечислять? Дал один переключатель-радиокнопку "Общий/Пользовательский" и до свидания!
И зачем ты вообще этот список прилепил? Ты же изначально вроде бы хотел по системному имени пользователя ориентироваться?
Не все так просто. Привязка к системному имени пользователя - это не основное. Просто для удобства. Есть куча операторов, которые вносят данные в свой отчет, но иногда оператор сидит не под своей учеткой в системе, поэтому отчет запустится с системной утчеткой, и нужно будет выбрать другую. Так же могут несколько пользователей вносить данные в отчет на одном компе, не переходить же для этого в ОС под свою учетку, для того что бы в отчете забить данные. Так же есть человек, который ходит по отчету, ему нужен и общий и всех пользователей....
Цитата: rami от 25 ноября 2016, 12:00Попробуйте отказаться от раскраски.
Если уж будет совсем туго, тогда наверное так и сделаю., Но блокировку убрать не вариант.
Цитата: rami от 25 ноября 2016, 12:00Помимо этого, макросы слишком усложнены, есть и лишний код и неправильный.
Я не спорю, это не конечный вариант, а только тестирование и в какой-то мере обучение.
Цитата: rami от 25 ноября 2016, 12:00Структура документа (листы, диапазоны и т.д.) DailyRep.ods сохранится или будут революционные изменения
Пока на данный момент структура именно так и будет. А диапазоны будут менятся константами в коде, типа:
   const StartColRow = 13
const EndColRow = 187
const Col1  = 4
const Col2  = 5
const Col3  = 7
const Col4  = 8
const Col5  = 10
const Col6  = 11
const Col7  = 13
const Col8  = 14
const Col9  = 16
const Col10 = 17
const StrColumns = "E,F,H,I,K,L,N,O,Q,R"
const Pass = "12345"

Потому, как таблица может меняться. Некоторый "лишний" код, типа PrepareRepFirst, на самом деле не лишний. Он выполняется один раз, когда меняется общая таблица. В общем приходит файл с новой таблицей, но немного другой структуры, вот задолбался я ее каждый раз подправлять для наших нужд, поэтому появились макросы "Prepare..."
И как уже говорил ранее, эта книга - еще не конечный вариант, есть еще куча макросов в другом месте, вот теперь начинаю потихоньку их собирать в одной конечной книге.
А по поводу революционных изменений - это зависит от отчета, который нам пришлют сверху в следующий раз, но пока(последние пару лет) изменения были не революционные)

Alex16

#49
Цитата: rami от 25 ноября 2016, 12:00По названию темы: не вижу для чего использовать гоблинные  переменные в вашем документе, вполне хватает обычных.
В общем-то согласен. Исключение только для LastUserID - хотя и этого можно как-то избежать. Но последний выбранный пункт в листе нужно знать :)
И тема немного ушла в другое русло :( В этом каюсь...

JohnSUN

#50
Цитата: Alex16 от 25 ноября 2016, 15:02
Не все так просто.
Ага, статус "Семейное положение: всё сложно"
Цитата: Alex16 от 25 ноября 2016, 15:02Привязка к системному имени пользователя - это не основное. Просто для удобства. Есть куча операторов, которые вносят данные в свой отчет, но иногда оператор сидит не под своей учеткой в системе, поэтому отчет запустится с системной утчеткой, и нужно будет выбрать другую. Так же могут несколько пользователей вносить данные в отчет на одном компе, не переходить же для этого в ОС под свою учетку, для того что бы в отчете забить данные. Так же есть человек, который ходит по отчету, ему нужен и общий и всех пользователей....
Так, может, при открытии файла прямо в лоб его и спросить "Ты кто такой? Чего такой дерзкий? Семки есть?.." Что в ответ введет, то и использовать (если, конечно, проверку пройдет)
Цитата: Alex16 от 25 ноября 2016, 15:02
Если уж будет совсем туго, тогда наверное так и сделаю., Но блокировку убрать не вариант.
Ну, это если будет совсем туго. Просто для того, чтобы изменить фон у ячейки, совсем необязательно менять ей фоновый цвет. Хм, лихо завернул... Ещё одна попытка: чтобы перекрасить ячейку в нужный цвет не обязательно менять ей бэкграунд колор.
Например, страшное слово "стили" слышал? И что они используются в условном форматировании тоже знаешь? Ну так вот, у меня для тебя хорошая новость. Долгое время флажок "Защита ячейки" в пользовательском стиле не имел значения - Calc смотрел на основное свойство ячейки и ориентировался на её защиту. Я не заметил с каких пор, но теперь поведение изменилось - ячейки действительно защищаются (и раскрашиваются) с помощью условного форматирования. Еще остался маленький "хомут" - кнопка Tab не всегда обеспечивает переход по таким ячейкам. Но тыкать мышкой и менять данные вполне получается.
То есть, создаем два стиля, скажем, с именами "ProtectedCell" и "UnprotectedCell". В их свойствах задаем цвет фона и значение защиты. Для целых диапазонов задаем условное форматирование из двух формул "Если Юзер=Общий то стиль ProtectedCell" и, наоборот, "Если Юзер<>Общий то стиль UnprotectedCell". Сам Юзер может быть хоть той же ячейкой Q4, в которую ты индекс списка выдергиваешь. Защищаешь лист раз и навсегда и вычеркиваешь кучу кода, которая уже больше не нужна.

Цитата: rami от 25 ноября 2016, 12:00Помимо этого, макросы слишком усложнены, есть и лишний код и неправильный.
+ (Заметьте, плюсую даже невзирая на то, что часть этого кода моя собственная  ;D )

Цитата: Alex16 от 25 ноября 2016, 15:02А диапазоны будут менятся константами в коде...
Не будут они меняться, их там не будет...
Цитата: Alex16 от 25 ноября 2016, 15:19Но последний выбранный пункт в листе нужно знать :)
И еще раз - зачем? Или ты о предпоследнем говоришь?
Цитата: Alex16 от 25 ноября 2016, 15:02
это ... в какой-то мере обучение.
Весьма похвально! Всегда рады помочь

UPD. Пример условного форматирования во вложении - код уже ковырять не стал, только формулы поправил и форматы задал. Ну и список перекинул в Данные-Проверка
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex16

Цитата: JohnSUN от 25 ноября 2016, 13:54Так, может, при открытии файла прямо в лоб его и спросить "Ты кто такой? Чего такой дерзкий? Семки есть?.." Что в ответ введет, то и использовать (если, конечно, проверку пройдет)
Я понимаю, что вы видите это со своей стороны, и может быть не менее правы, чем я.:)
Но я пока вижу так как вижу.
Попробую поковыряться со стилями... но, если честно, мне проще код написать, чем разобраться в настройках документа или офиса.... Я ведь потом забуду, где и что наменял...

Цитата: JohnSUN от 25 ноября 2016, 13:54Не будут они меняться, их там не будет...
Ну как же, а если в новом отчете сменится кол-во групп, да и в группе может изменится кол-во подгрупп.... в итоге ячеек(строк) в столбце будет другое кол-во. Вот и сменился диапазон ввода данных.
Если имелось ввиду не будет констант - тогда нужно будет вспоминать как я вообще эти стили настроил :(


JohnSUN

Как-как настроил... Да по заголовкам столбцов. Только не столбцов листа, а столбцов отчета - по вон тем дополнительным цифирькам в объединенных ячейках - 3, 4, 5...

Пока ты писал, я проапдейтил предыдущий пост - файл там, смотри. Не тормозит? И вроде как полегче стал?

И не "выкай" тут на меня - не ссорились  :beer:
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex16

Цитата: JohnSUN от 25 ноября 2016, 13:54И еще раз - зачем? Или ты о предпоследнем говоришь?
Если в моей
Sub ColoredRep(CommonRep as Boolean)
Dim StrColumnsArr(), N%, Range as String, CellProtection
StrColumnsArr = Split(StrColumns, ",")
ThisReport.lockControllers()
ThisReport.addActionLock()
if shtReport.isProtected() Then shtReport.unprotect(Pass)
For N = LBound(StrColumnsArr) to UBound(StrColumnsArr)
  Range = StrColumnsArr(N) & StartColRow + 1 & ":" & StrColumnsArr(N) & EndColRow + 1
 
  CellProtection = shtReport.getCellRangeByName(Range).CellProtection
  if CommonRep then
    'print "Color Common Rep"
shtReport.getCellRangeByName(Range).CellBackColor = 14540253
CellProtection.IsLocked = True
  else
    'print "Color User"
    shtReport.getCellRangeByName(Range).CellBackColor = 15202046
    CellProtection.IsLocked = False
  endif
  shtReport.getCellRangeByName(Range).CellProtection = CellProtection
Next N
shtReport.protect(Pass)
ThisReport.removeActionLock()
ThisReport.unlockControllers()
End Sub

раскомментировать два print то можно заметить, что они покажутся(правда в цикле несколько раз) только при переходе в списке от пользователя к общему и наоборот.
Как это сделать без запоминания предыдущего выбора?
По всей видимости эту тему нет смысла дальше развивать. Буду сейчас делать дальше свою книгу, с учетом ваших замечаний и предложений, но пока оставлю основную "затею" свою.
С медленной раскраской пока.... наверное пока "забью" на нее.... Сейчас буду собирать все макросы в кучу, а там видно будет)

Alex16

Цитата: JohnSUN от 25 ноября 2016, 14:51И не "выкай" тут на меня - не ссорились
:) Ок.
Цитата: JohnSUN от 25 ноября 2016, 14:51Пока ты писал, я проапдейтил предыдущий пост - файл там, смотри. Не тормозит? И вроде как полегче стал?
Файл DailyRep форматы.ods У меня открылся и посыпались "не определена переменная" - ну это не страшно, сейчас пройдусь по коду, поубираю лишнее...

Alex16

Да, с раскраской в DailyRep форматы.ods быстро. Если честно, я не понял как это сделано :( Не силен я в работе офисных приложениях. Стили, проверки данных и все такое для меня темный лес. Другое дело код прочитать :)
Но раскраска больше для удобства, дальше после смены пользователя - нужна загрузка данных.

JohnSUN

...а после того как пользователь поработает нужна будет выгрузка данных?..
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex16

#57
Цитата: JohnSUN от 25 ноября 2016, 15:31...а после того как пользователь поработает нужна будет выгрузка данных?..
ну в общем то да. Я сделал, с вашими(форумчанами) подсказками, на изменение ячейки, сразу данные меняются в "хранилище данных"(лист дата)
Но будет метод полного сохранения данных.
Выгрузка-Загрузка будет при смене пользователя (в отчете). Так же там еще будут суммироваться по группам и выводится сверху в три строчки(три группы потому что)
ИД группы в колонке "B". Для этого там есть макрос который генерирует и вставит формулы, но константы там не верные - это из другого тестового файла, не успел исправить, сорри...
Этот макрос тоже из группы PrepareXXX.....