Результат с копированием вышел неплохой, но если значений в выборке больше 10-ти ждать все равно приходиться долго.... на обработку каждой строки много действий. Полей в строке около 20-ти и работа выполняется с 7-10 полями "ячейками". Данные отсылаются на разные листы. Можете дать пример таботы с двумерными массивами, и способами адресации в них? У меня таблици построены как "реляционная БД"
Я в макросах новичок, но на с++ пишу, если можно проведите аналогию кто знаком с языком.
Цикол нужен в любом случе, так как нужно отдельно обрабатывать содержымое каждой строки, но это вариант, создать новый листи с выбранными значения и на нем уже обрабатывать , так будет существенно быстрее.
Назрел еще один вопрос, как модно изменить имя разрешенного для изменения диапазона, зная его имя. То есть имя Диапазон1 заменить на Диапазон15? Заранее благодарен!
Здравствуйте УВ.Форумчане! Возникла проблема, нужно получить имена всех листов книги и список имен разрешенных для изменения диапазонов, на листе с которого вызван макрос. На новом листе.
Примерно должно выглядеть так... только я не все знаю как написать, помогите поправить пожалуйста!
Sub reads() Worksheets.Add.Name = "temps" Sheets("temps").Select for i = "Первый лист" To "Последний лист" Range(Cells(1, i).Value = Sheet.Name Next i
for i = "Первый диапазон" To "Последний диапазон" Range(Cells(2, i).Value = ActiveSheet.Protection.Name Next i
Но появился другой вопрос. Как можно передать имя диапазона, а не его порядковый номер в эту строку, чтоб можно было удалять по имени, а не хранить номер, а потом искать, номер и удалять. ActiveSheet.Protection.AllowEditRanges(1).Delete
Private Sub CommandButton2_Click() ANS = ActiveSheet.Name ActiveRow = Selection.Row ActiveSheet.Unprotect Password:="123" ActiveSheet.Protection.AllowEditRanges(1).Delete Cells(ActiveRow, 8) = 1 Worksheets(ANS).Protect Password:="123", UserinterfaceOnly:=True End Sub
Кто знает, как можно передать переделать Range("F8,F14,F20,F27,F32,H28").Select в Range(Cells(1,1), Cells(4,1), Cells(1,5), Cells(1,8), Cells(1,9),).Select или Range(R1C1, R1C4, R5C1, R8C1).Select
У меня появилась идея лучше, задать ячейки для изменения, а для остальных выключить дабл клик. Решает часть проблем. Если строка разрешена для редактирования, то есть в 12-ом столбце 1, и жмем в ячейки которые можно редактировать, 1-я, 3-я, и 5-я то все ок. если нет то дабл клик отключен и защита работает. Проблема можно сказать решена) Не хватает только функции, BeforeChange)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ActiveRow = Selection.Row ActiveCol = Selection.Column If Cells(ActiveRow, 12) = 1 And (ActiveCol = 1 Or ActiveCol = 3 Or ActiveCol = 5) Then Cancel = False Else Cancel = True End If End Sub
Sirius, хороший способ, но не в моем случае, мне выделение заблокированных нужно) У меня в зависимости от выделенной ячейки работает соответствующий макрос. Но в любом случае всем спасибо за помощь в решении проблемы.
Доброе время суток! Подскажите, а как сохранять файл в текущую папку с проектом или в папку которая лежит в папке с проектом. Чтоб не нужно было жестко привязываться к месторасположению проекта. Код макроса взят из статьи "Создание резервных копий ценных файлов" из раздела "Приемы". strPath = "\TEMP" strPath = "TEMP" strPath = "\..\TEMP" И подобные не воспринимает. Заранее благодарен!
Доброе время суток УВ Форумчане! Подскажите пожалуйста, как отключить сообщение о том, что ячейка защищена от изменений, которое появляется при попытке изменения заблокированной ячейки на защищенном рабочем листе. Application.DisplayAlerts=False не помогает.
Доброе время суток УВ Форумчане! Написал макрос для печати выделенного диапазона, выделение происходит нормально, но на принтер не отправляет... собственно загвоздка в последней строчке. Подскажите, что не так. Заранее благодарен!
Sub PrintSelection() a = Selection.Row c = Selection.Column b = a + Selection.Rows.Count - 1 d = c + Selection.Columns.Count - 1 Range(Cells(a, c), Cells(b, d)).Select Selection.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False End Sub
Если написать Cells(Active_Row, 14).Value = Cells(Active_Row, 1).Value Дебаг говорит, MetHod 'Value' of object 'Range' Failed Так что видимо не в этом дело
KukLP Согласен, вы правы, в остальных местах я использовал боксы из-за возможностей поиска, но здесь без них можно обойтись. Сделал проверки, решило проблему отслеживания изменений, но породило новую, теперь при выборе значения из "проверки" макрос отслеживания срабатывает, но потом вылетает в дебаг "на нем".... может для проверок в нем нужно что-то поправить? Dim S As Integer
Private Sub Worksheet_Change(ByVal Target As Range) Active_Row = Target.Row Cells(Active_Row, 14) = Cells(Active_Row, 1) S = 1 End Sub
З.Ы. Бокси создаются только по запросу, а по окончании работы с ними удаляются, так что размер файла от их количества совершенно не зависит.
Солоноват для меня пример... но придумал обходной спосою. Получается так... у меня всегда номер элемента ComboBox будет соответствовать строке, то есть ComboBox56, это строчка 56. Можно ли как-то узнать имя, активированного бокса? если да, то тогда будет работать для всех, что-то типа этого Private Sub ComboBoxN_Change() Application.EnableEvents = 0 Form = ActiveSheet.Shapes.Range(Array(Form)).Name 'Правда нужно будет узнать цифры из имени формы' Cells(Form, 14).Value = 1 Application.EnableEvents = -1 End Sub