Добрый день! У меня есть три таблицы На листе 1 в таблице внесена информация о движении МЦ Мне нужно, что бы таблицу на листе 3 попадали в столбцец "Наименование" попадали материальные ценности из таблицы "Главная" с листа1, у которых сумма в столбцах Остаток на складе, Приход, Расход, Остатокбыла больше нуля. При это порядок отображения должен быть следующий: У каждого наименования есть группа. Которая отражена в таблице "Наименования" на листе 2 А рядом на листе 2 есть таблица "группы". Так вот первыми на лист3 должны попадать наименования из группы спирт (так как спирт находится первым в таблице "группы"), вторыми - расходники и так далее. Для данного случая таблица должна принять вид так как она отображена сейчас.
Добрый день! У меня есть три таблицы На листе 1 в таблице внесена информация о движении МЦ Мне нужно, что бы таблицу на листе 3 попадали в столбцец "Наименование" попадали материальные ценности из таблицы "Главная" с листа1, у которых сумма в столбцах Остаток на складе, Приход, Расход, Остатокбыла больше нуля. При это порядок отображения должен быть следующий: У каждого наименования есть группа. Которая отражена в таблице "Наименования" на листе 2 А рядом на листе 2 есть таблица "группы". Так вот первыми на лист3 должны попадать наименования из группы спирт (так как спирт находится первым в таблице "группы"), вторыми - расходники и так далее. Для данного случая таблица должна принять вид так как она отображена сейчас.AVI
Почему-то не могу редактировать свое сообщение. Хочу переформулировать вопрос: Возможно ли макросами заставить фильтровать таблицу со своему условию. В примере: есть таблица с данными. Нужно, что бы в результат отфильтровалось по столбцу группа так, как указана очередность в таблице фильтр.
Почему-то не могу редактировать свое сообщение. Хочу переформулировать вопрос: Возможно ли макросами заставить фильтровать таблицу со своему условию. В примере: есть таблица с данными. Нужно, что бы в результат отфильтровалось по столбцу группа так, как указана очередность в таблице фильтр.AVI
Почему-то не могу редактировать свое сообщение. Хочу переформулировать вопрос:
Сутки прошли - редактировать нельзя
Нет уж, поздно, я все уже написал
[vba]
Код
Sub tt() ar1 = Sheets("Лист2").Range("Наименования") 'таблицу Наименования - в массив Set slov1 = CreateObject("Scripting.Dictionary") 'это словарь1 With slov1 'для него For j = 1 To UBound(ar1) 'цикл по массиву .Item(ar1(j, 2)) = ar1(j, 1) 'ключи = наименования, элементы = группы Next j End With ar2 = Sheets("Лист2").Range("Группы") 'таблицу Группы - в массив Set slov2 = CreateObject("Scripting.Dictionary") 'это словарь2 With slov2 For j = 1 To UBound(ar2) ' .Item(ar2(j, 1)) = j 'ключи = группы, элементы = счёт по порядку Next j End With ar0 = Sheets("Лист1").Range("Главная[[Наименование]:[Остаток]]") 'таблицу Главная (столбцы от Наименование до Остаток) - в массив ReDim arit(1 To UBound(ar0), 1 To 3) 'пустой массив 3 столбца и столько строк, сколько в ar0 Set slov0 = CreateObject("Scripting.Dictionary") 'это словарь 0 With slov0 ' For i = 1 To UBound(ar0) 'цикл по массиву If Not .exists(ar0(i, 1)) Then 'если в словаре slov0 еще нет ключа ar0(i,1) то For k = 9 To 12 'цикл по столбцам 9-12 If ar0(i, k) > 0 Then 'если там значение >0, то aaaa = .Item(ar0(i, 1)) 'суем наименование в slov0 n_ = n_ + 1 'увеличиваем счетчик на 1 arit(n_, 3) = ar0(i, 1) 'в массиве arit третий столбец - наименование arit(n_, 2) = slov1.Item(ar0(i, 1)) 'второй столбец - группа из slov1 arit(n_, 1) = slov2.Item(arit(n_, 2)) 'первый - порядковый номер группы изи slov2 Exit For 'если что-то нашли в If-е, то дальше проверять смысла нет, выход из цикла End If Next k End If Next i End With Application.ScreenUpdating = 0 'откл обновления экрана Application.Calculation = xlCalculationManual 'и пересчета формул With Sheets("Лист3") 'для листа 3 r0_ = 3 'первая строка r1_ = .Cells(.Rows.Count, 2).End(3).Row 'последняя заполненная строка в столбце 2 If r1_ >= r0_ Then 'если r1>=r0, то .Cells(r0_, 1).Resize(r1_ - r0_ + 1, 3).ClearContents 'стираем первые 3 столбца со строки r0 и вниз End If .Range("A3").Resize(n_, 3) = arit 'вставляем туда полученный массив arit .Sort.SortFields.Clear 'дальше сортировка .Sort.SortFields.Add Key:=Range("A" & r0_).Resize(n_) 'сначала по столбу А .Sort.SortFields.Add Key:=Range("C" & r0_).Resize(n_) 'затем по столбцу С .Sort.SetRange Range("A" & r0_).Resize(n_, 3) .Sort.Apply .Columns(1).Clear 'стираем столбец А .Select 'выделяем лист Application.Goto Reference:=.Range("A1"), scroll:=True 'перепрыгиваем на ячейку А1 End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 End Sub
[/vba]
А фильтрация по своему условию - 1. совсем другой вопрос 2. есть в поиске, я совершенно точно помню, что писал здесь про это. Да и не только я Например http://www.excelworld.ru/forum/10-35469-1#237659
Почему-то не могу редактировать свое сообщение. Хочу переформулировать вопрос:
Сутки прошли - редактировать нельзя
Нет уж, поздно, я все уже написал
[vba]
Код
Sub tt() ar1 = Sheets("Лист2").Range("Наименования") 'таблицу Наименования - в массив Set slov1 = CreateObject("Scripting.Dictionary") 'это словарь1 With slov1 'для него For j = 1 To UBound(ar1) 'цикл по массиву .Item(ar1(j, 2)) = ar1(j, 1) 'ключи = наименования, элементы = группы Next j End With ar2 = Sheets("Лист2").Range("Группы") 'таблицу Группы - в массив Set slov2 = CreateObject("Scripting.Dictionary") 'это словарь2 With slov2 For j = 1 To UBound(ar2) ' .Item(ar2(j, 1)) = j 'ключи = группы, элементы = счёт по порядку Next j End With ar0 = Sheets("Лист1").Range("Главная[[Наименование]:[Остаток]]") 'таблицу Главная (столбцы от Наименование до Остаток) - в массив ReDim arit(1 To UBound(ar0), 1 To 3) 'пустой массив 3 столбца и столько строк, сколько в ar0 Set slov0 = CreateObject("Scripting.Dictionary") 'это словарь 0 With slov0 ' For i = 1 To UBound(ar0) 'цикл по массиву If Not .exists(ar0(i, 1)) Then 'если в словаре slov0 еще нет ключа ar0(i,1) то For k = 9 To 12 'цикл по столбцам 9-12 If ar0(i, k) > 0 Then 'если там значение >0, то aaaa = .Item(ar0(i, 1)) 'суем наименование в slov0 n_ = n_ + 1 'увеличиваем счетчик на 1 arit(n_, 3) = ar0(i, 1) 'в массиве arit третий столбец - наименование arit(n_, 2) = slov1.Item(ar0(i, 1)) 'второй столбец - группа из slov1 arit(n_, 1) = slov2.Item(arit(n_, 2)) 'первый - порядковый номер группы изи slov2 Exit For 'если что-то нашли в If-е, то дальше проверять смысла нет, выход из цикла End If Next k End If Next i End With Application.ScreenUpdating = 0 'откл обновления экрана Application.Calculation = xlCalculationManual 'и пересчета формул With Sheets("Лист3") 'для листа 3 r0_ = 3 'первая строка r1_ = .Cells(.Rows.Count, 2).End(3).Row 'последняя заполненная строка в столбце 2 If r1_ >= r0_ Then 'если r1>=r0, то .Cells(r0_, 1).Resize(r1_ - r0_ + 1, 3).ClearContents 'стираем первые 3 столбца со строки r0 и вниз End If .Range("A3").Resize(n_, 3) = arit 'вставляем туда полученный массив arit .Sort.SortFields.Clear 'дальше сортировка .Sort.SortFields.Add Key:=Range("A" & r0_).Resize(n_) 'сначала по столбу А .Sort.SortFields.Add Key:=Range("C" & r0_).Resize(n_) 'затем по столбцу С .Sort.SetRange Range("A" & r0_).Resize(n_, 3) .Sort.Apply .Columns(1).Clear 'стираем столбец А .Select 'выделяем лист Application.Goto Reference:=.Range("A1"), scroll:=True 'перепрыгиваем на ячейку А1 End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 End Sub
_Boroda_, Два дня пытался сам подправить но так и не смог.
В файле-примере на третьей странице есть две даты: начало и конец периода.
То есть само задание должно было звучать так "Мне нужно, что бы таблицу на листе 3 попадали в столбец "Наименование" попадали материальные ценности из таблицы "Главная" с листа1, у которых сумма в столбцах Остаток на складе В УКАЗАННОМ ПЕРИОДЕ, Приход, Расход, Остаток была больше нуля."
Я попытался сам (закомментированные строки), но наглухо запутался в столбцах..
[vba]
Код
Sub tt() ar1 = Sheets("Лист2").Range("Наименования") 'таблицу Наименования - в массив Set slov1 = CreateObject("Scripting.Dictionary") 'это словарь1 With slov1 'для него For j = 1 To UBound(ar1) 'цикл по массиву .Item(ar1(j, 2)) = ar1(j, 1) 'ключи = наименования, элементы = группы Next j End With ar2 = Sheets("Лист2").Range("Группы") 'таблицу Группы - в массив Set slov2 = CreateObject("Scripting.Dictionary") 'это словарь2 With slov2 For j = 1 To UBound(ar2) ' .Item(ar2(j, 1)) = j 'ключи = группы, элементы = счёт по порядку Next j End With ' ar0 = Sheets("Лист1").Range("Главная[[Дата]:[Остаток]]") 'таблицу Главная (столбцы от Наименование до Остаток) - в массив ar0 = Sheets("Лист1").Range("Главная[[Наименование]:[Остаток]]") 'таблицу Главная (столбцы от Наименование до Остаток) - в массив ReDim arit(1 To UBound(ar0), 1 To 3) 'пустой массив 3 столбца и столько строк, сколько в ar0 Set slov0 = CreateObject("Scripting.Dictionary") 'это словарь 0 With slov0 ' For i = 1 To UBound(ar0) 'цикл по массиву If Not .exists(ar0(i, 1)) Then 'если в словаре slov0 еще нет ключа ar0(i,1) то ' If Not .exists(ar0(i, 2)) Then 'если в словаре slov0 еще нет ключа ar0(i,1) то For k = 9 To 12 'цикл по столбцам 9-12 ' If ar0(i, 1) >= Sheets("Лист3").Range("F1") And ar0(i, 1) <= Sheets("Лист3").Range("F2") Then If ar0(i, k) > 0 Then 'если там значение >0, то aaaa = .Item(ar0(i, 1)) 'суем наименование в slov0 n_ = n_ + 1 'увеличиваем счетчик на 1 arit(n_, 3) = ar0(i, 1) 'в массиве arit третий столбец - наименование arit(n_, 2) = slov1.Item(ar0(i, 1)) 'второй столбец - группа из slov1 arit(n_, 1) = slov2.Item(arit(n_, 2)) 'первый - порядковый номер группы изи slov2 Exit For 'если что-то нашли в If-е, то дальше проверять смысла нет, выход из цикла End If ' End If Next k End If Next i End With Application.ScreenUpdating = 0 'откл обновления экрана Application.Calculation = xlCalculationManual 'и пересчета формул With Sheets("Лист3") 'для листа 3 r0_ = 3 'первая строка r1_ = .Cells(.Rows.Count, 2).End(3).Row 'последняя заполненная строка в столбце 2 If r1_ >= r0_ Then 'если r1>=r0, то .Cells(r0_, 1).Resize(r1_ - r0_ + 1, 3).ClearContents 'стираем первые 3 столбца со строки r0 и вниз End If .Range("A3").Resize(n_, 3) = arit 'вставляем туда полученный массив arit .Sort.SortFields.Clear 'дальше сортировка .Sort.SortFields.Add Key:=Range("A" & r0_).Resize(n_) 'сначала по столбу А .Sort.SortFields.Add Key:=Range("C" & r0_).Resize(n_) 'затем по столбцу С .Sort.SetRange Range("A" & r0_).Resize(n_, 3) .Sort.Apply .Columns(1).Clear 'стираем столбец А .Select 'выделяем лист Application.Goto Reference:=.Range("A1"), scroll:=True 'перепрыгиваем на ячейку А1 End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 End Sub
[/vba]
Помогите, пожалуйста.
_Boroda_, Два дня пытался сам подправить но так и не смог.
В файле-примере на третьей странице есть две даты: начало и конец периода.
То есть само задание должно было звучать так "Мне нужно, что бы таблицу на листе 3 попадали в столбец "Наименование" попадали материальные ценности из таблицы "Главная" с листа1, у которых сумма в столбцах Остаток на складе В УКАЗАННОМ ПЕРИОДЕ, Приход, Расход, Остаток была больше нуля."
Я попытался сам (закомментированные строки), но наглухо запутался в столбцах..
[vba]
Код
Sub tt() ar1 = Sheets("Лист2").Range("Наименования") 'таблицу Наименования - в массив Set slov1 = CreateObject("Scripting.Dictionary") 'это словарь1 With slov1 'для него For j = 1 To UBound(ar1) 'цикл по массиву .Item(ar1(j, 2)) = ar1(j, 1) 'ключи = наименования, элементы = группы Next j End With ar2 = Sheets("Лист2").Range("Группы") 'таблицу Группы - в массив Set slov2 = CreateObject("Scripting.Dictionary") 'это словарь2 With slov2 For j = 1 To UBound(ar2) ' .Item(ar2(j, 1)) = j 'ключи = группы, элементы = счёт по порядку Next j End With ' ar0 = Sheets("Лист1").Range("Главная[[Дата]:[Остаток]]") 'таблицу Главная (столбцы от Наименование до Остаток) - в массив ar0 = Sheets("Лист1").Range("Главная[[Наименование]:[Остаток]]") 'таблицу Главная (столбцы от Наименование до Остаток) - в массив ReDim arit(1 To UBound(ar0), 1 To 3) 'пустой массив 3 столбца и столько строк, сколько в ar0 Set slov0 = CreateObject("Scripting.Dictionary") 'это словарь 0 With slov0 ' For i = 1 To UBound(ar0) 'цикл по массиву If Not .exists(ar0(i, 1)) Then 'если в словаре slov0 еще нет ключа ar0(i,1) то ' If Not .exists(ar0(i, 2)) Then 'если в словаре slov0 еще нет ключа ar0(i,1) то For k = 9 To 12 'цикл по столбцам 9-12 ' If ar0(i, 1) >= Sheets("Лист3").Range("F1") And ar0(i, 1) <= Sheets("Лист3").Range("F2") Then If ar0(i, k) > 0 Then 'если там значение >0, то aaaa = .Item(ar0(i, 1)) 'суем наименование в slov0 n_ = n_ + 1 'увеличиваем счетчик на 1 arit(n_, 3) = ar0(i, 1) 'в массиве arit третий столбец - наименование arit(n_, 2) = slov1.Item(ar0(i, 1)) 'второй столбец - группа из slov1 arit(n_, 1) = slov2.Item(arit(n_, 2)) 'первый - порядковый номер группы изи slov2 Exit For 'если что-то нашли в If-е, то дальше проверять смысла нет, выход из цикла End If ' End If Next k End If Next i End With Application.ScreenUpdating = 0 'откл обновления экрана Application.Calculation = xlCalculationManual 'и пересчета формул With Sheets("Лист3") 'для листа 3 r0_ = 3 'первая строка r1_ = .Cells(.Rows.Count, 2).End(3).Row 'последняя заполненная строка в столбце 2 If r1_ >= r0_ Then 'если r1>=r0, то .Cells(r0_, 1).Resize(r1_ - r0_ + 1, 3).ClearContents 'стираем первые 3 столбца со строки r0 и вниз End If .Range("A3").Resize(n_, 3) = arit 'вставляем туда полученный массив arit .Sort.SortFields.Clear 'дальше сортировка .Sort.SortFields.Add Key:=Range("A" & r0_).Resize(n_) 'сначала по столбу А .Sort.SortFields.Add Key:=Range("C" & r0_).Resize(n_) 'затем по столбцу С .Sort.SetRange Range("A" & r0_).Resize(n_, 3) .Sort.Apply .Columns(1).Clear 'стираем столбец А .Select 'выделяем лист Application.Goto Reference:=.Range("A1"), scroll:=True 'перепрыгиваем на ячейку А1 End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 End Sub
Ловите. Проверьте только, что-то у меня по количеству не сходится, но, возможно, я просто не очень правильно посчитал, не соображается сегодня, голова болит
Ловите. Проверьте только, что-то у меня по количеству не сходится, но, возможно, я просто не очень правильно посчитал, не соображается сегодня, голова болит_Boroda_