Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Количество заказов у клиента, если один из заказов - определенный товар
 
Д.день.

Задача: подсчет количества заказов клиента, если один из заказов определенного наименования.
Пример: интересуют заказы "бусы".
Ваня купил часы и телефон - 2 заказа без бус которые нас не интересуют - Ваня нас не интересует
Маша купила часы и бусы - один из заказов бусы - Маша нас интересует  - у Маши 2 заказа.

Текущее решение: ЕСЛИ(СЧЕТЕСЛИМН(диапазон;имя;диапазон;товар)>0;СЧЕТЕСЛИ(диапазон;имя);0)

Проблема: на больших объемах данных пользователь наблюдает за  прогрессом вычислений в трее ;)

Нужна скорость.
Есть ли альтернативный вариант более "быстрый" в вычислениях?
Макрос копирования по именам диапазонов работает некорректно, если в умной таблице 1 строка в области данных
 
Д.день.
Код
Sub Greate_ZTK_умные()
Application.ScreenUpdating = False
'нарезаем с базы столбцы
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Name = "ЗТК"
    Range("база[Країна відправлення]").SpecialCells(xlCellTypeVisible).Copy
    Range("B1").PasteSpecial Paste:=xlPasteValues
    Range("база[Номер міжнародного домашнього документу], база[[Кількість місць]:[Вага]]").SpecialCells(xlCellTypeVisible).Copy
    Range("C1").PasteSpecial Paste:=xlPasteValues
    Range("база[Відправник], база[Отримувач]").SpecialCells(xlCellTypeVisible).Copy
    Range("F1").PasteSpecial Paste:=xlPasteValues
    Range("база[Вміст]").SpecialCells(xlCellTypeVisible).Copy
    Range("H1").PasteSpecial Paste:=xlPasteValues
    Range("база[[Вартість]:[Валюта]], база[парт]").SpecialCells(xlCellTypeVisible).Copy
    Range("I1").PasteSpecial Paste:=xlPasteValues
'нумерация и выделение
Dim I As Long
    I = Cells.SpecialCells(xlCellTypeLastCell).Row
With Range("A1:A" & I)
    .Formula = "=Row()"
    .Value = .Value
End With
    Range("A1:K" & I).Select
    Selection.Copy
End Sub

Проблема следующая:
1. Если в умной таблице "база" листа "база" больше 1 (2 и более) строк данных - макрос отрабатывает корректно (формируется лист ЗТК, в который переносятся нужные диапазоны в нужной последовательности.
2. Если в умной таблице всего 1 строка данных - макрос как будто не видит диапазоны данных умной таблицы... цепляет ее заголовки... творит дичь короче.

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

PS: в простом варианте - проблема уходит если код без .SpecialCells(xlCellTypeVisible), но этот режим нужен в полноценных файлах (без него ловлю иногда глюки, когда копирование происходит всего диапазона, без учета активных фильтров)
Какая причина долгих расчетов без предварительного сохранения или открытия параметров экселя, почему скорость расчетов зависит от просмотра параметров экселя
 
Д.день.

В файле используется формульный расчет по выбору пользователя (реализовано через макроф. ВЫЧИСЛИТЬ подставляется одна из нужных формул со списка)
Часть формул используют пользовательские (UDF) функции, часть "обычные"

В файл (умная таблица) вставляется большой массив данных, потом пользователь выбирает что ему нужно дальше увидеть/посчитать.

Столкнулся со следующей проблемой:
- первый расчет идет крайне доооолго. При этом если отменить (эскепт) - все что нужно - все равно будет корректно расчитано.
- последующие расчеты идут условно-моментально.
При этом если после вставки с буфера, перед запустом расчетов файл сохранить, или зайти в параметры экселя - все происходит моментально.

Даю ссылку на видео, на котором заснял 2 ситуации показаны:
1. открываю файл, вставляю в него данные, выбираю нужный расчет - и процесс выполнения после 30 с чем-то процентов уже особо не идет... Отменяю по эскейпту. Потом закрываю.
2 . открываю тот же файл заново. Вставляю данные. Просто открываю-закрываю параметры экселя, выбираю нужный расчет - все считается условно моментально.
(вместо открытия параметров - можно сохранить файл, потом также расчет пройдет шустро, но если сохранение можно натянуть на теорию, то при чем тут открытие окна параметров?)

Все это относится к первому использованию формул содержащих UDF. Можно выбирать расчеты использующие "обычные" формулы, все будет быстро, а на первом выборе затрагивающем UDF будут тормоза.
Любые последующие расчеты (второй, третий, сорок восьмой) будут быстрыми.

Протестировано на 2 рахных компах, т.е. не проблема рабочего места.

Видео https://youtu.be/xQRHHL3zOyU в спойлере
Скрытый текст


PS: Я не могу приложить полноценные примеры, на которых форумчане смогут "покрутить" проблему; т.к. объем вставляемых данных должен быть большой (уменьшение до размера запаковки под требование форума - не покажет проблему), + в исходниках персоналка... обрезать которую = уменьшить размер = невозможность показать проблему...
Прикрепляю только "чистый" файл с десятком строчек почищенных от персоналки, чтоб можно было просто увидеть структуру что откуда и как, вдруг косяки гдето в нем уже... но связи с октрытием окна параметров вот не могу придумать.
Изменено: andylu - 19.10.2021 20:04:52
Найти текст со смешанным регистром, определить последовательности когда после строчной идет заглавная
 
Д.день.

Как найти/идентифицировать наборы символов в ячейке по условию что есть заглавные буквы после строчных.
Максимум на что меня хватило - определять по кодам ASCII есть ли вообще в ячейке строчные, или заглавные
(массивом к примеру для заглавных латиницы.)
Код
=СЧЁТ(НАЙТИ(СИМВОЛ(СТРОКА(65:90));A2))>0 
диапазоны по ASCII
65-90Заглавная латиница
97-122Строчная латиница
192-223Заглавная кирилица
224-255Строчная кирилица
Но как найти "слова" в которых есть последовательность строчная и за ней сразу заглавная?
Ааа = ЛОЖЬ
ааАа = ИСТИНА, после второй строчной идет заглавная
Ааа Ааа - ЛОЖЬ, т.к. хоть и есть вторая заглавная не с начала текста, но перед ней не строчная
Изменено: andylu - 05.10.2021 11:53:56 (еще и с диапазонами ASCII изначально накосячил в тексте и примере)
VBA: Как просчитать время на пользовательские действия
 
Д.день.

Как вывести затраченное время в MsgBox (или залогировать время на все операции пока макрос не будет остановлен... не критично) на пользовательские действия, на пример:
- заполнение (вставка) из буфера больших диапазонов
- протяжка формул (время просчета)
Имеется в виду не вставка буфера средствами VBA, а именно пользовательское ктрл+v; время на просчет формул после клика по правому крестику.

PS: формальный пример: сколько времени будет затрачено экселем на пробить формулу из B3 до конца диапазона (20 тысяч строк)
Нужен аналог Proper (ПРОПНАЧ), не реагирующий на спецсимволы, спецсимволы в тексте не должны учитываться как разделители
 
Д.день.
Проблема приведения текста к виду "все слова с заглавных".
Отдельными "словами" (и для формульного решения =ПРОПНАЧ(), и в VBA типа Application.Proper() ) будут в т.ч. наборы букв после спецсимволов.
Т.е. при оригинальном тексте ар'я старк,
получим Ар'Я Старк
а нужно Ар'я Старк

Как обойти спецсимволы, чтоб  не считались разделителями?
Возможно есть какие аналоги функций, или заменяющие алгоритмы?

Предпочтительней решение VBA.
Текущий код:
Код
Sub FirstUpper()

iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
 For Counter = 2 To iLastRow
 Set curCell = Cells(Counter, 1)
 curCell.Activate
 If Len(curCell) Then
 ActiveCell.Offset(0, 2) = Application.Proper(ActiveCell)
 End If
 Next Counter

End Sub
Как обновлять данные из Диспетчера имен, связка Диспетчера имен с ИНДЕКС и ДВССЫЛ
 
Навеяно соседней темой (пример чуть упростил):
Хочу для себя понять где затык и как решается
(вдруг когда пригодится)

Суть в файле:
- на листе ОБЩАЯ в столбце A имя листа определяется через диспетчер имен.
- рядом ДВССЫЛ формирует ссылку из столбца A + нужная ячейка соответствующего листа.

Проблемы:
1. При переименовании листов имена которых получаем - данные в столбце A не обновляются (естественно пересчет включен, и Ф9 не помгает). Только новая протяжка формулы или Ф2-Энтер. В т.ч. не пересчитывается при открытии.
2. При переименовании листов в имена типа название-1 (т.е. имя листа включает дефис или другую "математику") - ДВССЫЛ уже не работает вообще.

Как решить первую проблему без отслеживания изменений через VBA?
Как обойти вторую проблему?

(приложенный файл сохранен с корректными первыми двумя строками листа ОБЩАЯ, и переименованными листами СОК>СОК2 и МОСТ>МОСТ-2 для визуализации описанных проблем первой и второй соответственно)
Изменено: andylu - 30.06.2021 12:12:15
Обновление QueryTables: ошибки при отсутствии сети и таймаут ожидания
 
Д.день.

Простейшая запись в коде вида:
Код
    Sheets("pars").QueryTables(1).Refresh BackgroundQuery:=False

Проблема:
1. При отсутствии сети на ПК (кабель выдернут, роутер без питания, вайфай не законекчен, ...) - runtime error и вываливает в редактор.
2. При наличии сети но нет интернета / нет связи с источником QueryTables - нет таймаута ожидания.

Как в работе избавиться от ошибки п.1 (т.е. без уведомления на end / debug) и ограничить п.2 скажем в 5 секунд; с выводом для любой из двух ситуаций простого единого MsgBox для пользователя?
Изменено: andylu - 21.06.2021 13:19:10
Удаление одинаковых последовательных символов из ячеек с текстом
 
Д.день.

Ищу решение как "чистить" текст от последовательно повторяющихся символов.
Т.е. к примеру "Иииввваановва Катериииинннааа" - должен стать "Иванова Катерина"

Решения которые удавалось нагуглить - удаляли все дубликаты, а не последовательные, т.е. на выходе получал "Ивано Ктер"
VBA: Настройка двухсторонней печати?, без учета локальных настроек по умолчанию принтера и/или печатаемого документа
 
Возможно ли реализовать двухстороннюю печать из экселя, независимо от дефолтных настроек принтера?

Т.е. при стандартном диалоговом окне печати по Ctrl+P, для любой книги - чтоб сразу предлагалась двухстороння печать, независимо от настроек принтера по умолчанию?
Результаты расчета в Application.StatusBar
 
Добрый день.
В макросе формула считает ВПР+склейки текста, и должна вывести результат в статусбар.
Сейчас:
-Sub work() работает, при условии что результат расчета вписывается на ячейку в листе, а уже значение ячейки выводится в статусбар.
-при этом какие-то простые расчеты (Sub primitiv()) вполне отрабатывают сразу вывод в статусбар.
-Sub not_work(), минующий вывод расчета в ячейку, вставляет в статус бар не результат расчета, а формулу расчета в виде текста.

Хочу избавиться от промежуточного вывода результата расчета в ячейке.

PS: Sub remove_statusbar() просто для обнуления результатов в процессе тестов.
PS2: для меня работа с VBA пока что работа методом тыка, а не осознанные алгоритмы... Подразумеваю что проблема на поверхности, но методом тыка не осилил.

[img]https://ibb.co/74dz7Vq[/img]
Получить из текста почтовый индекс
 
Доброго.

Ищу формульное решение.
Подозреваю что решение какое-то простое, и я туплю, но:

Есть массив строк (тысячи, с добавлением/удалением, т.е. ручной вариант "глазами" или ctrl+F не вариант"
Это адреса, содержание почтовый индекс. Текстовые значения могут повторяться как целиком в строках, так и естественно просто одинаковые индексы разных адресов.
Перед почтовым индексом запятая и после него, т.е. его формат ,#####, расположен не в начале строки, иногда их может быть несколько (типа "Киев,#####,#####,улица"; или "Украина,#####,Киев,#####,улица)

Как получить значение почтового индекса формулой?
(при нескольких ,#####, в строке - вернуть первый; или если будет возвращаться ошибка не критично, это разовые случаи дубляжа, на которые не критично)
Макрос замены, не учитывать регистр
 
Добрый день.
Макрос замены, "переводчик", поиск по тексту ячеек и подстановка значений из списка.

Нужна помощь, чтоб НЕ учитывался регистр исходного текста
Код
Sub Zamena()
Dim lLastRowA As Long, lLastRowB As Long, TekRowA As Long, TekRowB As Long, NT As String, NT1 As String
lLastRowA = Cells(Rows.Count, "A").End(xlUp).Row
lLastRowB = Cells(Rows.Count, "B").End(xlUp).Row
For TekRowA = 2 To lLastRowA
NT = WorksheetFunction.Substitute(Cells(TekRowA, 1), Cells(2, 2), Cells(2, 3))
If lLastRowB > 2 Then
For TekRowB = 3 To lLastRowB
NT = WorksheetFunction.Substitute(NT, Cells(TekRowB, 2), Cells(TekRowB, 3))
Next TekRowB
End If
Cells(TekRowA, 4) = NT
Next TekRowA
End Sub
InputBox с отображением количества строк в таблице
 
Добрый день.
Задача - здоровые массивы рубать на более мелкие части.
Количество строк в исходной каждый раз разное.
Количество срок в "нарезке" задается оператором.
Нарезанные куски сейвятся в ту же папку.

Существующий макрос:
Код
Sub cut_big_UTD()
 
  ActiveCell.Value = Application.InputBox("размер части")
  Dim Limit As Integer, Count As Integer, SaveDir As String
  
  Count = 1: Limit = ActiveCell.Value
  SaveDir = ActiveWorkbook.FullName
  While Not IsEmpty(Cells(1, 1))
    Rows("1:" & Limit).Cut
    Workbooks.Add xlWBATWorksheet
    ActiveSheet.Paste: Cells(1, 1).Select
    ActiveWorkbook.SaveAs Filename:=SaveDir & "" & Count & ".xls", _
      FileFormat:=xlExcel8
    ActiveWindow.Close
    Rows("1:" & Limit).Delete Shift:=xlUp
    Count = Count + 1
  Wend
  MsgBox "сформированно " & Count - 1 & " частей. "
  ActiveWindow.Close False
End Sub

Проблема: в зависимости от количества строк в исходной таблице  в ней оператором выбирается разное количество строк в частях.
Вопрос: как вывести в тексте InputBox количество строк (в существующем макросе сейчас "размер части". А хотелось бы что-то типа "в таблице (счетчик) строк"
Чет не смог побороть...

PS: ну и если оператор отменяет ввод данных в InputBox (кнопкой отмена) - выкидывает в отладку, вместо отмены выполнения макроса... Но это мелочи.
PS2: не пинать сильно) только учусь)
Протяжка формул макросом
 
Добрый день.

Как через макросы прописать протяжку формул, если количество строк не известно, и слева данных нет.
При не-первом столбце все просто, типа
Код
Range("X2:X" & Cells(Rows.Count, 1).End(xlUp).Row).Formula = [BX].FormulaR1C1

А как выписать на первый столбец?? что-то не дойду никак...

Пример во вложении... Спс заранее.
Страницы: 1
Наверх