В файле показан образец правильного ведения учета. Не на отдельных листах, а в общей таблице. По ней построена Сводная, уже из нее получены нужные данные формулой Не забывайте Обновлять Сводную при добавлении значений в Нормальную базу Данные ГЗН для вып.списка Таблицы расположены на скрытом листе 'Списки' Ну и переработанная UDF для Вашего (неправильного ) метода учета
Скрытый текст
Код
Function ВПРМН(iVal, sRng$, iClmn)
'iVal - искомое значение
'sRng$ - адрес диапазона для поиска значения, текст вида "C:F".
' Поиск осуществляется в первом столбце, так же как и в ВПР()
'iClmn - номер столбца из которого возвращается значение
'Всегда ищется точное совпадение
Dim iWb As Workbook
Dim iSh As Worksheet
Dim iRng As Range
Dim arrDay()
On Error Resume Next
Set iWb = Application.Caller.Parent.Parent
ReDim arrDay(1 To iWb.Worksheets.Count)
For Each iSh In iWb.Worksheets
If IsDate(CDate(iSh.Name)) Then
If Err = 0 Then
I = I + 1
arrDay(I) = CDbl(CDate(iSh.Name))
End If
Err = 0
End If
Next
ReDim Preserve arrDay(1 To I)
For I = 1 To UBound(arrDay)
Set iSh = iWb.Worksheets(Format(CDate(Application.WorksheetFunction.Large(arrDay, I)), "dd.mm.yy"))
Set iRng = Intersect(iSh.UsedRange, iSh.Range(sRng))
ВПРМН = Application.WorksheetFunction.VLookup(iVal, iRng, iClmn, 0)
If Not IsEmpty(ВПРМН) Then Exit Function
Next
If IsEmpty(ВПРМН) Then ВПРМН = CVErr(xlErrNA)
End Function
Офф. Судя по коду региона Вы из Хабаровского края?
Тогда в коде нужнА изменить все Про файл-пример в Правилах написано Приложите файл-пример максимально приближенный к 'боевому', что бы 100 раз не переписывать
Наверное это можно как-то формулами обыграть, но при добавлении листов ('день 3'...'день N') формулу придется подстраивать Я бы использовал UDF
Скрытый текст
Код
Function ВПРМН(iVal, sRng$, iClmn)
'iVal - искомое значение
'sRng$ - адрес диапазона для поиска значения, текст вида "C:F".
' Поиск осуществляется в первом столбце, так же как и в ВПР()
'iClmn - номер столбца из которого возвращается значение
'Всегда ищется точное совпадение
Dim iWb As Workbook
Dim iSh As Worksheet
Dim iRng As Range
Dim arrDay()
On Error Resume Next
Set iWb = Application.Caller.Parent.Parent
ReDim arrDay(1 To iWb.Worksheets.Count)
For Each iSh In iWb.Worksheets
If iSh.Name Like "день*" Then
I = I + 1
arrDay(I) = Val(Split(iSh.Name, " ")(1))
End If
Next
ReDim Preserve arrDay(1 To I)
For I = 1 To UBound(arrDay)
For Each iSh In iWb.Worksheets
If iSh.Name Like "день*" & Application.WorksheetFunction.Large(arrDay, I) Then
Set iRng = Intersect(iSh.UsedRange, iSh.Range(sRng))
ВПРМН = Application.WorksheetFunction.VLookup(iVal, iRng, iClmn, 0)
If Not IsEmpty(ВПРМН) Then Exit Function
End If
Next
Next
If IsEmpty(ВПРМН) Then ВПРМН = CVErr(xlErrNA)
End Function
Ограничения функции: Имя листа с ежедневными данными должно начинаться на слово 'день' и перед номером дня должен быть пробел
Согласие есть продукт при полном непротивлении сторон
solutio написал: так чтобы макрос работал только на одном конкретном листе и для двух диапазонов?
В модуль нужного листа. Для диапазонов 'A1:A10' и 'C1:C10'
Код
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, Range("A1:A10", "C1:C10")) Is Nothing And Target.Count = 1 Then
Application.ScreenUpdating = False
Application.EnableEvents = False
If Target <> "" Then Target.Offset(, 1) = Date
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Согласие есть продукт при полном непротивлении сторон
Это не фриланс-площадка, здесь никто никому ничем не обязан. Может сформулировали не правильно, или задача не очень интересна. Да и вообще - конец недели, выходные. Решили и хорошо. А еще лучше - решение тут выложить. Для тех, у кого будет схожая проблема
Самому вообще не вариант было придумать такое? Ну приложите хоть немного усилий. В следующий раз Тема с таким названием будет просто закрыта без предупреждения.
Согласие есть продукт при полном непротивлении сторон
Ну так себе название.. Проблема в том, что у Вас не Даты, а Текст. Что в таблице, что в выпадающих списках Так как Дата в Excel это то же число, то Преобразование чисел-как-текст в нормальные числа
Согласие есть продукт при полном непротивлении сторон
Фильтрация таблицы по части текса из ячейки, Фильтрация таблицы по части текса из ячейки, который сравнивается с ячейкой полученной из выпадающего списка
Если нечаянно ошибочно выбрала из выпадающего меню не тот список, то удалить его просто не получается
И все таки это НЕ фильтрация. Создайте отдельную тему с соответствующим названием. П.С. Обращаясь в сообщении только ко мне, вы очень сильно сужаете круг потенциальных помощников)
На коллекции. Не являюсь счастливым обладателем MAC, поэтому проверить нет возможности
Collection
Код
Sub Разделить_столбец_по_книгам_MAC()
Const column = 7 'номер столбца, по которому будет происходить разделение.'
Const head = True
Dim iCol As New Collection
Dim I&, iKey, iTmp
Set wbAct = ActiveWorkbook
lr = Cells(Rows.Count, 1).End(xlUp).Row
lc = Cells(1, Columns.Count).End(xlToLeft).column
arr = Range("A1", Cells(lr, lc)).Value
If head Then fr = 2 Else fr = 1
For I = fr To UBound(arr)
If Application.Trim(arr(I, column)) <> "" Then
iKey = Application.Trim(arr(I, column))
If KeyExists(iKey, iCol) Then
iTmp(1) = iCol.Item(iKey)(1) & "|" & I: iTmp(2) = iKey
iCol.Remove (iKey)
Else
ReDim iTmp(1 To 2)
iTmp(1) = I: iTmp(2) = iKey
End If
iCol.Add iTmp, iKey
End If
Next
'Result - название папки с результатами'
iPath = wbAct.Path & Application.PathSeparator & "Result" & Application.PathSeparator
If Dir(iPath, vbDirectory) = "" Then MkDir iPath
Set Rng = Nothing
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For I = 1 To iCol.Count
rrs = Split(iCol.Item(I)(1), "|")
If head Then Set Rng = Rows(1)
For Each rr In rrs
If Not Rng Is Nothing Then Set Rng = Union(Rows(rr), Rng) Else Set Rng = Rows(rr)
Next
Set wb = Workbooks.Add(1)
Set sh = wb.Sheets(1)
Rng.Copy
With sh.[A1]
.PasteSpecial xlPasteColumnWidths
.PasteSpecial xlPasteAll
.Select
End With
Set Rng = Nothing
wb.SaveAs iPath & Replace_symbols(iCol(I)(2)) & ".xlsx", xlOpenXMLWorkbook
wb.Close False
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
'Замена запрещённых символов в имени файла или папки'
Private Function Replace_symbols(ByVal txt As String) As String
St$ = "\\/~!@#$%^&*=|`'"""
For I% = 1 To Len(St$)
txt = Replace(txt, Mid(St$, I, 1), "_")
Next
Replace_symbols = txt
End Function
'Проверка наличия ключа в коллекции
Private Function KeyExists(ByVal key$, ByRef container As Collection) As Boolean
On Error Resume Next
Dim temp As Variant
temp = container.Item(key)
KeyExists = IIf(IsEmpty(temp), False, True)
On Error GoTo 0
End Function
Согласие есть продукт при полном непротивлении сторон
В VBA нет встроенного класса Dictionary для Mac. Класс Dictionary — член библиотеки Microsoft Scripting Runtime, и для его использования на Mac требуется установить ссылку на эту библиотеку в редакторе Visual Basic.
Однако есть альтернатива — класс VBA-Dictionary. Он заменяет Scripting.Dictionary и работает как на Windows, так и на Mac. Чтобы использовать класс, нужно скачать его, распаковать и импортировать файл Dictionary.cls в проект VBA.
1. Это форум по Excel, а не по фотошоп. По картинкам тут редко лечат. В Правилах про файл-пример написано 2. Ответить на сообщение можно и без цитирования. Исправьте Ваше сообщение #3
Согласие есть продукт при полном непротивлении сторон
Вывод значения в ячейку при подстановке определенной даты, Если ячейка пустая, то значения в другой ячейке быть не должно, но и при заполненной ячейке и при пустой все равно отображается
Ничего не меняя в Вашем файле ввел в ячейку A1 дату 15.10.2025. Все сработало как и задумано - буква Ф пропала В чем подвох? Лучше напишите какую логику Вы хотите реализовать этими двумя формулами?
Согласие есть продукт при полном непротивлении сторон
Будко Максим написал: Нужно, чтобы при добавлении на 1 листе новой номенклатуры и включении сортировки по алфавиту на других листах так же срабатывала сортировка и количество выданного соответственно.
А новую номенклатуру нужно в какой-то лист месяца добавлять? Какого числа она выдана?
Согласие есть продукт при полном непротивлении сторон