sergey_frolov написал: поэтому любые Ваши идеи и предложения
Например написать инструкцию, как пользоваться Гитом на минималках, возможно вы используете какую-то автоматизацию. Гит продвинутая вещь, и информация про него всегда сложное, а такого чтобы просто описания как загрузить, обновить, сделать зеркало (что-то меня понесло) один файл.. было бы маст-хев просто.
Сергей написал: vba это весьма странный и нелогичный язык (после работы с gs от google).
Это наоборот логично, что процедура передачи ссылки обозначается чуть по другому, чем простое присвоение. "Gs" (без гугл) сам по себе это тоже очень странный язык, об этом говорят сплошь и рядом.
visors16, у меня работает на Win 8.1 гифка играет без останова. Может быть в более поздних версиях Windows что-то поменялось и вызов таких функций как mouse_event больше не определяется как активность пользователя. Тут я уже врядли подскажу
testuser написал: Что можно сделать - сообщить системе об активном состоянии с помощью vba
Это неверный вариант. Вот рабочий вариант - имитация активности пользователя с помощью эмуляции минимального движения мыши. Код нужно поместить в модуль листа.
Код
Option Explicit
Private Enum MouseEventFlags
MOUSEEVENTF_MOVE = 1
End Enum
Private Declare PtrSafe Sub mouse_event Lib "user32" ( _
ByVal dwFlags As MouseEventFlags, _
ByVal dx As Long, _
ByVal dy As Long, _
ByVal dwData As Long, _
ByVal dwExtraInfo As LongPtr)
Private Const Interval As Date = #12:00:29 AM# 'интервал срабатывания тймера (29 секунд)
Private NextTime As Date
Private blAnimationOn As Boolean
'
Sub KeepingAnimation()
If blAnimationOn Then
'каждые 29 сек. вызывает имитацию активности пользователя (небольшое колебание указателя мыши)
NextTime = NextTime + Interval
Application.OnTime NextTime, "Лист1.KeepingAnimation"
DoEvents
mouse_event MOUSEEVENTF_MOVE, 1, 0, 0, 0
mouse_event MOUSEEVENTF_MOVE, -1, 0, 0, 0
End If
End Sub
'включаем таймер при активации листа
Private Sub Worksheet_Activate()
blAnimationOn = True
NextTime = Now + Interval
Application.OnTime NextTime, "Лист1.KeepingAnimation"
End Sub
'отключаем таймер при деактивации листа
Private Sub Worksheet_Deactivate()
blAnimationOn = False
End Sub
Скорее всего это работает так. Компонент Эксель, который проигрывает gif-анимацию фиксирует активность пользователя, и если в течение 30 сек. не происходит какой-либо активности - прекращает проигрывание картинки. Что можно сделать - сообщить системе об активном состоянии с помощью vba. Для этого есть специальные api-функции (не помню точно какие), которые позволяют установить специальный флаг активности в системе. Такой флаг устанавливают, как правило, все программы, которые проигрывают какое-то медиа. Допустим в браузере проигрывается какое-то медиа - видео, аудио или даже Gif-анимация. Браузер при этом устанавливает в системе флаг постоянной активности. При этом все программы, фиксирующие активность/неактивность пользователя будут "видеть" постоянную активность. Допустим программа, включающая заставку экрана, не включает заставку, когда открыт браузер и в нем проигрывается гифка.
Function NumToLiter(ByVal lNum As Long) As String
Const Base& = 26
Dim lTmp&
Do
lTmp = (lNum - 1) \ Base
NumToLiter = ChrW(lNum - lTmp * Base + 64) & NumToLiter
lNum = lTmp
Loop While lNum
End Function
KUDRIN, в vba нет базовой поддержки многопоточности, но можно запускать несколько экземпляров Excel, организовав взаимодействие между их vba-средами, но это не про использование vba-udf, это надо делать макросами и надо чутка в этом понимать, или хотябы стремиться )
Kimkim написал: нужно подобрать четыре столбца значение Ложь в которых будет в максимальном количестве строк.
Вопрос решается сортировкой столбцов по 1й строке, в которой у вас суммы значений. После сортировки по возрастанию первые 4 столбца и будут содержать "ложь" в макс. колличестве. Хотя если у вас единица означает ложь, тогда наоборот - последние 4 столбца.
Короче может это уже было но пусть будте. Действительно что-то там после 100000
Скрытый текст
Код
Private Sub DicttVsCollTest()
Const CntElem& = 200000
Const CntIter& = 1
Const minSzStr& = 5 'минимальный размер случайных строк
Const maxSzStr& = 10 'максимальный размер случ. строк
Dim sRndAr$()
sRndAr = GetRndStrArray(CntElem, minSzStr, maxSzStr)
Dim i&, j&, t!, t1!, t2!
Dim Coll As New VBA.Collection
t = Timer
For j = 0 To CntElem - 1
Coll.Add Empty, sRndAr(j)
Next
t1 = t1 + Timer - t
Dim Dict As New Dictionary
t = Timer
For j = 0 To CntElem - 1
Dict.Add sRndAr(j), Empty
Next
t2 = t2 + Timer - t
Debug.Print "Скорость заполнения " & CntElem & " элементов: "
Debug.Print "Коллекция: ", t1
Debug.Print "Словарь: ", t2
Dim vElem
t1 = Timer
For i = 1 To CntIter
For j = 0 To CntElem - 1
vElem = Coll(sRndAr(j))
Next
Next
t1 = Timer - t1
t2 = Timer
For i = 1 To CntIter
For j = 0 To CntElem - 1
vElem = Dict(sRndAr(j))
Next
Next
t2 = Timer - t2
Debug.Print "Получение элементов: "
Debug.Print "Коллекция: ", t1
Debug.Print "Словарь: ", t2
End Sub
Function GetRndStrArray(ByVal Cnt As Long, ByVal minStrSz&, ByVal maxStrSz&) As String()
Cnt = Cnt - 1
Dim i&, sArOut$(): ReDim sArOut(Cnt)
For i = 0 To Cnt
sArOut(i) = GetRandomString(minStrSz, maxStrSz)
Next
GetRndStrArray = sArOut
End Function
Function GetRandomString(ByVal Lw&, ByVal Up&) As String
Static init As Boolean, ChrTbl$, ChrTblLen&
If init Then
Else
ChrTbl = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqastuvwxyzАБВГДЕЁЖЗИЙКЛМНУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя "
ChrTblLen = Len(ChrTbl)
Randomize
init = True
End If
Dim i&, j&, strLen&: strLen = (Up - Lw + 1) * Rnd + Lw
GetRandomString = String(strLen, vbNullChar)
For i = 1 To strLen
j = Int(ChrTblLen * Rnd + 1)
Mid$(GetRandomString, i) = Mid$(ChrTbl, j, 1)
Next
End Function
Сергей Юрьевич написал: Или призводительность сопоставима и переписав проект, избавив его от Dictionary, я не получу жесткой просадки производительности в части .keys() функционала? Вы не тестировали ее в плане перформанса?
Конкретно этот момент я не тестировал. Самописная функция выполняемая на vba, компилируемом в режиме p-code, вероятнее всего будет медленей функции из нативно-скомпилированной библиотеки. Плю на x64 vba добавляются жесткие тормоза на вызов Api-функций. Другой вопрос, на сколько это будет медленей, заметно ли это для глазу в каком-то конкретном случае, вы конечно можете это протестировать и т.о. внести какую-то ясность в этом моменте.
Цитата
БМВ написал: Пробигало мнение что после 100 000 словарь
Я однажды экспериментировал с изобретением самописного словаря и заодно сравнил скорость заполнения + поиска в коллекции и словаре случайных строковых ключей. И у меня почему-то коллекции оказывалась сильно быстрей даже на куда меньшем количестве, т.е. 10к очень было заметно. Главное, я думаю учитывать разную реализацию поиска у коллекции - бинарное дерево, от словаря - хеш-таблица. Бинарное дерево лучше заполнять случайными данными, или если данные отсортированы, то заполнять их в случайном порядке. Для хэш-таблицы это не критично, но у нее (конкретно у Dictionary) есть другой недостаток - сама хэш-таблица внутри словаря имеет четко фиксированый размер, это понятно по тому факту, что после определенного колличества ключей, начинает заметно падать скорость поиска.
Сергей Юрьевич написал: опрос цены в плане производительности в сравнении с тем же Dictionary.
Как правило, хватает обычного Dictionary. Все зависит, конечно от задачи, но имхо лучше в алгоритме избегать такого сюжета, когда многократно получается массив ключей или значений, а реализовать это как-то по другому.
Private Sub Пример()
Dim lAr&()
lAr = Распределение(30, 60, 2, 8)
End Sub
Function Распределение(Min!, Max!, Interval!, Count!)
Dim i!, l&, lAr(), Stp!
ReDim lAr(1 To Count, 1 To 1)
Stp = (Max - Min) / (Count - 1)
For i = Min To Max Step Stp
l = l + 1
lAr(l, 1) = ((i - 1) \ Interval) * Interval + Interval
Next
Распределение = lAr
End Function
Проверил сейчас, можно "символическую ссылку" на сетевую папку создать, но для этого нужно повышение прав. Junction тоже создается для сетевой папки, без повышения прав, но не работает.
A132, вы бы привели реальный небольшой рабочий пример (с вымышленными данными) того, как у вас это реализовано. Тогда было бы более понятней о чем говорить, и вам бы могли дать более внятные рекомендации.
A132 написал: 20млн. ячеек - заняты все строки практически до конца (около 900 000) и в несколько столбцов
Это не надо хранить в Экселе. Файлы Эксель представляют из себя запакованные zip-архивы, и при каждом открытии затрачивается время на распаковку, а при закрытии/сохранении на упаковку данных. Плюс числовые целочисленные данные в Экселе обязательно преобразуются в числа с плавающей точкой, а при сохранении, числа еще преобразуются в текст. Столько данных лучше выгружать в отдельный файл и считывать их от туда когда требуется.
nilske, выражаю Вам высокую благодарность за столь ценное замечание, хорошо что есть столь ценные граждане на данном форуе, которые нходятся в тщательной бдительности, и в случай чего могут сделать незамедлительное не млоценное замечание, аль пожаловаться куда следует, если уж де установленный закон не блюдется в должной и рьяной безпрекословности. Ходатайствую вам на медаль! )
Я всетаки скажу. У вас тут не здоровая дрочка (иного слова не мог подобрать) за никнеймы. Мне по большей части все равно, но кто-то должен это сказать. Вы ж сдесь в основном зубры, и должны помниь времена icq и т.д. Я понимаю когда человек вставляет пароль вместо имени это зашквар, но что плохого в ksen14ka? ) https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=168494&TITLE_SEO...