Добрый день! Прошу помочь с настройкой выпадающего списка из отфильтрованных ячеек столбца умной таблицы (фильтр по двум условиям). В таблице на листе "список" исходные данные; выпадающие списки - на листах "Петербург" и "Москва". Не могу настроить отбор нужных ячеек, которые должны попасть в выпадающий список. В прилагаемом файле сделал пояснения к задаче. Формулами или макросом - не имеет значения, но сводная таблица мне не подходит, т.к. требует ручного обновления данных. Excel 2013
Нашел решение на просторах интернета) Суть - принудительное указание текстового формата ячеек, в которые экспортируются данные. После копирования, перед вставкой. Затем формат ячеек меняется на общий. Выкладываю исправленный файл
Спасибо, но мне не удобно вручную прогонять через онлайн конвертер. У меня эта операция должна обрабатывать файлы PDF в пакетном режиме, перебором. Не удалось выяснить природу такого поведения Excel?
Здравствуйте! Не могу самостоятельно решить проблему: при экспорте табличных данных из pdf в excel 2013 в некоторых ячейках теряются десятичные запятые. Раньше код экспорта применял не раз, но с такой проблемой не сталкивался. Причем в буфере обмена после экспорта информация хранится с запятыми - если после экспорта вставить содержимое буфера (вторая кнопка), то запятые оказываются на месте.
Файлы примеров (pdf и excel) прилагаю, проблемные ячейки пометил цветом. Win10 rus Прошу не обращать внимание на неточности с расположением экспортированных ячеек - это появилось после "обрезки" pdf файла и в данном случае не важно. Дальнейший код переводит текстовые значения в числа.
Ошибку осознал, постараюсь не повторять Вроде лишнее из цитат вырезал, а сейчас посмотрел - оказывается, не все. Upd. подчистил цитаты в своих ответах.
Юрий М написал: Да ничего сложного - даже проще)) См. небольшой пример:
Теперь понял, что Вы имели в виду. Я кстати, так сначала (всмысле, вчера ) и раскладывал MsgBox, но (сегодня:D) увидел более наглядный, с моей т.з., вариант. Но он в данном случае не помог мне...
Johny написал: У автора темы условие срабатывания "КОД(Import)" - это "lLastRow =<12", а у вас, Hugo, он будет отрабатывать всегда. Или я чего-то недопонял?
Нет, два условия срабатывания "КОД(Import)" : 1. Срабатывание при lLastRow =<12" или 2. Срабатывание, если lLastRow >12, и после вопроса о замене данных - ответ пользователя "Да"
Юрий М написал: Да и вообще можно без Select Case - проверяем сразу vbYesNo
Это для меня ОЧЕНЬ сложно:D
Цитата
Hugo написал: Так вроде там всё проще организовывается:
Ну что такое... Я ломал голову над этой проблемой целый день(!), а тут пришли Вы, и за десять минут её решили! Все отлично сработало! Огромное СПАСИБО!
Знатоки, помогите, пожалуйста, в решении проблемы:
макрос импортирует данные из файла .csv и вставляет их в ячейки текущего столбца ниже 12-ой строки. Эти ячейки могут быть без данных, и тогда проблем нет; или с данными - тогда нужно спросить пользователя, перезаписывать их или нет. КОД(Import) как раз и отвечает за импорт данных. Это не совсем маленький код, и вставлять его два раза - неспортивно. Вопрос: какие есть варианты? Запись КОДа(Import) в отдельную функцию у меня не получился. Сейчас пока работает так:
Код
'код в модуль листа. Для выполнения даблкликнуть ячейку в третьей строке
'
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim lLastRow As Integer
Cancel = True
lLastRow = Cells(Rows.Count, Target.Column).End(xlUp).Row
If Target.Row <> 3 Then Exit Sub ' если активная ячейка не принадлежит 3-й строке, ничего не делать
If lLastRow > 12 Then ' если последняя заполненная ячейка расположена ниже 12-ой строки текущего столбца,
'значит, в ячейках есть данные, которые будут заменены при выполнении КОДа(Import). Выводим сообщение:
Select Case MsgBox("Переписать существующие данные?", vbYesNo + vbQuestion + vbDefaultButton2, "Внимание!")
Case vbNo
MsgBox ("ОК, ничего не меняем, все оставляем как есть.")
Exit Sub
Case vbYes
MsgBox ("Перезаписываю данные...")
'--------------------
' КОД(Import)
'--------------------
End Select
Else ' если lLastRow =<12, ячейки без данных, можно без вопросов импортировать в них данные:
'--------------------
' КОД(Import)
'--------------------
End If
End Sub
Александр написал: Что за параметр Cancel в функции Worksheet_BeforeDoubleClick, за что он отвечает?
Сори, нашел инфу по этому вопросу. Для тех, кто не знает и для себя, если забуду : Cancel = True - это отмена стандарного поведение Excell по двойному клику в заданном диапазоне. Требуется, чтобы назначить свои действия.
И еще раз всем здравствуйте! Немного подточил код макроса от ув. Hugo под себя. В процессе изучения кода у меня появилось несколько вопросов: 1. Что за параметр Cancel в функции Worksheet_BeforeDoubleClick, за что он отвечает? 2. Выражение
Код
sep_ = Mid(1 / 2, 2, 1)
для меня осталось загадкой. Вместо неё для замены точки на запятую в данных я использовал конструкцию
Код
If .exists(t) Then Cells(i, Target.Column).Value = Int(Replace(.Item(t), ".", ","))
и она работает. В ней есть подводные камни? 3. Когда я для очистки ячеек (в случаях, когда данные в словаре не найдены) попробовал вписать после кода
Код
For i = 13 To il
t = Cells(i, 5) & "|" & d
If .exists(t) Then Cells(i, Target.Column).Value = Int(Replace(.Item(t), ".", ","))
строку
Код
Else .exists(t) Then Cells(i, Target.Column).Value = ""
то Excell пожаловался на отсутствие If (что-то типа Else без If). Видимо, потому, что If в данном случае работает как-то по-другому? Просветите, пожалуйста:oops: У меня сработала такая строка, и я её оставил вместо предыдущей:
Код
If Not .exists(t) Then Cells(i, Target.Column).Value = ""
4. И еще мне не понятно, как макросом определяется максимальное значение показания счетчика в конкретной дате? Предположу, что кодом наполнения словаря
Код
With CreateObject("Scripting.Dictionary"): .comparemode = 1
For i = 0 To UBound(a)
If Len(a(i)) Then
b = Split(a(i), ",")
t = b(1) & "|" & Split(b(0))(0)
.Item(t) = b(6)
идет проверка строк сверху вниз методом замены предыдущего найденного значения последующим. А т.к. последующее - более свежее показание, то оно и остается в словаре, закрепляясь за ключем. Я прав? 5. В строке
Код
t = b(1) & "|" & Split(b(0))(0)
Split(b(0))(0) - это дата. Выскажу предположение по поводу её извлечения здесь: функция Split(b(0))(0) разбивает переменную b(0) "дата время" на две ПОДпеременные, разделенные пробелом (аргумент Delimiter опущен) и выбирает первую подпеременную Дата, т.к. указан ноль (0) после Split(b(0)). Во завернул Это где-то рядом с действительностью или я в корне неправильно понял? Сразу прошу прощения у форумчан за дилетанские высказывания, а у экселя за новообразование "ПОДпеременные" Ну не знаю я, как это называется...
Изменено: Александр - 12.03.2015 09:08:20(На первый вопрос нашел ответ)
Сейчас разбираю Ваш макрос с ошибкой по косточкам:) Оказывается, это может быть увлекательным занятием. Самому любопытно - подгляжу в ответ "ребус-кроссворда" или справлюсь самостоятельно
Hugo написал: Ну для понимания можно в моём варианте выгрузить собранное на лист. Чисто для информации. А в процессе отладки содержимое массива можно смотреть в окне Locals, а для словаря можно дописать в код пару строк:
ФАНТАСТИКА! Так гораздо удобнее разбираться в коде.
Цитата
Hugo написал: Вот рабочий код в модуль листа "данные" - просто даблкликнуть ячейку с датой в третьей строке
Большое спасибо! Этот код вообще пока за гранью для меня, но я его расшифрую;) не без помощи форумчан. Кстати, у меня он выдал ошибку Run-time error '13':Type mismatch при выполнении строки
Код
If .exists(t) Then Cells(i, Target.Column).Value = Int(.Item(t))
Хочу самостоятельно проанализировать код и найти причину ошибки. Если не получится, обращусь к сообществу. Всем огромное спасибо за помощь!
Спасибо, буду разбираться. С точки зрения "изящности" решения, вариант без записи на лист конечно, лучше. Но для меня он сложнее в понимании на порядок. Если смогу решить эту задачку, буду это делать поэтапно. Главной проблемой считаю импорт данных только последнего опроса, в эту сторону и буду пока рыть
Hugo написал: не факт что у всех последний будет именно в один день
Да, такая ситуация теоретически возможна.
Цитата
Hugo написал: Намного проще найти данные по конкретному счётчику за конкретный день.
Да, конечно, этот вариант абсолютно устроил бы. Что касается времени, то можно было бы выбирать записи с максимальным значением времени в заданной дате.
Leanna написал: Вы не указали что такое "последний опрос" в таблице csv такого критерия нет.
>Опросы ежечасные. Количество опрошенных счетчиков может меняться (т.к. счетчик может быть отключен в момент опроса, и данные о нем не будут отражены). Но внутри одного опроса счетчик не может быть опрошен более одного раза. Порядок опроса (т.е. порядок записей по счетчикам внутри опроса) не меняется.
Тогда если смотреть с конца таблицы csv и вверх (записи добавляются в конец), то к предыдущему опросу отнесем запись, удовлетворяющую условиям: 1. Повтор номера счетчика (внутри одного опроса счетчик не может быть опрошен более одного раза) или 2. Время опроса не принадлежит часу последнего опроса (если последняя строка со временем 10.03.2015 08:00:34, то все, что раньше 10.03.2015 08:00:00 - это предыдущий, ненужный, опрос)
Я думаю, что вторую часть задачи можно решить немного проще: не обязательно макросу проверять соответствие номера счетчика при вписывании показаний на лист "данные". Если на листе "Импорт_данных" будут только актуальные данные, а также структура показаний на нем будет совпадать со структурой на листе "данные", то можно просто копировать и вставлять целым блоком
Я попытался сначала сделать автоимпорт данных из csv макросом, что-то не пошло, знаний не хватило. Поэтому сделал его штатными методами excell, но естественно, получился импорт всех данных. В "макросописании" я новичек, и максимум, что смогу - разобрать "по косточкам" существующий код и попытаться понять, что к чему...
Доброго всем дня! Прошу помощи в решении следующей задачи. Есть файл report.csv, в который программой методом добавления к существующим записываются почасовые данные - показания электросчетчиков. В другом файле "Показания счетчиков" ведется учет ежемесячных показаний этих счетчиков. Сейчас настроено так: в файл "Показания счетчиков" импортируются ВСЕ данные из "report.csv", а затем вручную показания за последний опрос копируются на лист "данные", в соответствии с номером счетчика. Основная проблема при этом, что из-за ненужной информации раздувается файл "Показания счетчиков", а также в том, что присутствует ручная выборка данных. Я хочу настроить импорт из "report.csv" не всех показаний, а только за последний по времени опрос, а в идеале и запись их в нужные ячейки макросом.
Дополнительная информация - в файле "Показания счетчиков".
Hugo, iba2004, Юрий М ОГРОМНОЕ СПАСИБО! Все варианты работают так как мне надо. Буду вникать и остановлюсь на более понятном для меня варианте. Но сейчас я уже не думаю, что формулу освоить легче:) Еще раз спасибо!
{quote}{login=Михаил С.}{date=01.12.2012 11:11}{thema=}{post}Формулами теоретически можно, практически - только если "все "Нева"" - не более 2-3. Нужен макрос, и на форуме он есть - вопросы такого задаются регулярно.{/post}{/quote} Спасибо! В моем случае "все "Нева" (или др. фирмы) может иметь до 4-5 номеров. Если с подсказанной формулой я еще смог бы, наверное, разобраться, то на самостоятельное написание макроса или глубокую его правку моих знаний не хватит:( Если это не очень сложно, не могли бы Вы помочь мне в написании такого макроса?
Здравствуйте! Помогите, пожалуйста, в решении следующей задачи: Есть таблица, состоящая из двух строк. В верхней строке - названия фирм (могут дублироваться), в нижней строке - соответствующие фирмам номера (уникальные). Требуется вывести в отдельные ячейки подборку соответствующий номеров по фирмам. Существуют ли формулы, с помощью которых можно этого добиться? Что-то типа формулы "СУММЕСЛИ", только не с суммированием найденных по условию значений, а их сцеплением? Спасибо.