Функция СЧЁТЕСЛИ считает номера с лидирующими нулями и пробелами одинаковыми. См. вложение. Ячейки отформатированы как текст. Получается, что номера 1, _1, __001, 00001 и т.п. функция считает одинаковыми (тут _ - пробел). Как подсчитать их, считая разными? Пока только приходит в голову макрос, но не всегда макрос можно втолкнуть в документ для передачи его другим лицам. Ещё странность в том, что если пробел после нуля, то для СЧЁТЕСЛИ это уже разные данные.
Нужно у ListView отследить событие - смену выделенной строки. Пока реализовано через события Enter, Click и KeyDown (KeyUp). Но иногда данные на ListView обновляются программно и выделение нужной строки тоже делается программно и вышеуказанные события не срабатывают. У ListView есть события BeforeUpdate и AfterUpdate, но они не работают. Как заставить их заработать? Также не срабатывают AfterLabelEdit и BeforeLabelEdit. Возможно, у кого-то есть ещё способ решить проблему.
Лист с примерно 60 тыс строк, 40 столбцов. Сводная таблица вручную формируется нормально, даже без тормозов - летает. Но если действия записать макрорекордером и потом попробовать выполнить макрос, то выскакивает ошибка нехватки ресурсов Excel. Может, есть у кого-то код VBA для формирования сводной таблицы, чтоб работал нормально.
Нужно в файле xml поменять некоторые данные. Либо в самом файле, либо создать новый. Данные меняются по следующему правилу: количество в штуках надо изменить на кг, литры и другие. Норма каждого товара своя (есть справочник), поэтому надо вытянуть из xml данные КодТов и КолТов, пересчитать количество (норма у каждого товара своя, например, умножить на 5, 10 или 20) и записать в xml новое количество, а также поменять ОКЕИ_Тов на нужный и ЦенаТов на расчётную. По форуму поискал, но так не смог найти рабочий вариант кода хотя бы получения данных из xml. Везде свои форматы xml и подогнать код под свои нужды не получилось. Загрузить в Excel можно, но там КодТов получается без нулей и искать такой код потом в справочнике плохо. Посоветуйте, как лучше сделать и в какую сторону копать?
ЗЫ. Почему-то файл xml размером 5 КБ этот форум принял как более 100 КБ. Поэтому rar.
Выпадающий список: создан Проверка данных - Список. Список вносится в виде: Красное,розовое;Синее,голубое;Зелёное;Белое,чёрное,серое. И в ячейке получается нормальный список: Красное,розовое Синее,голубое Зелёное Белое,чёрное,серое Макрорекордер записывает список в виде "Красное,розовое;Синее,голубое;Зелёное;Белое,чёрное,серое". При запуске макроса выпадающий список в ячейке получается корявым в виде Красное розовое;Синее голубое;Зелёное;Белое чёрное серое Т.е. суть запятой и точки с запятой меняются местами.
Как макросом внести нормальный список с запятыми в значениях? Можно в укромное место на лист, а потом сделать ссылку, но нужен список без задействования листа.
Иногда приходится объявлять большое число переменных с одинаковым типом. Например:
Код
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.
Вопрос не совсем по Excel. В VBA запросом к таблице получаю данные, потом обработка данных и на лист Excel. Хотелось бы больше обработки возложить на SQL, т.к. на листе Excel процесс сильнее тормозит, а полученный в VBA из результата запроса массив может быть большой и вплоть до нехватки памяти. Таблица с code и id. Значения code уникальные, id - нет. Из таблицы надо получить все строки и количество одинаковых id по каждому code. Пока у меня получаются данные только с одним (последним) code по каждому id. Проблема ещё в том, в для данной таблицы и провайдера не работают вложенные запросы. Но JOIN и UNION - работают, хотя и с ними не получилось. Возможно, решение простое, но сам никак не соображу. Пример таблицы для простоты - в Excel.
Нужно формулой посчитать количество повторов каждого значения в столбце. Но повторы значения с совпадающим вторым полем считать как 1 повтор.
В примере: поля id и code. Надо в другом столбце idcount_sum напротив каждого значения формулой получить количество повторов каждого code, но code с одинаковым id считать как один повтор. Формула легко делается с доп. столбцом tmp_id_count. Не могу сообразить, как сделать всё в одном столбце.
В ячейках коды (текстовые значения) типа ИN ЙQ ЙD ИF ИZ ЙG После сортировки они располагаются так: ЙD ИF ЙG ИN ЙQ ИZ Хотя надо, чтоб сначала шли все коды с И, затем с Й.
Просто по одной букве И и Й сортировка правильная - начала И, затем Й. Такая же проблема с Е и Ё. То, что не учитываются в сортировке некоторые символы (напр., дефис), тоже напрягает.
У кого-то есть идеи, как отсортировать таблицу с подобными значениями нормально по алфавиту?
Создать свой список не получится, т.к. на самом деле значения не двухсимвольные, а гораздо больше. И повлиять на текст кода тоже абсолютно никак нельзя, т.к. эти коды генерятся в другой программе по своему какому-то алгоритму.
Можно с VBA. С VBA тоже в этом смысле проблемы, т.к. при сортировке надо различать И и Й, но не различать заглавные и прописные буквы. Это решил доп.процедурой в другом модуле с Option Compare Binary. А самое главное, что таблица большая и столбцов сортировки несколько - Excel с сортировкой VBA зависает надолго. К тому же все процедуры сортировки, взятые с этого и других сайтов, страдают одним нехорошим свойством: при одинаковых значениях сам Excel располагает на листе строки в той последовательности, что были раньше, а макросы эти строки перемешивают, что совершенно не нужно. Да и не каждый пользователь способен запустить нужный макрос в нужный момент.
Сводная таблица создана на основании данных с нескольких полей. См. файл. Лист PT1 - сводная по Name с данными полей param1, param2, param3, param4. В ней есть итоги внизу (т.е. по каждому полю), но нет почему-то итогов по строке (т.е. по каждому Name). В параметрах таблицы галки на Итог по строкам и Итог по столбцам установлены. Можно добавить суммы вручную, но это доп. заморочки. Жёлтым выделен заголовок столбца, в котором суммы вставлены отдельной формулой. Но при удалении одного из полей param суммы, естественно, остаются на месте и получается пустое пространство. Если вдруг надо добавить поля типа param, то вставленные вручную итоги вообще затираются. Как и где в параметрах таблицы сделать так, чтоб сводная в таком виде имела свои автоматические итоги по каждой строке?
Кстати, на листе PT2 в столбцы таблицы добавлено поле status. И в таком виде в конце строк получаются итоги по param1, param2 и т.д. Что не так в первом варианте?
Код Cells.SpecialCells(xlCellTypeLastCell).Row выдаёт номер последней используемой строки на листе. Если использовать его в Sub, то результат правильный. Если вписать код в Function, а саму функцию запускать из Sub, то тоже результат верный. Но если внести функцию на лист как формулу, то результат получается кривой. Что не так делаю? В примере последняя строка 10, в ячейке B3 формула даёт 1.
Есть пара вопросов/пожеланий по поиску на форумах.
1. Поиск производится только на форумах. Можно ли добавить одновременно поиск по Приёмам? В крайнем случае, создать закрытую тему на форуме, в которой будут описания и ссылки уже на Приёмы. Это чтоб упростить жизнь создающим новые темы, которые не читают, как и я, в Правилах про создания новых тем. 2. Сделать так, чтоб поиск выводил тему с найденным текстом только один раз, а не столько раз, сколько встречается заданный текст. На других форумах (не на всех, но многих) так и сделано, что, по-моему, гораздо удобнее и нагляднее.
ЗЫ. Кстати, похожие темы с похожими вопросами здесь не нашёл. Плохо искал?
Макросом получаются данные из файлов dbf. Нужно в запросе преобразовать дату и число в текст. То, что советуется в интернетах - использовать операторы format (а также convert, cast и др.) - не помогает. Выскакивает ошибка [Microsoft][ODBC Visual FoxPro Driver]File 'format.prg' does not exist. Драйвер подключения поменять не получается, т.к. прочие драйвера выдают ошибку Внешняя таблица не имеет предполагаемый формат. Пока выкручиваюсь тем, что данные запроса загоняются в массив и там уже преобразуются. Но это усложняет код VBA и не всегда получается сделать быстро. Как в самом запросе преобразовать дату или число в текст?
Код
Set cnn = New ADODB.Connection
strCnnString = "Driver={Microsoft Visual FoxPro Driver};DriverID=277;UID=;PWD=;" & _
"SourceDB=D:\Mybase;SourceType=DBF;Exclusive=No;" & _
"BackgroundFetch=Yes;Collate=Machine;Null=no;Deleted=Yes;"
cnn.Open strCnnString
Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient
sqlString = "SELECT date, doc, cena FROM mydbf" ' здесь надо бы сразу получить date и cena как строку (текст)
Set rst = cnn.Execute(sqlString)
Есть TextBox, при изменении текста в котором должен срабатывать макрос. Но надо, чтоб макрос сработал после ввода всех символов, но не выходя из самого TextBox. Т.е. через некоторое время после ввода последнего символа, а не при вводе каждого символа.
Делал так.
'В модуле:
Код
Public TextBoxUpdateTime
Sub MyMacro()
MsgBox "Hello!"
End Sub
'В модуле формы:
Код
Private Sub TextBox_Change()
Dim tx
tx = TimeValue("00:00:05") ' интервал задержки
If TextBoxUpdateTime+ tx < Now Then ' если время выполнения макроса ещё не подошло
On Error Resume Next
Application.OnTime TextBoxUpdateTime+ tx, "MyMacro", Schedule:=False ' отмена запуска макроса в старое время
On Error GoTo 0
TextBoxUpdateTime= Now
Application.OnTime TextBoxUpdateTime+ tx, "MyMacro" ' назначение запуска на новое время
End If
End Sub
Почему-то срабатывает через 5 сек после начала ввода символов, а не после. Где тут косяк, не могу понять.
В столбце список текстовых значений в свободном порядке. Надо найти номер строки ячейки в этом столбце, в котором последний раз встречается заранее заданное значение. На форумах находил решение на похожий вопрос, но только по числовым данным. А адаптировать под текст не получилось. Само собой, только формулами.
Выбираем, например, фильтр столбца В по Гайка. Получаем список ФИО. И надо посмотреть, что вообще брал, например, Иванов. Т.е. устанавливаем фильтр в столбце А на Иванов, а в столбце В фильтр убираем (отобразить всё). Получаем список товаров. Всё нормально. Заново. Фильтры сбросить. Теперь выбираем в столбце В Болт. Получается, что Болт брал только один Иванов. Опять же: надо посмотреть, что вообще брал этот Иванов. И получается такая картина: В 2003 всё нормально, т.е. можно выбрать Иванова и снять фильтр по товару. А в 2010 приходится либо снимать фильтр в столбце В и отдельно делать по столбцу А, либо привлекать Настраиваемый фильтр. Если таких данных много и надо быстро просмотреть их, то в 2010 получается весьма неудобный фильтр. Кстати, по Склад тоже нельзя выбрать галочкой, ибо тоже только единственное значение.
Где настроить, чтоб фильтр был простой выбор (галочкой), как в 2003?
ЗЫ. Но кое в чём-то фильтр 2010 лучше, чем 97-2003, согласен. ЗЫЫ. Ну, думаю, само собой разумеется, что без макросов :-))
Во вложении книга, все данные которой явно входят на 1 страницу ландшафтом. Даже с запасом. Никаких других данных или "высовывающихся" за пределы листа ячеек нет. Никак не могу понять одну вещь. Почему при печати получается 2 страницы? Вторая, самой собой, полностью пустая. Если выставить Параметры страницы -> Разместить не более чем 1 стр. в высоту, то в конце справа остаётся много пустого места, что неудобно. Пробовал на нескольких разных принтерах - одно и то же. Может, слишком много столбцов? Неужели у Excel лёгкий глюк по этому поводу?
Задача такая: отобразить данные в ячейке в зависимости от значения, а именно: при >1 - формат с одним десятичным знаком при <1 и >0 - формат с двумя десятичными знаками при <0 - целочисленный формат со знаком минус
В формате ячейки -> все форматы ввожу [>1]0.0;[>0]0.00;0 В итоге числа >0 и <-0.5 отображаются как задумано. А числа от 0 до -0.5 почему-то считаются >0 и отображаются без минуса и до сотых.
Что-то с форматом напутано или это такая фишка спецформата?
А можно ли подкрутить Excel так, чтоб после операции Данные -> Итоги... в столбце критериев ("при каждом изменении") после значения вместо слова "Итог" было другое слово, а лучше не было совсем? А то приходится после операции Итогов отдельно выделять диапазон и заменять " Итог" на "". Всё бы ничего, можно каждый раз нажать немного лишний раз поработать мышью и клавиатурой. Но иногда само значение-критерий может содержать слово " Итог". Городить каждый раз лишний макрос или функцию по откусыванию последний 5 символов в ячейке ещё муторнее... К тожу же " Итог" - это не везде так: "Итог" - это в Excel2003, а в Excel97 -"Всего". Не говоря уже про Excel на английском или прочих суахили...
Условное форматирование. Условия нужны такие: закрашивать ячейку, если в одной ячейке значение =1, и в другой =2. Если указать в формуле условного форматирования прямые ссылки на обе ячейки, то всё работает. Но надо указать ссылки в виде ДВССЫЛ(АДРЕС(текущая_строка;нужный_столбец)). Если в формуле присутствует только конструкция ДВССЫЛ(АДРЕС(текущая_строка;нужный_столбец)), то всё работает. Но если добавляется ещё условие, даже простое, то Условное форматирование перестаёт работать.
В примере: Col2, Col4 - именованые ячейки, на номер столбца которых надо ссылаться. В ячейках C4, C4 и C6 - условное форматирование: формула его описана в столбце А В C4 и C5 - нормально, в C6 - почему-то не работает.
При формировании вложенных Итогов происходит неверная группировка для верхней группы данных. При условии "Итоги под данными" всё группируется нормально. Как всё-таки сделать нормальные Итоги на данными?
Во вложенном файле пример на листах: сами данные, как получается при стандартной процедуре формировании Итогов, как хотелось бы получить.
Excel 2003 (11.5612.5606), Но такая же беда и в Excel 97
Как создать именованную формулу, чтоб ссылку можно было задавать прямо при вводе её в ячейку в качестве аргумента? Т.е. чтоб в ячейку A1 можно было ввести что-то типа =МояФормула(D3) и получить значение именно из ячейки D3. Или =МояФормула(G6) - из ячейки G6 соответственно.
Этот вопрос обсуждался, но правда, на другом форуме. Там через одно место проблема решается. Но главная остаётся: появляется окно с предупреждением о макросах. Но хотя и отключить их нельзя, т.к. Excel версии 4.0
Может у кого есть иной способ решения?
PS. Вопрос вдогонку. В формуле =ЕСЛИ(СТРОКА(D7);ИСТИНА;ЛОЖЬ) после ЕСЛИ должно идти логическое выражение. Формула СТРОКА(D7) выдаёт номер строки. А почему номер строки является вдруг значением ИСТИНА? Номер строки - это число и оно совсем не равно ИСТИНА и может быть вовсе не равно 1. То же самое с конструкцией ЕСЛИ(СТОЛБЕЦ(
В приложенном файле в ячейках H8 и J8 одна и та же формула. И считает по разному, если выражение заключено в дополнительные скобки. Т.е. там явно должен получиться чистый 0 (ноль), но вместо него вылазит ооочень маленькая, но ненулевая величина. Из-за этого дальнейшие вычисления выполняются неверно. Само нужное выражение записано в столбце H выше. И там эти "лишние" скобки уже не являются лишними. Понятно, что лечится добавлением в выражение ОКРУГЛ(...;2) в нужных местах. Но каждый раз такие финты не отследишь и не знаешь, с какой стороны ещё Excel взбрыкнёт.
Или это всё из-за Excel 97? Может, что-то где-то можно подкрутить, чтоб такое больше не происходило?
Как сохранить буфер обмена Clipboard или CutCopyMode при каком-либо изменении на листе?
Например.
На листе макрос на событие изменение выделения в активной ячейке размер шрифта устанавливает 10. Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) ActiveCell.Font.Size = 10 End Sub
Надо скопировать некую ячейку в другую на этот же лист. Выделяю некую ячейку -> Копировать Выделяю новую ячейку -> Вставить не работает: макрос на SelectionChange отключил CopyMode.
В таком виде Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Application.CutCopyMode = xlCopy Then ActiveSheet.Paste End If ActiveCell.Font.Size = 10 End Sub не пойдёт, т.к. вставлять надо не автоматом при выделении ячейки, а командой Вставить
В таком виде Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Application.CutCopyMode = xlCopy Then Exit Sub End If ActiveCell.Font.Size = 10 End Sub тоже не пойдёт, т.к. всё-таки нужно, чтоб основное действия макроса (иустановить размер шрифта 10) должно обязательно срабатывать.
Как бы так, чтоб и рыбку съесть, и ...удачно сесть? Вообще, основное действие макроса нужно, чтоб ячейка выделялась жёлтым: ActiveCell.Interior.ColorIndex = 6
Excel 2003 Для вставки формул макросом делаю как все: сооружаю формулу, включаю запись макроса, вхожу в редактирование ячейки, ВВОД. Но при сложной формуле выдаётся предупреждение «Запись невозможна» и ничего не записывается. Приходится разбивать формулу на составные части, записывать их макрорекордером по отдельности и потом в VBA вручную их соединять. После этого сам макрос вставки формулы работает нормально.
Интересно, что в Excel 97 подобного предупреждения не выдаётся, но и макрорекордер записывает чушь и в кастрированном виде. В прилагаемом файле: не записываются формулы в столбце O (выделено жёлтым). Для примера: макросы 1 и 2 – записаны в Excel 97. А макрос FormulaInsertMacro уже вручную доделанный рабочий.
В ячейке B2 введено значение типа А123Б. Есть ещё ячейка. Формат её Числовой с двумя десятичными знаками. В ячейке формула типа =ПСТР(B2;2;3)*1. Отображается правильно, т.е. 123.00 Захожу в ячейку для корректировки формулы вручную. Меняю формулу на, например, =ПСТР(B2;2;2)*1. Но вместо ожидаемого значения 12.00 отображается сама формула (=ПСТР(B2;2;2)*1) и формат ячейки самопроизвольно становится текстовым. Приходится опять менять формат ячейки на числовой, входить в ячейку и нажимать Enter.
Как избавиться от этого маразма? PS. В Excel 97 такого идиотизма не было...
Некие сторонние данные макросом записываеются в массив Variant. Среди всего прочего есть текстовые данные с апострофом в начале. При переносе на лист Excel апостроф перестаёт отображаться и становится как бы незначимым. Т.е. не влияет на сортировку, формула ЛЕВСИМВ(A1;1) его тоже не воспринимает и т.п. Однако нужно, чтоб этот апостроф отображался и был значимым. Как сделать?
Некоторые замечания. 1. На источник данных повлиять никак нельзя, т.е. апостроф ничем другим не заменить. 2. В процессе работы эти же данные получаются экспортом из txt. И там этот апостроф отображается и ЛЕВСИМВ даёт верный результат ("'"). Но сортировка этот апостроф не воспринимает. После ручного "переввода" (редактирования) данных в ячейке апостроф перестаёт отображаться. 3. Не получается скопом вручную или макросом "переввести" данные в ячейки. Ибо общепринятая известная процедура (Копировать пустую ячейку -> Выделить нужный диапазон -> Специальная вставка -> Сложить) нужного результата не даёт. 4. Пока приходиться изгаляться и макросом добавлять второй апостроф в начале. Но это плохо, ибо надо как-то сравнить данные из массива с данными, полученными через txt.
В прикреплённом файле пример данных, полученными через txt. Данные с апострофом в конце - это после сортировки.
Есть код VBA, который добавляет записи в dbf-файлы рабочей базы. Код давнишний, на Windows 98 – Excel 97 работает. При переносе на другой компьютер с Windows 98 – Excel 97 тоже работает. Но на Windows XP – Excel 2003 работать не хочет.
Сам код. На всякий случай весь, хотя ошибка вылезает в самом начале
Код
Dim cnn As ADODB.Connection
Dim strCnnString As String
Dim rst As ADODB.Recordset
Dim sqlString As String
Dim Data As Variant
Dim DirPath As String
DirPath = "D:\MyBase"
Set cnn = New ADODB.Connection
' Строка подключения ODBC.
Set cnn = New ADODB.Connection
strCnnString = "Driver={Microsoft Visual FoxPro Driver};DriverID=277;UID=;PWD=;" & _
"SourceDB=" & DirPath & ";SourceType=DBF;Exclusive=Yes;" & _
"BackgroundFetch=Yes;Collate=RUSSIAN;Null=Yes;Deleted=Yes;" 'Machine
cnn.Open strCnnString ' НА ЭТОЙ СТРОКЕ ВЫЛЕТАЕТ ОШИБКА
' Используем метод Execute для создания набора записей.
Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient
sqlString = "INSERT INTO mydbf (……)" ' Тут sql-строка для вставки данных
Set rst = cnn.Execute(sqlString)
' If rst.EOF Then
' Else
' Data = rst.GetRows
' End If
' rst.Close
' Set rst = Nothing
cnn.Close
Set cnn = Nothing
Если строку подключения использовать в виде strCnnString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & DirPath & ";" то ошибки не появляется, но… там возникает проблема с кодировкой символов, которую решать уж больно муторно….
В прилагаемом файле: Рис.1 – сама ошибка далее: то, на что хватает моих знаний: рисунок состояния References и Option->General из Tools в VBA-редакторе.
Сторонняя программа (БЭСТ) экспортирует данные в книгу xls по шаблону. В шаблоне нужные формулы и макросы. 1. Как сделать запуск макроса ПОСЛЕ получения данных в книгу xls? (Пока получается делать только по событию Worksheet_SelectionChange, но есть ли другой способ?) 2. Как потом удалить из книги все макросы, а формулы заменить на значения (хотя их можно заменить в макросе через Copy->PasteSpecial(Value), но есть ли ещё способ?)?
Никак не могу сообразить, как получить сводную таблицу по нескольким различным суммам. В данном примере по каждому шифру (наименованию) нужна сумма количества, рублей и объёма. В Приёмах смотрел, но этот момент всё-равно не очень понятен.
То, что получается, выглядит не совсем удобно: либо лишние строки, либо в транспонированном виде. И приходится делать лишние действия по оформительству.
В примере листы: Данные - табличка с исходными данными. Сводная вариант 1 - то, что получается при способе 1 Мастера сводных таблиц. Сводная вариант 2 - то, что получается при способе 2 Мастера сводных таблиц. Надо получить - вот такой результат хотелось бы иметь в Итоге. В данном случае сделано через СУММЕСЛИ, но в общем случае точно не известно число различных наименований товара и сводная тут была бы самый раз.