Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 След.
Подсчёт значений с нулями и пробелами, лидирующие нули и пробелы: логика работы функции
 
Формула не различает заглавные и прописные буквы, но это нормально: так и надо было изначально.
Спасибо!

ЗЫ. Теперь придётся во всех файлах выцарапывать этот СЧЁТЕСЛИ.
Подсчёт значений с нулями и пробелами, лидирующие нули и пробелы: логика работы функции
 
Функция СЧЁТЕСЛИ считает номера с лидирующими нулями и пробелами одинаковыми. См. вложение. Ячейки отформатированы как текст.
Получается, что номера 1, _1, __001, 00001 и т.п. функция считает одинаковыми (тут _ - пробел). Как подсчитать их, считая разными? Пока только приходит в голову макрос, но не всегда макрос можно втолкнуть в документ для передачи его другим лицам.
Ещё странность в том, что если пробел после нуля, то для СЧЁТЕСЛИ это уже разные данные.

Проблема немного затронута в Как при подсчете отличать двойные нули от обычных нулей, но там немного про другое и решение дано только для конкретного случая.
ListView. Отследить смену выбранной строки, Как у ListView получить событие: изменение выделения
 
Нужно у ListView отследить событие - смену выделенной строки. Пока реализовано через события Enter, Click и KeyDown (KeyUp). Но иногда данные на ListView обновляются программно и выделение нужной строки тоже делается программно и вышеуказанные события не срабатывают.
У ListView есть события BeforeUpdate и AfterUpdate, но они не работают. Как заставить их заработать? Также не срабатывают AfterLabelEdit и BeforeLabelEdit.
Возможно, у кого-то есть ещё способ решить проблему.
Вместо выделение одной ячейки выделяется несколько
 
Возможно, поможет лайфхак из 90-х прошлого века: сменить драйвер мыши. Ну или саму мышь.
Упрощение формулы массива поиска предыдущей даты продажи
 
Возможно, что-то не так понял, но если таблицу можно отсортировать хотя бы по VIN и дате, то зачем искать нужную дату по всем 500 тыс.строк? Проще брать нужные даты из предыдущей строки.
Сводная таблица: не хватает ресурсов при формировании макросом, А если сводную делать вручную, то всё ОК
 
Возможно, частичная проблема и в Excel 32bit. Хотя так и непонятно, почему руками разрешает сделать сводную, а макросом - нет.
Также столкнулся с тем, что книга с 300 тыс строк и 40 столбцов не сохраняется по той же причине: нехватка ресурсов. Хотя сервер с 32ГБ оперативки, прочие окна закрыты, подключённых других пользователей почти нет.
Вообще, интересно: зачем нужны 1 млн строк и 16 тыс столбцов, если Excel глючит на многократно меньших объёмах.
Ладно, спасибо. Будем пробовать пинать админа в сторону движения на 64bit.
Сводная таблица: не хватает ресурсов при формировании макросом, А если сводную делать вручную, то всё ОК
 
Лист с примерно 60 тыс строк, 40 столбцов. Сводная таблица вручную формируется нормально, даже без тормозов - летает. Но если действия записать макрорекордером и потом попробовать выполнить макрос, то выскакивает ошибка нехватки ресурсов Excel.
Может, есть у кого-то код VBA для формирования сводной таблицы, чтоб работал нормально.

Windows Server R2 64bit, Excel 2010 32bit
Изменение файла xml макросом, Поменять некоторые данные в xml-файле
 
По ходу дела вопросов не уменьшается.
Например, как получить данные просто между тэгами, типа значение СумНал в примере файла xml.
А уж про изменение нужных значений, думаю, вообще мрак будет.
Есть ещё тут темы по изменению xml, например Экспорт из Эксель в XML, Редактирование XML с помощью Экселя. Там тоже главная мысль, что xml- штука каждый раз индивидуальная и не решаемая.
В общем, я так понял, что сам файл xml изменить нельзя,  можно на его основе создать новый. Так? Если так, то конкретно описанная изначально проблема проще, по-моему, решается через операции ввода/вывода для работы с текстовым файлом.
Пока сделал так... Хотя код от doober тоже пригодился в другом месте, спасибо.

ЗЫ. Потратил кучу времени на этот xml, но ясности не прибавилось. Можно позавидовать некоторым, кому надо было пару часов, чтоб разобраться с этой хитромудрой глючной штуковиной - xml.
Ладно, будем дальше разбираться, но только по необходимости и без фанатизма.
Изменение файла xml макросом, Поменять некоторые данные в xml-файле
 
На строке 8
Код
ПрТовРаб = objListOfNodes(i).Attributes.getNamedItem("ПрТовРаб")
выскакивает Ошибка Run-time error '438' - Object doesn't support this property or method.

На форуме есть такая же тема Ошибка Run-time error '438' - Object doesn't support this property or method, но не помогает.

Может, в References надо галку где-то в нужном месте поставить?


Excel 2010 (32bit) на Windows Server 2008R2 (64)

Подсчет количества строк и суммы для комбинаций характеристик.
 
Можно формулами.
В ячейку R2:
Код
=СЧЁТЕСЛИМН(Таблица1[name];ЕСЛИ($L2="null";"*";$L2);Таблица1[price];ЕСЛИ($M2="null";"<1E300";$M2);Таблица1[Фасовка];ЕСЛИ($N2="null";"<1E300";$N2);Таблица1[характ1];ЕСЛИ($O2="null";"*";$O2);Таблица1[характ2];ЕСЛИ($P2="null";"<1E300";$P2);Таблица1[характ3];ЕСЛИ($Q2="null";"<1E300";$Q2))

В ячейку S2:
Код
=СУММЕСЛИМН(Таблица1[Сумма];Таблица1[name];ЕСЛИ($L2="null";"*";$L2);Таблица1[price];ЕСЛИ($M2="null";"<1E300";$M2);Таблица1[Фасовка];ЕСЛИ($N2="null";"<1E300";$N2);Таблица1[характ1];ЕСЛИ($O2="null";"*";$O2);Таблица1[характ2];ЕСЛИ($P2="null";"<1E300";$P2);Таблица1[характ3];ЕСЛИ($Q2="null";"<1E300";$Q2))

А где в Excel используется let?
Изменение файла xml макросом, Поменять некоторые данные в xml-файле
 
Нужно в файле xml поменять некоторые данные. Либо в самом файле, либо создать новый.
Данные меняются по следующему правилу: количество в штуках надо изменить на кг, литры и другие. Норма каждого товара своя (есть справочник), поэтому надо вытянуть из xml данные КодТов и КолТов, пересчитать количество (норма у каждого товара своя, например, умножить на 5, 10 или 20) и записать в xml новое количество, а также поменять ОКЕИ_Тов на нужный и ЦенаТов на расчётную.
По форуму поискал, но так не смог найти рабочий вариант кода хотя бы получения данных из xml. Везде свои форматы xml и подогнать код под свои нужды не получилось.
Загрузить в Excel можно, но там КодТов получается без нулей и искать такой код потом в справочнике плохо.
Посоветуйте, как лучше сделать и в какую сторону копать?

ЗЫ. Почему-то файл xml размером 5 КБ этот форум принял как более 100 КБ. Поэтому rar.
Выпадающий список (проверка данных) - создать макросом, В списке имеются запятые и точки с запятой
 
Точно! Запятые не принципиальны.
Михаил Витальевич, спасибо!
И почему я сам до этого не догадался? Старею...
Выпадающий список (проверка данных) - создать макросом, В списке имеются запятые и точки с запятой
 
Длина строки точно не будет такой, чтоб вызвать проблему.
Теоретически макрос может быть использован на eng-Excel или других региональных настройках, но сейчас возможное различие может только в десятичном разделителе: точка или запятая.
Пробовал прикрутить список в виде имени (именованной формулы), но тут тоже ждал облом.
А если запихать список в укромное место листа, то его потом никак нельзя будет удалить, но чтобы выпадающий список остался?
Выпадающий список (проверка данных) - создать макросом, В списке имеются запятые и точки с запятой
 
Выпадающий список: создан Проверка данных - Список. Список вносится в виде: Красное,розовое;Синее,голубое;Зелёное;Белое,чёрное,серое. И в ячейке получается нормальный список:
     Красное,розовое
     Синее,голубое
     Зелёное
     Белое,чёрное,серое
Макрорекордер записывает список в виде "Красное,розовое;Синее,голубое;Зелёное;Белое,чёрное,серое". При запуске макроса выпадающий список в ячейке получается корявым в виде
     Красное
     розовое;Синее
     голубое;Зелёное;Белое
     чёрное
     серое
Т.е. суть запятой и точки с запятой меняются местами.

Как макросом внести нормальный список с запятыми в значениях?
Можно в укромное место на лист, а потом сделать ссылку, но нужен список без задействования листа.  
VBA. Объявление большого числа переменных с одинаковым типом, Укоротить строки с объявлением однотипных переменных
 
С DefByte всё нормально получается.
А массив a(0 to 99) в моём случае особо смысла не имеет. Дело в том, что номера столбцов не просто переменные a00, a01 и т.д., как изначально я указал, а вполне осмысленные: cDateOtgruz, cDateOplaty, cNumDoc, cNumTTN, cPartnerName, cPartnerCode, cSummaDoc и так несколько десятков переменных. И удобнее пользоваться ими: cBruttoV визуально гораздо более информативная переменная, чем a(46).
Конструкцию типа Const cPriceOpt3 = 38 использовать пытался, но удобнее использовать Dim, как оказалось. Инициализация переменных идёт в виде
Код
i=0
cDateOtgruz = i: i = i + 1
cDateOplaty = i: i = i + 1
'.........
cPriceOpt3 = i: i = i + 1
'.........
cLastCol = i: i = i + 1
При необходимости их можно просто менять местами, не заботясь о конкретном значении переменной. С Const cPriceOpt3 = i такая фишка не проходит.
Изменено: tolikt - 1 авг 2020 16:23:57
Разнесение оплат по накладным с помощью макроса, Разнесение оплат по накладным с помощью макроса
 
Основная проблема - структура исходных данных. И, как следствие, структура конечных данных. А попросту говоря - нет ни там, ни там никакой здравой структуры. И поэтому макрос тут не поможет. В крайнем случае, будет работать конкретно на этих данных, а при на других данных или просто дополнении текущих данных результат может быть непредсказуем.

Когда-то давно делал подобное только формулами без макроса. За основу брал Ведомость операции по аналитическому счёту (есть такое в бухгалтерии). Основные данные (отгрузки/оплаты) там в одной таблице, суммы дт (дебет) и кт (кредит) расположены в разных столбах и отсортированы по дате. Для предложенного случая нескольких клиентов надо сначала отсортировать по ID партнёра (шифр, или ИНН), чтобы данные по одному клиенту шли подряд и потом по дате. Ну и добавить всякие хотелки типа Канал, отсрочка и др.

В файле подогнанный под начальные условия результат.
- Признак оплаты "не брать" - в столбце Содержание (или Договор для отгрузок). Можно переделать на корр.счёт =13. В ячейке V1 - сам признак.
- В N1 и O1 - даты периода ведомости. Нужны для корректной работы формулы просрочки.
- В таблице есть Условное форматирование для подсветки последней строки по каждому партнёру. Для больших объёмов данных эту УФ лучше удалить.
- Добавлены данные клиента 555555 для вариантов: сначала оплата; оплаты больше отгрузок, но одна из них - не брать.
Добавлены столбцы:
- Сальдо текущее - сальдо на дату по строке. Тут не учитывается "не брать".
- Начало оплаты и Полная оплата - даты: соответственно дата начала оплаты и полной оплаты каждой отгрузки. Неопл - отгрузка не оплачена.
- Просрочка (дней) с учётом дней в столбце Отстрочка.
- Оплачено и Неоплачено - суммы: тут понятно.
- В скрытых столбцах R-Z - вспомогательные формулы.

Кое-какие данные и условия в формулах могут быть лишние. Но это осталось от предыдущих моих вариантов. Сами формулы, возможно, не совсем оптимизированы, но работают шустро.
В общем, главное - структурирование начальных данных. Вручную приведение исходных данных в таблицу типа Ведомость заняло пару минут. Думаю, даже просто для структурирования макрос не нужен.


Свой вариант я делал давно ещё до знакомство с planetaexcel. Другие варианты реализации подобной темы можно найти на этом же сайте в поиске. В основном ФИФО применительно к товарам: даты прихода/расхода. Есть и по оплатам. Например, возможно, более удобным будет вариант в теме Списание ФИФО без VBA. Но там тоже соблюдается главный принцип: данные в одной таблице и строго структурированы.
VBA. Объявление большого числа переменных с одинаковым типом, Укоротить строки с объявлением однотипных переменных
 
Цитата
БМВ написал:
так, то есть потом этой перемeнной присваивается константа?
Да, почти всегда. Возможно, Const вместо Dim правильнее.

Цитата
vikttur написал:
возможно, получите более правильное решение (или подсказку к решению), если создадите тему по задаче.
Спасибо, но не думаю, что задача заслуживает отдельной темы. Просто хотел прояснить этот нюанс. Ну и в некоторых случаях, при переменном количестве столбцов, уже использую массив констант, как указал buchlotnik в #2.
VBA. Объявление большого числа переменных с одинаковым типом, Укоротить строки с объявлением однотипных переменных
 
Спасибо. Примерно то, что надо, это DefByte. Попробую прикрутить его.
На самом деле, конечно, многократное объявление As Byte вовсе не критично, можно и покопировать. Я просто думал, что есть какой-то простой способ всё сделать разом.
Необходимость таких многочисленных переменных возникает из-за отчётов со многими (но меньше 256) столбцами на листе. В процессе отладки макроса, точнее, разработки формы отчёта, приходится добавлять/удалять/перемещать столбцы с данными по просьбе руководства. И переменные используются, чтоб не менять номера столбцов по всему коду, а просто менять один раз значение переменной номера столбца. Понятно, что отчёт с сотней столбцов получается громоздким и неудобным, но он используется как промежуточный для сводной таблицы и т.д. Сразу сделать сводную без общего отчёта нельзя, т.к. он тоже просматривается по необходимости.
VBA. Объявление большого числа переменных с одинаковым типом, Укоротить строки с объявлением однотипных переменных
 
Иногда приходится объявлять большое число переменных с одинаковым типом. Например:
Код
Dim a0 as Byte, a1 as Byte, a2 as Byte, a3 as Byte, a4 as Byte, a5 as Byte, a6 as Byte, a7 as Byte, a8 as Byte, a9 as Byte
Dim b0 as Byte, b1 as Byte, b2 as Byte, b3 as Byte, b4 as Byte, b5 as Byte, b6 as Byte, b7 as Byte, b8 as Byte, b9 as Byte
' ...........
Dim m0 as Byte, m1 as Byte, m2 as Byte, m3 as Byte, m4 as Byte, m5 as Byte, m6 as Byte, m7 as Byte, m8 as Byte, m9 as Byte
Интересует, можно ли объявить все эти переменные с нужным типом Byte, не вставляя после каждой из их as Byte.
Диапазон таблицы ВПР через формулу "Начиная с определенной ячейки"
 
И ещё надо проверять, чтоб стекло1 обязательно было в списке именно Камаза или искать конец списка у него. Иначе формула найдёт стекло1 у другого драндулета ниже, если у Камаза такого стекла нет.

Не совсем по теме, а общий подход.
Многолетний опыт работы с подобными списками и поисками в них говорит только одно: надо приводить таблицу в нормальный вид и в работе использовать только уникальные артикулы.
Как скопировать строковую переменную "с помощью" мастера импорта текста
 
Вариант ещё есть использовать макрос с GetFromClipboard. Разбивать данные в массив и вставлять на лист.  
Как отразить скрытые модули в VBA проекте ?
 
Делаю всё как описано, vbaProject.bin редактирую Блокнотом, но после повторного открытия файла Excel2010 выдаёт предупреждение о том, что не удалось прочитать содержимое файла и предлагает восстановить. После восстановления опять предупреждает о повреждении компонента vbaProject.bin и удалении его. И файл открывается вообще без модулей.
Что не так?
Как отразить скрытые модули в VBA проекте ?
 
Поясните подробнее, как проделать прямую и обратную процедуру скрытия/отображения модуля. У меня не получилось по описанию в ссылке.  
SQL: получить все строки таблицы с количеством значений по определённому полю
 
Увы, не помогло. Проблема в формате исходных данных, т.к. опять "Внешняя таблица не имеет предполагаемый формат".

В общем, проблему решил дополнительной обработкой Recordset:
- Получение всего списка (code - уникальные)
- Получение списка с перечнем code, у которых count(id)>1, т.е. количества разных code с одинаковым id.
- Добавление в основной список данных по количеству одинаковых id по каждому code.

Спасибо за желание помочь.
Оператор "Is" в VBA возвращает "False" для одинаковых диапазонов
 
Да уж....
А я вообще не использовал With. Более того, старательно вычищал от With используемые сторонние коды. Мне конструкции с ними кажутся неудобочитаемыми.
Теперь буду знать...
Конструкцию типа Set R=Range иногда использую, но только из-за удобочитаемости.
перенос данных на другой лист с условием
 
Если, как в примере, пустые ячейки в D именно пустые, а не содержащие пробел или строку нулевой длины, то проще просто вручную.
1. Скопировать нужную область A2:F7 на Лист2
2. Главная -> Найти и выделить -> Выделение группы ячеек -> Пустые ячейки -> ОК
3. Удаление ячеек -> удалить всю строку.

При желании всё это можно записать макрорекордером.
Если пустыми считать ячейки с пробелом, то можно вариант МатросаНаЗебре с Trim в нужном месте.
Замена русских символов, если символ между 2 латинскими
 
Тут, как в старом еврейском анекдоте, и DartoArem прав, и IKor прав.
Я же предлагаю пока пойти по простому пути. А именно, сначала отсеять слова с заведомо "исконными" рус и лат буквами, а оставшиеся проверять не словарями, а вручную. Ибо всякие слова типа МОСКВА - это из разряда ошибок, как я писал выше.
Конечно, в моём случае было проще: там был именно в основном текст с вкраплениями лат. букв, а не мудрёный прайс-лист, или что-то подобное. Т.е. я решал свою задачу и просто предлагаю использовать этот подход для частичного решения текущей.
Можно рассмотреть такой пример текста: Политика конфиденциальности. Во вложении этот текст на листе Excel и макрос подкраски слов с только "общечеловеческими" буквами, т.е. где нет ни одной "исконной" буквы. Как видно, подкрашены только цифровые слова (числа), предлоги и слово "Все". Т.е. в данном случае проблема решена на 99.9%. Если макрос доработать на пропуск чисел и однобуквенных предлогов, то проблема решена на 99.99%. Слово "Все" можно проверить без подключения доп.словарей.
Для хитромудрого прайс-листа, конечно, доля ручной работы увеличится. И конечно же, надо дописать доп.проверку сложносоставных слов через дефис, точку и т.п.: IP-камера, www.планетаэксель.рф, Красный/Red и др. Но, как я предлагал выше, чаще всего их проще проверить вручную, ибо время написания процедуры для проверки таких слов бывает обычно больше, чем время ручной проверки.
Замена русских символов, если символ между 2 латинскими
 
Когда-то давным-давно, во времена благословенного Excel 2003, решал такую же задачу. Макроса уже нет, идею примерно помню.
Решал "от обратного":
1. Есть список "исконно русских" букв: БГДЁЖЗИЙЛПУФЦЧШЩЬЫЪЭЮЯбвгдёжзиёклмнптфцчшщьыъэюя
2. Если хоть одна буква встречается в проверяемом слове, то слово считается русским и все прочие латинские буквы меняются на русские аналоги. Список тоже есть, соответствует указанному в предыдущих ответах.
3. Есть список "исконно латинских" букв: DFGIJLNRSUVYZbdfghijklmnrstuvz.
4. Если русских букв нет, но есть хотя бы одна латинская буква из списка, то слово считается "латинским", с заменой также по списку.

Возникали какие-то мелкие нюансы, типа считать ли одним словом набор букв с дефисом и т.п., с ходу их не помню, но они тоже были вполне решаемы.
Понятно, что слова типа РЬl)|(ий кom, где одновременно есть и те, и те, и левые символы, считаются ошибкой и по ним исправляется вручную. То же касалось названий с цифрами.
Изменено: tolikt - 11 дек 2019 00:33:08
SQL: получить все строки таблицы с количеством значений по определённому полю
 
Вариант, конечно же, рабочий (я так думаю, проверить не могу). Но увы, как я писал с самого начала, вложенные запросы не работают.

Использую ADODB для получения данных из dbf. Если использовать строку Microsoft dBASE Driver (*.dbf), там вложенные запросы работают, но тогда вылетает ошибка "Внешняя таблица не имеет предполагаемый формат"
В VBA выглядит примерно так:
Код
Dim oConn As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim sDSN As String, sSQL As String
'sDSN = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & DirPath & ";"
sDSN = "Driver=Microsoft FoxPro VFP Driver (*.dbf);SourceDB=" & DirPath & _
    ";SourceType=DBF;Null=Yes;Deleted=Yes;BackgroundFetch=Yes;Exclusive=Yes"
oConn.Open sDSN 
sSQL = "SELECT ....."
oRs.Open sSQL, oConn, adOpenStatic, adLockBatchOptimistic

Может, кто подскажет что-то правильное в части подключения?

SQL: получить все строки таблицы с количеством значений по определённому полю
 
Вопрос не совсем по Excel.
В VBA запросом к таблице получаю данные, потом обработка данных и на лист Excel. Хотелось бы больше обработки возложить на SQL, т.к. на листе Excel процесс сильнее тормозит, а полученный в VBA  из результата запроса массив может быть большой и вплоть до нехватки памяти.
Таблица с code и id. Значения code уникальные, id - нет. Из таблицы надо получить все строки и количество одинаковых id по каждому code.
Пока у меня получаются данные только с одним (последним) code по каждому id.
Проблема ещё в том, в для данной таблицы и провайдера не работают вложенные запросы. Но JOIN и UNION - работают, хотя и с ними не получилось.
Возможно, решение простое, но сам никак не соображу.
Пример таблицы для простоты - в Excel.
Страницы: 1 2 3 4 5 След.
Наверх