Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 12.04.2015
Сообщений: 53
Excel

Распределение строк по условию (Дате)

19.11.2018, 04:59. Показов 3449. Ответов 14

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем читающим этот текст Да я знаю что подобных топиков очень много уже,и никому не будет в новинку. Пытался сделать распределение строк по образцу,но что-то пошло не так.
Нужно чтобы от даты в ячейке B2 в таблице owssvr по столбцу G переносило строки по датам: все даты ранее во вкладку "Не выполнено";"Со сроком месяц" все даты от текущей до конца месяца;"Со сроком месяц+1" если дата в следующем от даты месяце
При старте макроса ругается на место "with owssvr" (Variable not defined). Прошу указать где зарыта соответствующая собака Также вопрос: если мне нужны только значения "Не выполнено" по столбцу J,можно ли использовать фильтры?иными словами,переносит ли макрос скрытые строки. Использовал подобный код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Option Explicit         ' Обязательное объявление переменных
Option Compare Text     ' отсутствие чувствительности к регистру при сравнении символов
 
Sub Перенос_ячеек()
    Const FirstRow& = 2 ' Константа - первая строка данных ниже шапки на всех листах
    Dim i&, j&, LastRow&, LastRowTarget&, ShName, Sh_Target As Worksheet, Prefix$, FormulaRC$, A
    Application.ScreenUpdating = False ' Временное отключение обновления экрана в Excel
    For Each ShName In Array("Не выполнено РУТН", "РУТН со сроком месяц", "РУТН со сроком месяц+1") ' Цикл по 3 листам с результатами для очистки старых данных
        With Sheets(ShName) ' Работа с объектом Sheet через символ "."
            LastRowTarget = .Cells(.Rows.Count, "A").End(xlUp).Row ' Определение последней заполненной строки по столбцу A
            If LastRowTarget < FirstRow Then LastRowTarget = FirstRow  ' последняя заполненная строка не должна быть меньше FirstRow  (=2)
            .Rows(FirstRow & ":" & LastRowTarget).Clear    ' Удаление строк со старыми данными при новом распределении
        End With
    Next ShName
    With owssvr ' Работа с объектом owssvr (программное имя объекта) через символ "."
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row  ' Определение последней заполненной строки по столбцу A
        A = .Range(.Cells(1, 1), .Cells(LastRow, 10)).Value ' Формируем массив для проверки условий
        For i = FirstRow To LastRow ' Цикл по строкам анализируемого листа
            If A(i, 7) <= Sheets("Формулы").Range("D5") And A(i, 7) >= Sheets("Формулы").Range("E7") Then ' Комплекс условий 1
                Set Sh_Target = "Не выполнено" ' Объектная ссылка на лист цель.
          ElseIf A(i, 7) >= Sheets("Формулы").Range("D5") And A(i, 7) <= Sheets("Формулы").Range("D2") Then ' Комплекс условий 2
                Set Sh_Target = "со сроком месяц" ' Объектная ссылка на лист цель."
          ElseIf A(i, 7) >= Sheets("Формулы").Range("E2") And A(i, 7) <= Sheets("Формулы").Range("F2") Then ' Комплекс условий 3
                Set Sh_Target = "со сроком месяц+1" ' Объектная ссылка на лист цель.
            End If
            .Range(.Cells(i, 1), .Cells(i, "J")).Copy  ' копирование  i-той строки (по J,для последующей вставки форматов)
            With Sh_Target '  Работа с объектом листом-целью, куда копируем форматы, через символ "."
                 LastRowTarget = .Cells(.Rows.Count, "Z").End(xlUp).Row + 1 ' Определение последней пустой строки по столбцу Z
                 If LastRowTarget < FirstRow Then LastRowTarget = FirstRow
                .Cells(LastRowTarget, 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' вставка скопированных форматов
                .Rows(LastRowTarget).RowHeight = Лист1.Rows(i).RowHeight ' Выравнивание высоты строки по исходной
                .Range(.Cells(LastRowTarget, 1), .Cells(LastRowTarget, "AU")).FormulaR1C1 = FormulaRC  ' заполнение целевого диапазона ссылочными формулами
            End With
        Next i
    End With
    Set Sh_Target = Nothing ' Очистка памяти от объектных ссылок
End Sub
Вложения
Тип файла: xlsx Пример.xlsx (25.0 Кб, 8 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2018, 04:59
Ответы с готовыми решениями:

Распределение файлов по условию
Всех приветствую. Необходима помощь в следующем вопросе: Есть сетевой ресурс, на который несколько раз в день выкладываются базы...

Распределение величин по условию
Коллеги, снова обращаюсь к Вашему знанию. нужна помощь. возможно ли без макросов &quot;автоматизировать&quot; заполнение таблицы? ...

Распределение файлов по папкам согласно заданному условию
Здравствуйте. Ребята, помогите пожалуйста, весь мозг сломал себе. Имеется папка, к примеру, test думаю путь не столь важен, так как...

14
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
19.11.2018, 06:12
owssvr - это объект
в предоставленном коде нет НИ описания этой переменной Ни действий связанных с присвоением этой переменной объекта
возможно это где-то есть но пока не видно

Добавлено через 5 минут
оказывается owssvr это имя листа

Добавлено через 3 минуты
ну-с начнем рубить правду -матку

строка 15
вероятнее всего будет так
With owssvr -> With Worksheets("owssvr")
Строки 20 22 24
идет присвоение объектной переменной а присваивается текст
на примере 20 строки
Set Sh_Target = "Не выполнено" -> Set Sh_Target = Worksheets("Не выполнено")

Добавлено через 2 минуты
к 31 строке тоже вопросы
.Rows(LastRowTarget).RowHeight = Лист1.Rows(i).RowHeight
вот это лист1 ни в какие ворота не лезет
может так правильно
.Rows(LastRowTarget).RowHeight = Sheets("Лист1").Rows(i).RowHeight
однако я не нашел у вас листа с названием Лист1

Добавлено через 15 минут
кстати
вместо .FormulaR1C1
я обычно пользуюсь .FormulaLocal
в этом случае текст будет более привычный
например
Range("D2").FormulaLocal = "=b2+c2"
0
0 / 0 / 0
Регистрация: 12.04.2015
Сообщений: 53
19.11.2018, 06:24  [ТС]
Поправил все ошибки,Лист1 заменил на owssvr,забыл исправить (31 строка)
Теперь выдаёт error 9 (subscript out of range),возможно в строке
For Each ShName In Array("Не выполнено РУТН", "РУТН со сроком месяц", "РУТН со сроком месяц+1")
ошибка?тоже добавить Sheets

Заменил на FormulaLocal
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
19.11.2018, 06:34
нет

Добавлено через 4 минуты
ошибка потому что листа такого нет
вываливается в строке
With Sheets(ShName)
в примере нет листа с названием - Не выполнено РУТН
0
0 / 0 / 0
Регистрация: 12.04.2015
Сообщений: 53
19.11.2018, 06:42  [ТС]
Попробовал заменить имена таблица на "1","2","3"
Начал что-то выполнять,в экселе видно как курсор перемещается между таблицами,но строки не заполняются,может протупит ещё

Добавлено через 2 минуты
Заменил названия листов на стандартные "1","2","3"
вроде начал что-то выполнять,из-за тормозов нихрена не понять что делает,по итогу отпишу что насчитал
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
19.11.2018, 06:43
надо код весь просматривать
0
0 / 0 / 0
Регистрация: 12.04.2015
Сообщений: 53
19.11.2018, 06:57  [ТС]
Курсор просто бегает между листами,копирование не ведется(

Добавлено через 1 минуту
на 29 строке if не закрыт end if, это нормально?
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
19.11.2018, 07:22
в данном случае нормально т.к конструкция If прописана в одну строку
0
0 / 0 / 0
Регистрация: 12.04.2015
Сообщений: 53
19.11.2018, 07:24  [ТС]
Пока что остановился на таком варианте кода
Бегает между листами но копировать не хочет

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Option Explicit         ' Обязательное объявление переменных
Option Compare Text     ' отсутствие чувствительности к регистру при сравнении символов
 
Sub Распределение()
    Const FirstRow& = 2 ' Константа - первая строка данных ниже шапки на всех листах
    Dim i&, j&, LastRow&, LastRowTarget&, ShName, Sh_Target As Worksheet, Prefix$, FormulaRC$, A
    For Each ShName In Array("1", "2", "3") ' Цикл по 3 листам с результатами для очистки старых данных
        With Sheets(ShName) ' Работа с объектом Sheet через символ "."
            LastRowTarget = .Cells(.Rows.Count, "A").End(xlUp).Row ' Определение последней заполненной строки по столбцу A
            If LastRowTarget < FirstRow Then LastRowTarget = FirstRow  ' последняя заполненная строка не должна быть меньше FirstRow  (=2)
            .Rows(FirstRow & ":" & LastRowTarget).Clear    ' Удаление строк со старыми данными при новом распределении
        End With
    Next ShName
    With Worksheets("owssvr") ' Работа с объектом owssvr (программное имя объекта) через символ "."
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row  ' Определение последней заполненной строки по столбцу A
        A = .Range(.Cells(1, 1), .Cells(LastRow, 10)).Value ' Формируем массив для проверки условий
        For i = FirstRow To LastRow ' Цикл по строкам анализируемого листа
            If A(i, 7) <= Sheets("Формулы").Range("D5") And A(i, 7) >= Sheets("Формулы").Range("E7") Then ' Комплекс условий 1
                Set Sh_Target = Worksheets("1") ' Объектная ссылка на лист цель.
            ElseIf A(i, 7) >= Sheets("Формулы").Range("D5") And A(i, 7) <= Sheets("Формулы").Range("D2") Then ' Комплекс условий 2
                Set Sh_Target = Worksheets("2") ' Объектная ссылка на лист цель."
            ElseIf A(i, 7) >= Sheets("Формулы").Range("E2") And A(i, 7) <= Sheets("Формулы").Range("F2") Then ' Комплекс условий 3
                Set Sh_Target = Worksheets("3") ' Объектная ссылка на лист цель.
            End If
            .Range(.Cells(i, "A"), .Cells(i, "J")).Copy  ' копирование  i-той строки (по J,для последующей вставки форматов)
            With Sh_Target '  Работа с объектом листом-целью, куда копируем форматы, через символ "."
                 LastRowTarget = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 ' Определение последней пустой строки по столбцу A
                 If LastRowTarget < FirstRow Then LastRowTarget = FirstRow
                .Cells(LastRowTarget, 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' вставка скопированных форматов
                .Rows(LastRowTarget).RowHeight = Sheets("owssvr").Rows(i).RowHeight ' Выравнивание высоты строки по исходной
            End With
        Next i
    End With
    Set Sh_Target = Nothing ' Очистка памяти от объектных ссылок
End Sub
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
19.11.2018, 07:26
Лучший ответ Сообщение было отмечено Andrey_konoval как решение

Решение

не копируется потому что вы вставляете из буфера не данные а формат ячеек

далее нет проверки на то что переменная Sh_Target пустая
т.е. Nothing - тут тоже ошибка

еще в на листе определяете последнюю заполненную строку по столбцу Z - заранее пустому столбцу
там тоже косяк вылазит

пока что у меня получилось вот так
Вложения
Тип файла: 7z Пример (4).7z (35.4 Кб, 14 просмотров)
1
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
19.11.2018, 07:40
в строке 17
If A(i, 7) <= Sheets("Формулы").Range("D5") And A(i, 7) >= Sheets("Формулы").Range("E7") Then
согласно присланного примера ячейка Е7 на листе Формулы пустая
я не знаю - так должно быть или так не должно быть

в моем варианте там стоит E2 - обратите внимание
0
0 / 0 / 0
Регистрация: 12.04.2015
Сообщений: 53
19.11.2018, 07:45  [ТС]
Косякнул с условиями выбора дат,переправил вроде как всё работает! А ошибка с Nothing может на что-нибудь повлиять?
Остался вопрос с фильтрами: если к примеру мне надо распределять значения по столбцу "Выполнено",единственный вариант это отфильтровать, вставить на другой лист только значения и уже потом выполнять макрос с распределением?

Добавлено через 35 секунд
Да,с датами сугубо мой косяк,поправил,всё работает
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
19.11.2018, 07:48
можно на разные листы раскидать просрочено и выполнено и просрочено и не выполнено
прописать дополнительные условия и все
0
0 / 0 / 0
Регистрация: 12.04.2015
Сообщений: 53
19.11.2018, 07:54  [ТС]
А можно прописать дополнительные условие в IF,однако тогда наверное он считать будет гораздо дольше
В любом случае огромное спасибо тебе,как всегда на высоте
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,671
19.11.2018, 08:09
Цитата Сообщение от Andrey_konoval Посмотреть сообщение
А можно прописать дополнительные условие в IF
почему нет-то
if [условие1] and [условие2] and [условие3] and [условие4] Then
в данном случае общее условие станет истинным если все 4 условия будут истинными

Добавлено через 3 минуты
можно сделать так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
if [условие1] and [условие2] Then' первая группа условий
   if [условие3] and [условие4] Then' если первая группа условий истинна то вторая группа условий
      'если первая и вторая группы условий истинны то набор операторов
 
   else 
      'если первая группа истинна, а вторая группа ложна то набор операторов
 
  end if
else
'если первая группа ложна то набор операторов
end if
Добавлено через 6 минут
Цитата Сообщение от Andrey_konoval Посмотреть сообщение
А ошибка с Nothing может на что-нибудь повлиять?
конечно может
если строчка не отвечает какому-либо условию
то объектной переменной не будет присвоено значение
и эта переменная останется в состоянии Nothing
возникнет ошибка
кстати ее еще и обнулять надо т.е. принудительно загонять в состояние Nothing
т.е. концовку надо сделать так
Visual Basic
1
2
3
4
5
6
7
            End With
            End If
            Set Sh_Target = Nothing
        Next i
    End With
    Set Sh_Target = Nothing ' Очистка памяти от объектных ссылок
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2018, 08:09
Помогаю со студенческими работами здесь

Распределение одинаковых символов случайным способом по условию
Помогите пожалуйста, есть необходимость распределить по случайным ячейкам таблицы символ “x”. Если есть возможность помочь, я скину...

Суммеслимн по дате и второму условию
В Ячейке мужно мне посчитать количество часов по двум критериям: 1)по месяцу (Но числа в таблице указаны в формате дд.мм.гг) 2) по...

Выборка по дате и создание списка по условию
Господа, прошу помощи. Имеется БД для кафедры. В ней 3 таблицы 1. Лабораторные(Название, Дата проведения, Дисциплина,...

Прибавить к дате количество дней и проверить результат на соответствие условию
Подскажите скрипт для vba или sql-запроса: Из таблицы нужно взять значение из поля типа дата (короткий формат дд\мм\гг), прибавить к нему...

Распределение строк
Здравствуйте! Не могу понять как решается задача(( Пару дней на неё уже убил. Подскажите пожалуйста,если конечно не затруднит. Условие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru