Прошу помощи, ибо не нашёл такой же задачи в Форуме. Мне по итогам месяца требуется анализировать использование автопарка. Для этого надо подсчитывать факты невыезда а/м с указанием причины. Одна из них -- не было свободного водителя. Выходит, что из большой таблицы, куда я заношу данные из путевых листов (да ещё и не в хронологическом порядке, а по мере поступления), нужно: 1. подсчитывать задействованных водителей и а/м по каждому дню отдельно и (определять даты, когда были внесены все водители, а машины -- не все) и суммировать количество невыехавших в эти дни по этой причине машин. 2. учитывать отпуска водителей (то есть в указанный период программа не должна его "видеть" в списке, во как). Если есть соображения, поделитесь, пожалуйста. Спасибо.
P. S. Ещё одна неприятность состоит в том, что это должно касаться только рабочих дней месяца.
Причину я так и не понял, но когда заменил во всех местах формулы ссылки на данный автомобиль вида СЧЁТЕСЛИ($A$1:A1;A2) и ЕСЛИ($A$1:A1=A2;СТРОКА($1:1)) на СЧЁТЕСЛИ($A$1:A4;ИСХОДНЫЕ[[#Эта строка];[А/М]] и ЕСЛИ($A$1:A4=ИСХОДНЫЕ[[#Эта строка];[А/М]], всё стало работать корректно. При копировании ячеек относительные ссылки обновляются, как известно, корректно, а при сортировке -- оказывается -- возникает вот такая странность. Если есть желание прокомментировать эту ситуацию, прошу высказываться сюда. Спасибо.
Причину я так и не понял, но когда заменил во всех местах формулы ссылки на данный автомобиль вида СЧЁТЕСЛИ($A$1:A1;A2) и ЕСЛИ($A$1:A1=A2;СТРОКА($1:1)) на СЧЁТЕСЛИ($A$1:A4;ИСХОДНЫЕ[[#Эта строка];[А/М]]) и ЕСЛИ($A$1:A4=ИСХОДНЫЕ[[#Эта строка];[А/М]], всё стало работать корректно. Быстрее сделать, чем понять, иногда.
А почему при попытке сортировки таблицы (по датам, например) возникают ошибки :o (в столбце "ОСТАТОК" -- значения -- вообще не реалистичные получаются)? Как этого избежать? Формула при сортировке-то ведь не изменяется...
Вроде бы да, но это же лишит меня возможности оперативно работать со своей таблицей. Ведь, чтобы в дальнейшем пользоваться ею, мне нужно будет все формулы вернуть на место, разве не так? Возможно, есть способ сразу заполнять требующиеся мне ячейки значениями получающихся результатов, а не формулами? Либо (ещё лучше) чтобы я вводил свои данные в какой-либо форме, а таблица сразу вставляла их в нужном порядке, с возможностью открыть и просмотреть данные по водителям, либо по датам, либо по пассажирам и т. д.
Прошу помочь исправить и вернуть мне возможность сортировки.
В таблицу вводятся данные о работе транспорта в таком порядке, в каком поступают. Когда я ввожу название автомобиля, формула ищет его предидущий спидометр (максимальный для данного автомобиля) и остаток топлива в баке на предидущую его рабочую дату (максимальную дату), заполняя мне столбцы "ВЧЕРА" и "БЕНЗИН". Когда я вношу показания спидометра на сегодня, формула считает его пробег, расход и остаток топлива на сегодня, заполняя соответствующие столбцы "ПРОБЕГ", "РАСХОД", "ОСТАТОК". Не получается вот что: когда я сортирую эту таблицу (по датам, по автомобилям, по фамилиям водителей, да мало ли ещё по какому критерию!) в столбцах "ПРОБЕГ", "РАСХОД", "ОСТАТОК" возникают сообщения об ошибках, либо неправильные данные. Пожалуйста, посоветуйте мне, как улучшить используемые мной формулы, чтобы они были "устойчивыми к сортировкам". =СЧЁТЕСЛИ(все строки выше;даный автомобиль);ИНДЕКС(спидометры;МАКС(ЕСЛИ(все строки выше=данный автомобиль;СТРОКА($1:1)))) Формулу подсказали тут. Особо злит, что я вообще не могу понять, каким образом сортировка влияет на работу формулы, почему так происходит!
LVL пишет: сли нумерация в первой строке... код сохраняется, подсвечивая синтаксическую ошибку.
Не нахожу кода, если вставляю его вместе с нумерацией.
Цитата
Юрий М пишет: xls ВСЕГДА поддерживало макросы, а xlsx никогда. Странно, что Вы этого не ожидали))
Ну, это Вам странно. А я пока где-то информацию не прочту, пользоваться ею не умею. P. S. А иногда и после этого тоже не умею)) Но стараюсь. В принципе, считаю тему закрытой.
Спасибо, Юрий. Вопрос я задавал о том, как сохранить документ, не потеряв при этом макрос. Ответ оказался простым: удалить нумерацию строк в коде и сохранять с поддержкой макросов. Причём обязательными оказались оба условия.
Попутно выяснилось: 1. расширение xls поддерживает макросы (доказательство -- в посте № 7), то есть отчасти более функционально, чем xlsх, чего я не ожидал. 2. Нельзя просто копипастить текст кода со страниц этого сайта, ибо там пронумерованы строки и это не позволяет макросу сохраниться и работать.
Кажется, я нашёл ответ. Скопированный с сайта код в моём случае выглядит так:
Код
01 Private Sub Worksheet_Change(ByVal Target As Range)
02 Dim vVal
03 Dim StrVal As String
04 Dim dDate As Date
05
06 If Target.Cells.Count > 1 Then Exit Sub
07 If Not Intersect(Target, Range("ДАТА")) Is Nothing Then
08 With Target
09 StrVal = Format(.Text, "000000")
10 If IsNumeric(StrVal) And Len(StrVal) = 6 Then
11 Application.EnableEvents = False
12 dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2))
13 .NumberFormat = "dd/mm/yyyy"
14 .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate)))
15 End If
16 End With
17 End If
18
19 If Not Intersect(Target, Range("ВРЕМЯ")) Is Nothing Then
20 With Target
21 vVal = Format(.Value, "0000")
22 If IsNumeric(vVal) And Len(vVal) = 4 Then
23 Application.EnableEvents = False
24 .Value = Left(vVal, 2) & ":" & Right(vVal, 2)
25 .NumberFormat = "[h]:mm"
26 End If
27 End With
28 End If
29 Application.EnableEvents = True
30
31 End Sub
А вставленный в более ранний документ, так:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vVal
Dim StrVal As String
Dim dDate As Date
If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("A14:A41")) Is Nothing Then
With Target
StrVal = Format(.Text, "000000")
If IsNumeric(StrVal) And Len(StrVal) = 6 Then
Application.EnableEvents = False
dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2))
.NumberFormat = "dd/mm/yyyy"
.Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate)))
End If
End With
End If
If Not Intersect(Target, Range("D16:I506")) Is Nothing Then
With Target
vVal = Format(.Value, "0000")
If IsNumeric(vVal) And Len(vVal) = 4 Then
Application.EnableEvents = False
.Value = Left(vVal, 2) & ":" & Right(vVal, 2)
.NumberFormat = "[h]:mm"
End If
End With
End If
Application.EnableEvents = True
End Sub
"Найдите десять отличий!" Может быть, дело в том, что на копируемом мной тексте из ссылки в первом посте -- строки кода нумерованы? Вставил без нумерации -- работает...
Что значит "не бывает"? Файлы-то -- приложены. Признаю, недоглядел. Старый файл -- xls. Но это никак не объясняет, куда подевался макрос в документе из поста № 3.
Вот в этом-то и состоит суть моего вопроса: куда девается код макроса? Почему в старом документе из поста № 7 он сохряняется, а в новых, требующихся мне документах из постов № 1 и № 3 -- нет. А текст кода взят с сайта.
Спасибо за Ваш ответ, но для меня всё же остаётся непостижимым: 1. Такая же история и с *.xlsm (приложил в посте №2)-- не сохраняет. 2. Предидущая версия этого документа, которую я использовал ранее, сохранена как *.xlsx и -- работает. Прилагаю.
Более того, я создавал этот документ дома, при помощи Ексель-2013, там такая проблема тоже была, но при сохранении документа, программа подсказывала мне, что проект VB невозможно сохранить иначе, как в формате с поддержкой макросов, там я сохранил этот документ как *.xlsm, затем открыл его и сохранил как *.xlsх и всё продолжало работать. Отправил этот документ себе на работу почтой, откріваю тут при помощи Ексель-2007 и макроса нет, нужная функция не работает и сохранить её никак не выходит. Вот такая странность...
Давно пользовался приёмом с этого сайта сокращенный ввод времени и даты в документе, с которым я постоянно работаю. Назрела необходимость создать другой подобный документ, в котором также эта функция могла бы здорово облегчить мне жизнь, но не тут то было... Вставляю текст в исходный код, прописываю свои диапазоны, сохраняю и... ничего не работает. Открываю снова исходный код, а там -- пусто. Защита от макросов -- отключена, сохранять документ с поддержкой макросов -- пробовал. В чём может быть проблема?
Заработало, когда заметил вот эту фразу: "В J2, формула массива". Вставил, как массив, и всё пошло . Правда, к сожалению, не понял, в чём тут дело... Ещё раз благодарю за помощь.
СЧЁТЕСЛИ($A$1:A1;A2) -- проверяет вводимую мной запись на уникальность. Если уже встречалась, то выбирает из диапазона спидометров строку -- ИНДЕКС($L$1:L1;с максимальным значением МАКС(ЕСЛИ($A$1:A1=A2;СТРОКА($1:1)))) из верхней части диапазона при условии... (ЕСЛИ($A$1:A1=A2;СТРОКА($1:1)))... вот смысл условия до меня не доходит. И где-то тут есть ошибка.
Спасибо, vikttur и Юрий М, я исправлюсь. Как и в обсуждаемом нами предмете, сослаться на пост можно разными путями. Предложенный Вами, Юрий М, -- проще, признаю. Да и пункт 4.2 правил, действительно, не рекомендует применять цитирование чрезмерно. но остаётся открытым заданный мной вопрос, как отладить формулу viktturа. Есть предложения?
Результаты обнадёживают). Формула действительно ничего не возвращает при первом появлении каждой машины, а при повторных -- пытается что-то сделать, но получается #ЗНАЧ
Спасибо! То, что я хочу увидеть -- приложил к этому сообщению.
Мне понравилась Ваша формула, но она возвращает сегодняшнее значение, которое я и так вношу от руки. А мне нужно, чтобы, когда я вношу название а/м (столбец "А"), то в столбце "J" появлялось значение из столбца "L", на той строке, когда последний раз встречался этот а/м. То есть, как бы НАИБОЛЬШИЙ(L:L; 2), но не из всего столбца, а только тех его значений, которые соответствуют критерию из этой же строки по первому столбцу. Помогите, если возможно.
Прим. вставить Вашу формулу как формулу массива -- не смог... пишет, что "в таблицах нельзя использовать формулы для массивов с несколькими ячейками"...
Помогите, пожалуйста. Знаю, что вопрос -- простой, но найти решение не могу. Ежедневно вношу в таблицу данные спидометров десяти а/м. Как добиться, чтобы в соседнем столбце с сегодняшними показаниями, возвращались показания этого же а/м за его предидущий рабочий день? То есть, из всех показаний за период выбирались относящиеся к данному а/м и из них -- наибольшее? (Мне это нужно для получения ежедневного пробега, чтобы в сводке на другом листе указывался расход каждого а/м ежедневно). Пример -- прилагаю (на листе "ВНОСИМЫЕ!", диапазон отбора -- столбец "К", условие отбора -- столбец "А" . Благодарю за любые подсказки.
Уже я понял, что помогает мне сводная таблица. В прикреплённом примере она -- на "ЛИСТ1". Однако, в моих вносимых данных нет расхода и пробега, есть только значения спидометра при возвращении в гараж... Задача теперь поворачивается иначе: я могу во вносимых данных добавить нужные столбцы ("спидометр при выезде" и "расход" (норма_расхода*пробег), но как сделать, чтобы, когда я создаю новую строку для какого-либо автомобиля (мне сдали путёвку), в этот новый столбец подставлялись данные спидометра из предыдущего раза, когда этот автомобиль вносился (данные спидометра при предыдущем возвращении именно этого автомобиля в гараж)?
Пример приклепляю. Задача такая: из исходных данных на листе "ВНОСИМЫЕ" нужно получать ежедневно обновлённую таблицу на листе "СВОДКА". Проблема состоит в том, что в требуемой сводке расход каждого автомобиля должен подсталяться в ячейку с той датой, в которой он ездил, то есть должна иметь место сортировка по дате И по автомобилю. Но даты нужно получать также из "ВНОСИМЫЕ". Прошу подсказки или ссылки на то, что тут применить. Спасибо.