Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
bedvit: XlSet может помещать в ячейки только константы, а не формулы.
то есть, если в качестве очередного элемента массива будет "=СУММ(A1:A:5)", то так строкой и вставится? Думаю, последующее преобразование в реальную формулу не составит труда. Ну, или, тогда уж проще и быстрее использовать штатную Range().Formula = arr
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
evgeniygeo: Мне кажется, это поможет слегка популяризировать форум, т.к. после закрытия первых двух тем, не очень хочется даже пытаться создавать новую.
1. С популярностью у площадки всё в порядке 2. Если "ранимость" от указания на несоблюдение правил превосходит необходимость получения помощи, то добро пожаловать на менее популярные ресурсы для Excel/VBA типа Кибера. Там практически любая тема (пример) получит какую-никакую (про количество, а не качество помогающих) помощь. 3. Далеко не всегда темы сразу закрываются.
Цитата
evgeniygeo: я бы предложил использовать не предупреждения, а количество созданных тем (думаю, что это не сложно отслеживать), но может быть можно использовать эту функцию (я первый раз ее сегодня заметил)?
Предупреждения и так не используются — в остальном предлагайте, сколько душе угодно, но далеко не факт, что оно будет реализовано
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Вводите как обычную функцию, а не массивную с фигурными скобками
Код
'Option Base 1
Option Explicit
'Option Private Module
'==================================================================================================
Function ConcatUniq(xRg As Range, xChar As String) As String
Dim xCell As Range
Dim x, s$, VT&, xDic As Object
Set xDic = CreateObject("Scripting.Dictionary")
For Each xCell In xRg
VT = VarType(xCell.Value)
If ((VT = vbEmpty) Or (VT = vbError)) Then GoTo nx
s = xCell.Value
If ((s = "") Or (s = "1")) Then GoTo nx
x = xDic(s)
nx: Next xCell
if (xDic.Count <> 0) Then ConcatUniq = Join$(xDic.Keys, xChar)
Set xDic = Nothing
End Function
'==================================================================================================
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Я не против удаления. Флёр названия мне тоже уже не нравится.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
TestSelection сортирует выделенный диапазон по 1му столбцу на месте
Код
Option Base 1
Option Explicit
Option Private Module
'==================================================================================================
Sub PRDX_SortRecur_WithInd(aV(), aI() As Long, LBnd&, UBnd&)
Dim i&, j&, n&, x, y
i = LBnd: j = UBnd: x = aV((LBnd + UBnd) \ 2)
Do
While (aV(i) < x): i = i + 1: Wend
While (x < aV(j)): j = j - 1: Wend
If (i <= j) Then
y = aV(i): aV(i) = aV(j): aV(j) = y
n = aI(i): aI(i) = aI(j): aI(j) = n
i = i + 1: j = j - 1
End If
Loop Until (i > j)
If (LBnd < j) Then PRDX_SortRecur_WithInd aV, aI, LBnd, j
If (i < UBnd) Then PRDX_SortRecur_WithInd aV, aI, i, UBnd
End Sub
'==================================================================================================
Function PRDX_Sort_Arr2D_ByIndexes(a2D, aInd() As Long) As Variant()
Dim aNew(), i&, rNew&, c&
ReDim aNew(UBound(a2D, 1), UBound(a2D, 2))
For i = LBound(aInd) To UBound(aInd)
rNew = rNew + 1
For c = 1 To UBound(a2D, 2)
aNew(rNew, c) = a2D(aInd(i), c)
Next c
Next i
PRDX_Sort_Arr2D_ByIndexes = aNew
End Function
'==================================================================================================
Function PRDX_Sort_Arr2D(a2D, Optional ByVal nCol& = 1) As Variant()
Dim x, aVal(), aInd&(), r&, c&
ReDim aVal(UBound(a2D, 1)): ReDim aInd(UBound(aVal))
For r = 1 To UBound(aInd)
aInd(r) = r: aVal(r) = a2D(r, nCol)
Next r
PRDX_SortRecur_WithInd aVal, aInd, 1, UBound(aInd)
PRDX_Sort_Arr2D = PRDX_Sort_Arr2D_ByIndexes(a2D, aInd)
End Function
'==================================================================================================
'==================================================================================================
'==================================================================================================
Private Sub TestSelection()
Dim rng As Range
Dim x
Set rng = Selection: If (rng.Areas.Count <> 1) Then Exit Sub
x = rng.Value: If Not IsArray(x) Then Exit Sub
rng.Value = PRDX_Sort_Arr2D(x, 1)
End Sub
'==================================================================================================
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Evgenyy: Интересно мнение форумчан: сайт умрёт или нет? Ничего нового, интересного не публикуется, ни какого развития не наблюдается.
Мне кажется, что тема не та. Эта — о другом, всё-таки. Новое публикуется (Приёмы тут и новые функции у Excel). Развитие ЧЕГО вы хотите наблюдать? У Excel оно происходит, у форума — не особо (только хуже с каждым обновлением), но какое вообще может быть развитие у форума — не представляю…
Цитата
Evgenyy: За прошедший год, как на сайте, так и на форуме не приобрел для себя новых знаний. Ничего нового, интересного, каких то фишек, лайфхаков. Может Excel исчерпал себя?
ну тут прям классика — если вы ничему не научились, то это только ваша проблема/задача/забота. При чём тут вообще программа? VBA хрен знает сколько не развивается, а я продолжаю что-то новое для себя открывать. К тому же, может, вы просто "взяли всё, что нужно" и больше вам не надо — соответственно, вы и не замечаете этого. Ну и, конечно, эффект плато.
Цитата
seggi: Прямо удивительно, почему вдруг народ перестал Excel интересоваться, за последние два года ведь ничего не изменилось.
ну, во первых, не перестал и даже не стал меньше, по моим наблюдениям. Напомню, что это мелкомягкие "кинули" пользователей, а не наоборот. В связи с этим, были предприняты попытки от такой токсичной зависимости — мне тут всё понятно. К тому же, запрет на использование офиса распространяется только на какие-то там ключевые области, а не на всё. Остальное — самоцензура. Думаю, немало маленьких и средних компаний вполне могут остаться на коробочной версии без каких-либо проблем для себя.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Как определить, отключён ли Application.StatusBar (штатное состояние) или в нём написано "FALSE", How to distinguish between «Application.StatusBar = False» and «Application.StatusBar = "False"»
Выяснилось, что иногда StatusBar может возвращать булево значение (в строке) по локали. Теперь так делаю.
Код
Function PRDX_StatusBar_IsBusy_ByStrVal(ByVal ASB$) As Boolean
ASB = LCase$(ASB)
If ((ASB = "false") Or (ASB = "ложь")) Then Exit Function
PRDX_StatusBar_IsBusy_ByStrVal = True
End Function
'--------------------------------------------------------------------------------------------------
Function PRDX_StatusBar_IsBusy() As Boolean
PRDX_StatusBar_IsBusy = PRDX_StatusBar_IsBusy_ByStrVal(Application.StatusBar)
End Function
'--------------------------------------------------------------------------------------------------
Sub PRDX_StatusBar_Set(ASB$)
If PRDX_StatusBar_IsBusy_ByStrVal(ASB) Then Application.StatusBar = ASB Else Application.StatusBar = False
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Kelbrock, здравствуйте. Для работы в ЛЮБОМ Excel можно сделать свою надстройку с формой поиска. На коммерческой основе могу сделать. Также, можете поискать темы (в том числе и у меня) по запросу "форма с поиском" — если хотите сделать сами.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
БМВ: Если нужно скорость поднять, то усложняй код, зато будет быстрее, а может и не будет.
в плане ветвления — будет. Я ставлю самые частые условия на первые места проверки и использую бинарное ветвление для самых сложных случаев.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Dimafpk, спасибо за положительный отзыв! Качество решения напрямую зависит от понимания задачи обеими сторонами. Вы предоставили исчерпывающий пример и получили недорогое и качественное решение для своей задачи
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
при первом True всё выражение в скобках должно вернуть True СРАЗУ же. Вообще изи …
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
БМВ: так как выражения могут быть разные , включая NOT(условие1 OR условие2) и более сложные , то разбирать и оптимизировать фантазию прогера компилятор не должен.
при ВЫПОЛНЕНИИ 1го условия, уже неважно, что после OR, потому что оно 1е выполнено. Не думаю, что это невозможно описать алгоритмом. Функция Iif() тоже вычисляет ОБА исхода и хрен пойми, зачем она это делает …
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Nat3577, здравствуйте Потому что они иначе написаны — не все символы совпадают. Детали смотрите сами. Можете скопировать с Лист2 на Лист3 то, что не нашлось и оно найдётся.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Alex_ST: Вы серьёзно считаете, что предлагаемые Вами всем давно известные "телодвижения" сделать проще, чем выделить нужный "искалеченный" при экспорте диапазон и нажать одну кнопку вызова макроса?
1. "всем давно известные" — в корне ошибочное заявление. Форумов бы не было будь оно так. 2. "проще, чем выделить … диапазон и нажать одну кнопку вызова макроса". По сути, мой вариант это 2 нажатия кнопки + ввод одного символа разделителя. Не сильно сложнее, если кнопка с макросом уже есть, а, учитывая сколько всего нужно пользователю сделать, чтобы "макрос" у него "появился" (особенно, с кнопкой), то гораздо проще. 3. В вашем коде есть несколько нюансов: он вывалится в ошибку на большом количестве областей (только видимые из отфильтрованного диапазона, например) + вы принудительно в конце выставляете автопересчёт, хотя у пользователя может стоять ручной.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
sokol92: Кстати, в LibreOffice много языков программирования (Basic, Python, Java, ...)
я, собственно, только его вижу в качестве возможного аналога для перехода
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
testuser: указанием в каждом случае метода item, наверное это будет грязно
я в словарях тоже .Item не использую. Но это не те сокращения, о которых речь. Range().(1) — это нормальное сокращение от Range().Item(1), однако сейчас для меня прямое указание Range().Areas(1).Cells(1,1) более предпочтительно. У словарей всё проще — получить значение по ключу можно только через v=dic(Key) или v = dic.Item(Key) и тут уже грех не сократить, т.к. других методов просто нет при той же записи.
Ещё простой пример с диапазоном (как объекте с наибольшим, пожалуй, количеством методов): Dim x: x = Range() (массив или значение) и Set x = Range() (строго диапазон). Легко ошибиться. А вот так: Set x = Range().Value уже получим ошибку, что гораздо лучше, чем получить диапазон вместо массива или наоборот.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
MadNike, или ещё проще — выделить "даты" и заменить в них («Найти и Заменить») разделитель на такой же. Операция замены принудительно "фиксит" данные (что иногда не нужно и вредно, но тут — то, что нужно).
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
БМВ написал: ну с точки зрения чистоплотности нужно сбросить, но с точки зрения вреда - если в головной процедуре нет обработчика ошибок, то совсем ничего не произойдет
чтобы не думать и не запоминать, есть ли в родительской процедуре (прародительской и так далее по всей цепочке) обработчик, а, также, с точки зрения корректной логики (или "чистоплотности", если угодно) — нужно "прибираться" за собой. Это гораздо проще (чем держать в голове обработчики всей цепочки) и правильнее. А, что, если в цепочке ПОЯВИТСЯ обработчик которого не было? Вспомнит ли разработчик, что у него номер ошибки гуляет неприкаянный? Очень вряд ли … И нескоро найдёт, откуда ноги действительно растут. В худшем случае, вообще будет "лечить здоровое".
Кстати говоря, инициирование обработчика, его сброс и сброс ошибки — очень быстрые операции. В цикле, конечно, я, всё равно, стараюсь не использовать и выносить за пределы цикла, но, вообще — шустрые.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
полностью согласен. Сократите минимум, а ошибок можете потом собрать — максимум. Это ещё, если повезёт заметить ошибки … Если, на раннем этапе программирования я очень любил сокращения, то сейчас даже проверку на длину строки пишу If (Len(a) <> 0) Then вместо If Len(a) Then, как ранее. То же самое с If (InStr () <> 0) Then и If (Err.Number <> 0) Then. Не говоря уже про For Each cl In rng.Cells, rng.Areas(n).Cells(r, c) вместо rng( r ) или rng.Item( r ) и так далее. И да — я обычно заключаю в скобки условие, которое должно вернуть булево (за редкими исключениями) — так становится ещё понятнее и "правильнее". В общем, ваши мысли в коде должны быть прозрачны и однозначны, по возможности, а всякие сокращения просто вносят хаос на ровном месте, не давая ничего взамен.
Несколько раз сокращения уже подводили меня. Уже не припомню, какие и в чём … Теперь доверяю из значений по умолчанию — только значениям переменных. Но и с ними есть нюансы — например объекты, массивы и опциональные параметры.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
AndrB, если, всё же, решитесь на макросы, то готов заняться. Они помогут сделать процессы быстрыми.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
andypetr: Эх, видно, не узнать мне ответа на мой глупый вопрос - а что мешает на кнопку повесить пересчёт листа, чтобы одна или группа СЛУЧМЕЖДУ() выдавали новые значения?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄