Есть следующая задача. Некоторый плоский материал состоит из множества слоев. В табличном виде задается порядковый номер очередного слоя и его толщина. Пример этого в таблице 1. Задача: В случае, если толщина очередного слоя превышает dt, необходимо разбить слой на толщины с шагом dt. Ну и конечно же должна быть обозначена конечная толщина очередного слоя. Пример такого, изменённого разбиения показан в таблице 2, для dt=0,02. Как это делать в ВБА с помощью цикла в цикле и понячейно я знаю. Но хотелось бы всё это сделать на более профессиональном уровне. С помощью Range, если не ошибаюсь.
Спасибо ___________ Юрий.
Доброго дня Всем.
Есть следующая задача. Некоторый плоский материал состоит из множества слоев. В табличном виде задается порядковый номер очередного слоя и его толщина. Пример этого в таблице 1. Задача: В случае, если толщина очередного слоя превышает dt, необходимо разбить слой на толщины с шагом dt. Ну и конечно же должна быть обозначена конечная толщина очередного слоя. Пример такого, изменённого разбиения показан в таблице 2, для dt=0,02. Как это делать в ВБА с помощью цикла в цикле и понячейно я знаю. Но хотелось бы всё это сделать на более профессиональном уровне. С помощью Range, если не ошибаюсь.
Я инженер, а следовательно должен соблюдать нормы, стандарты, правила и инструкции.. В данном случае Правила Форума. Но я ничего не имею против, чтобы данная тема была удалена из этого раздела и чтобы мы продолжили разговор в Старой теме. Главное, чтобы модератор Борода "дал добро".
Я инженер, а следовательно должен соблюдать нормы, стандарты, правила и инструкции.. В данном случае Правила Форума. Но я ничего не имею против, чтобы данная тема была удалена из этого раздела и чтобы мы продолжили разговор в Старой теме. Главное, чтобы модератор Борода "дал добро".Юрий_Нд
А других модераторов и администраторов Вы слушать не станете?
Формально Вы правы, это разные темы - в одной формулы, в другой VBA. Но было бы очень неплохо дать ссылочку на прошлую тему. И показать Ваш код. И пояснить словами что-откуда-куда-почему. Я, например, посмотрел файл из первого поста и ничего не понял, а искать Вашу предыдущую тему лень (это еще с учетом того, что я вообще про нее знаю)
А других модераторов и администраторов Вы слушать не станете?
Формально Вы правы, это разные темы - в одной формулы, в другой VBA. Но было бы очень неплохо дать ссылочку на прошлую тему. И показать Ваш код. И пояснить словами что-откуда-куда-почему. Я, например, посмотрел файл из первого поста и ничего не понял, а искать Вашу предыдущую тему лень (это еще с учетом того, что я вообще про нее знаю)_Boroda_
Аналогичная или тождественная тема находится в разделе простого Excel. Однако я в эту тему перетащил ещё и исходный файл, который, как мне кажется, более прост для понимания моего вопроса. Дополнительно словами поясняю, что слой номер 2 имеет толщину больше чем 0.2, то есть его толщина 0.51. Следовательно этот слой делится на толщины кратные 0.2. То есть, сначала толщина 0.2, затем толщина ещё раз 0.2, и наконец остаток толщины 0.11. В итоге получаем что толщина слоя 0.51 разбивается на три слоя 0.2 + 0.2 + 0.11. Да вот еще. В теме, на которую дана ссылка увидел неточность. В исходном файле разбиение 2 слоя идёт как 0.2, 0.4 и 0.51. Это неверно. Должно быть всё как описано выше и как в приложенном здесь файле Excel. Ну и конечно же к разбитым слоям должны быть "паровозиком" прикреплены все сопутствующие данные из исходной таблицы.
Аналогичная или тождественная тема находится в разделе простого Excel. Однако я в эту тему перетащил ещё и исходный файл, который, как мне кажется, более прост для понимания моего вопроса. Дополнительно словами поясняю, что слой номер 2 имеет толщину больше чем 0.2, то есть его толщина 0.51. Следовательно этот слой делится на толщины кратные 0.2. То есть, сначала толщина 0.2, затем толщина ещё раз 0.2, и наконец остаток толщины 0.11. В итоге получаем что толщина слоя 0.51 разбивается на три слоя 0.2 + 0.2 + 0.11. Да вот еще. В теме, на которую дана ссылка увидел неточность. В исходном файле разбиение 2 слоя идёт как 0.2, 0.4 и 0.51. Это неверно. Должно быть всё как описано выше и как в приложенном здесь файле Excel. Ну и конечно же к разбитым слоям должны быть "паровозиком" прикреплены все сопутствующие данные из исходной таблицы.Юрий_Нд
Sub Tablica() Dim i As Long Dim n As Integer Dim iLastRow As Long iLastRow = Cells(Rows.Count, "E").End(xlUp).Row For i = iLastRow To 6 Step -1 If Cells(i, "E") > 0.2 Then n = Int(Cells(i, "E") / 0.2) Rows(i + 1).Resize(n).Insert Cells(i + n, "E") = Cells(i, "E") - 0.2 * (Int(Cells(i, "E") / 0.2)) Cells(i, "E").Resize(n) = 0.2 Cells(i + 1, "D").Resize(n) = Cells(i, "D") Cells(i + 1, "F").Resize(n) = Cells(i, "F") End If Next Range("C6").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _ Step:=1, Stop:=Cells(Rows.Count, "C").End(xlUp).Row - 5, Trend:=False End Sub
[/vba]
[vba]
Код
Sub Tablica() Dim i As Long Dim n As Integer Dim iLastRow As Long iLastRow = Cells(Rows.Count, "E").End(xlUp).Row For i = iLastRow To 6 Step -1 If Cells(i, "E") > 0.2 Then n = Int(Cells(i, "E") / 0.2) Rows(i + 1).Resize(n).Insert Cells(i + n, "E") = Cells(i, "E") - 0.2 * (Int(Cells(i, "E") / 0.2)) Cells(i, "E").Resize(n) = 0.2 Cells(i + 1, "D").Resize(n) = Cells(i, "D") Cells(i + 1, "F").Resize(n) = Cells(i, "F") End If Next Range("C6").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _ Step:=1, Stop:=Cells(Rows.Count, "C").End(xlUp).Row - 5, Trend:=False End Sub
Доброго дня Всем. Кузьмич, Ваш код отлично работает. Если возможно, подскажите, как можно вставлять дополнительно не целую строчку, а группу ячеек, ограниченную размерами таблицы. Потому что Ваш код "режет весь лист", а там много другой информации, которую необходимо поправлять после запуска Вашей процедуры. С благодарностью __________ Юрий.
Доброго дня Всем. Кузьмич, Ваш код отлично работает. Если возможно, подскажите, как можно вставлять дополнительно не целую строчку, а группу ячеек, ограниченную размерами таблицы. Потому что Ваш код "режет весь лист", а там много другой информации, которую необходимо поправлять после запуска Вашей процедуры. С благодарностью __________ Юрий.Юрий_Нд
Сообщение отредактировал Юрий_Нд - Суббота, 08.09.2018, 12:51
Спасибо Кузьмич. С частью строки вроде бы разобрались всё работает нормально, однако появились "лишние дополнительные сопли". Будет время, посмотрите. Ещё если возможно пару пожеланий: - как сделать так, чтобы процедура брала исходную таблицу на четко заданном листе, а изменённую таблицу прорисовала бы в любом заданном месте на другом, но заданном листе? - как сделать "полный реверс" слоев в таблице? То есть, чтобы первый слой оказался последним, и так далее по порядку. С благодарностью ___________ Юрий.
Спасибо Кузьмич. С частью строки вроде бы разобрались всё работает нормально, однако появились "лишние дополнительные сопли". Будет время, посмотрите. Ещё если возможно пару пожеланий: - как сделать так, чтобы процедура брала исходную таблицу на четко заданном листе, а изменённую таблицу прорисовала бы в любом заданном месте на другом, но заданном листе? - как сделать "полный реверс" слоев в таблице? То есть, чтобы первый слой оказался последним, и так далее по порядку. С благодарностью ___________ Юрий.Юрий_Нд
Создайте в книге еще один лист и назовите его Результат При активном Листе1 запустите макрос (можно сделать кнопку и к ней привязать макрос) [vba]
Код
Sub Tablica() Dim i As Long Dim n As Integer Dim iLastRow As Long With Worksheets("Результат") iLastRow = Cells(Rows.Count, "E").End(xlUp).Row .Cells.Clear Range("C5:F" & iLastRow).Copy .Range("A1") iLastRow = .Cells(.Rows.Count, "C").End(xlUp).Row For i = iLastRow To 2 Step -1 If .Cells(i, "C") > 0.2 Then n = Int(.Cells(i, "C") / 0.2) .Range("A" & i + 1 & ":D" & i + 1).Resize(n).Insert .Cells(i + n, "C") = .Cells(i, "C") - 0.2 * (Int(.Cells(i, "C") / 0.2)) .Cells(i, "C").Resize(n) = 0.2 .Cells(i + 1, "B").Resize(n) = .Cells(i, "B") .Cells(i + 1, "D").Resize(n) = .Cells(i, "D") End If Next .Range("A2").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _ Step:=1, Stop:=.Cells(.Rows.Count, "A").End(xlUp).Row - 1, Trend:=False iLastRow = .Cells(.Rows.Count, "C").End(xlUp).Row .Range("B1:D" & iLastRow).Sort Key1:=.Range("B1"), Order1:=xlDescending, Header:=xlYes End With End Sub
[/vba]
Цитата
Ещё если возможно пару пожеланий:
Создайте в книге еще один лист и назовите его Результат При активном Листе1 запустите макрос (можно сделать кнопку и к ней привязать макрос) [vba]
Код
Sub Tablica() Dim i As Long Dim n As Integer Dim iLastRow As Long With Worksheets("Результат") iLastRow = Cells(Rows.Count, "E").End(xlUp).Row .Cells.Clear Range("C5:F" & iLastRow).Copy .Range("A1") iLastRow = .Cells(.Rows.Count, "C").End(xlUp).Row For i = iLastRow To 2 Step -1 If .Cells(i, "C") > 0.2 Then n = Int(.Cells(i, "C") / 0.2) .Range("A" & i + 1 & ":D" & i + 1).Resize(n).Insert .Cells(i + n, "C") = .Cells(i, "C") - 0.2 * (Int(.Cells(i, "C") / 0.2)) .Cells(i, "C").Resize(n) = 0.2 .Cells(i + 1, "B").Resize(n) = .Cells(i, "B") .Cells(i + 1, "D").Resize(n) = .Cells(i, "D") End If Next .Range("A2").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _ Step:=1, Stop:=.Cells(.Rows.Count, "A").End(xlUp).Row - 1, Trend:=False iLastRow = .Cells(.Rows.Count, "C").End(xlUp).Row .Range("B1:D" & iLastRow).Sort Key1:=.Range("B1"), Order1:=xlDescending, Header:=xlYes End With End Sub
- этот модуль-процедура, который Вы помогаете мне делать, я представляю себе в дальнейшем как полноценную функцию, а поэтому в коде мне обязательно нужно четкое указание на лист, где расположена исходная таблица. - если Вы помните, я Вам говорил "о соплях". Дело в том, что у меня под таблицей расположена еще "куча" аналогичных таблиц. Попробуйте под исходной таблицей "протянуть строчку единичек", и Вы увидите те "сопли", о которых я говорю.
- этот модуль-процедура, который Вы помогаете мне делать, я представляю себе в дальнейшем как полноценную функцию, а поэтому в коде мне обязательно нужно четкое указание на лист, где расположена исходная таблица. - если Вы помните, я Вам говорил "о соплях". Дело в том, что у меня под таблицей расположена еще "куча" аналогичных таблиц. Попробуйте под исходной таблицей "протянуть строчку единичек", и Вы увидите те "сопли", о которых я говорю.
Как всегда, с благодарностью _____________ Юрий.Юрий_Нд
Сообщение отредактировал Юрий_Нд - Воскресенье, 09.09.2018, 00:46
Если у вас на листе с таблицей будет кнопка, запускающая макрос
Я прекрасно понял Ваше предложение по 10-му и 12-му сообщению, однако, конечную цель я понимаю несколько иначе. Во-первых, на листе "таблицы" будет размещено множество таблиц, подобных тем которые Вы видели, размещенных в шахматном порядке. На листе "результат" будут выводиться и видоизменяться только часть исходных таблиц, по-моему усмотрению. Сигналом или командой на запуск определенной таблицы будет ячейка на листе "результат", которая даёт ссылку или как-то идентифицирует исходную таблицу на листе "таблицы". Например левый верхний угол исходной таблицы. А рядом с этой ячейкой или по-вашему кнопкой запускающей макрос, будет находиться ячейка с пользовательской функцией, которую в настоящий момент Вы помогаете мне разработать и которая сейчас называется процедурой. А уже начиная со следующей ячейки будет располагаться уже видоизмененная исходная таблица. В общем как-то так. Сейчас попробую подготовить макет 2-х листов Excel.
Если у вас на листе с таблицей будет кнопка, запускающая макрос
Я прекрасно понял Ваше предложение по 10-му и 12-му сообщению, однако, конечную цель я понимаю несколько иначе. Во-первых, на листе "таблицы" будет размещено множество таблиц, подобных тем которые Вы видели, размещенных в шахматном порядке. На листе "результат" будут выводиться и видоизменяться только часть исходных таблиц, по-моему усмотрению. Сигналом или командой на запуск определенной таблицы будет ячейка на листе "результат", которая даёт ссылку или как-то идентифицирует исходную таблицу на листе "таблицы". Например левый верхний угол исходной таблицы. А рядом с этой ячейкой или по-вашему кнопкой запускающей макрос, будет находиться ячейка с пользовательской функцией, которую в настоящий момент Вы помогаете мне разработать и которая сейчас называется процедурой. А уже начиная со следующей ячейки будет располагаться уже видоизмененная исходная таблица. В общем как-то так. Сейчас попробую подготовить макет 2-х листов Excel. Юрий_Нд
Что-то как-то сложно это. Предлагаю другой вариант. На листе Таблицы в ячейке О1 сделать выпадающий список, при выборе нужной таблицы она переносится на лист Результат и видоизменяется. Макрос срабатывает при изменении содержимого ячейки О1
Что-то как-то сложно это. Предлагаю другой вариант. На листе Таблицы в ячейке О1 сделать выпадающий список, при выборе нужной таблицы она переносится на лист Результат и видоизменяется. Макрос срабатывает при изменении содержимого ячейки О1Kuzmich
Что-то как-то сложно это. Предлагаю другой вариант. На листе Таблицы в ячейке О1 сделать выпадающий список,
"Так-то оно так..." Однако, если бы я делал какой-то онлайн калькулятор, когда нужно было бы посчитать сегодня одно значение, завтра другое. А ещё через неделю третье или четвёртое значение, тогда бы Ваш способ выигрывал по всем позициям. Однако я делаю инженерный расчёт, и вычисления по этим таблицам является только маленькой составной частью большого и сложного проекта. В конце этого проекта должен быть анализ принятых технических решений. И на этом этапе я должен посмотреть увидеть и сравнить различные варианты выполнения конструкции. Так вот на этом этапе я должен увидеть не только и даже не столько эти таблицы а графики, которые выполняются на основе этих таблиц. И сравнить и проанализировать их. И на этом этапе я не могу и не хочу щёлкать по меню, какое бы хорошее оно не было. Я должен увидеть сразу все варианты, чтобы сравнить их. И в итоге я должен выбрать оптимальный вариант конструктивного решения инженерной задачи. Вот как-то так.
В любом случае, я Вам очень благодарен _______________ Юрий.
Что-то как-то сложно это. Предлагаю другой вариант. На листе Таблицы в ячейке О1 сделать выпадающий список,
"Так-то оно так..." Однако, если бы я делал какой-то онлайн калькулятор, когда нужно было бы посчитать сегодня одно значение, завтра другое. А ещё через неделю третье или четвёртое значение, тогда бы Ваш способ выигрывал по всем позициям. Однако я делаю инженерный расчёт, и вычисления по этим таблицам является только маленькой составной частью большого и сложного проекта. В конце этого проекта должен быть анализ принятых технических решений. И на этом этапе я должен посмотреть увидеть и сравнить различные варианты выполнения конструкции. Так вот на этом этапе я должен увидеть не только и даже не столько эти таблицы а графики, которые выполняются на основе этих таблиц. И сравнить и проанализировать их. И на этом этапе я не могу и не хочу щёлкать по меню, какое бы хорошее оно не было. Я должен увидеть сразу все варианты, чтобы сравнить их. И в итоге я должен выбрать оптимальный вариант конструктивного решения инженерной задачи. Вот как-то так.
В любом случае, я Вам очень благодарен _______________ Юрий.Юрий_Нд
Сообщение отредактировал Юрий_Нд - Воскресенье, 09.09.2018, 18:24
Я должен увидеть сразу все варианты, чтобы сравнить их.
Сколько реально таблиц сравниваете? Можно сделать цикл по всем таблицам и вывести видоизмененный вариант на лист Результат. Покажите пример графиков, которые выполняются на основе этих таблиц.
Цитата
Я должен увидеть сразу все варианты, чтобы сравнить их.
Сколько реально таблиц сравниваете? Можно сделать цикл по всем таблицам и вывести видоизмененный вариант на лист Результат. Покажите пример графиков, которые выполняются на основе этих таблиц.Kuzmich
1.Сколько реально таблиц сравниваете? - только что посчитал общее количество исходных. Получилось ровно 20. Думаю, что на выхлопе будет порядка 10.
2. Можно сделать цикл по всем таблицам и вывести видоизмененный вариант на лист Результат. - как я неоднократно повторил в предыдущем посте: "...Я должен увидеть сразу все варианты, чтобы сравнить их...."
3. Покажите пример графиков, которые выполняются на основе этих таблиц. - смотреть Screen-картинку. Но пока это очень "сырой" вариант.
1.Сколько реально таблиц сравниваете? - только что посчитал общее количество исходных. Получилось ровно 20. Думаю, что на выхлопе будет порядка 10.
2. Можно сделать цикл по всем таблицам и вывести видоизмененный вариант на лист Результат. - как я неоднократно повторил в предыдущем посте: "...Я должен увидеть сразу все варианты, чтобы сравнить их...."
3. Покажите пример графиков, которые выполняются на основе этих таблиц. - смотреть Screen-картинку. Но пока это очень "сырой" вариант.Юрий_Нд
Доброй ночи Кузьмич. Я Вам очень благодарен за всё то что Вы сделали для меня. Есть ещё одна просьба. Если это возможно, сделайте пожалуйста как можно больше подробных комментариев в Вашей последней версии программы. Конечно же объявления переменных, циклы и условия пояснять не нужно. А вот то, что касается объектов, методов, свойств и классов, здесь уже пожалуйста. Спасибо __________ Юрий.
Доброй ночи Кузьмич. Я Вам очень благодарен за всё то что Вы сделали для меня. Есть ещё одна просьба. Если это возможно, сделайте пожалуйста как можно больше подробных комментариев в Вашей последней версии программы. Конечно же объявления переменных, циклы и условия пояснять не нужно. А вот то, что касается объектов, методов, свойств и классов, здесь уже пожалуйста. Спасибо __________ Юрий.Юрий_Нд
Сообщение отредактировал Юрий_Нд - Понедельник, 10.09.2018, 01:04