В книге 100 листов с одинаковыми по форме умными таблицами. Отличие листов и таблиц только в номере. Наименование столбцов и форматы в умной одинаковые. Задача автоматически заполнить значение времени в именованном "Столце2" при редактировании в ячейке "Столбца1" без указания имени активного листа, или редактируемой умной таблицы (макрос сам должен вычислять и подставлять в формулу имя листа и имя активной таблицы) С первой частью справился а со второй прошу помочь. Имеющиеся варианты макроса через диапазон A1:A100 и "With Target.Offset(0, 1)" не подходят так как количество столбцов может со временем меняться а названия столбцов в умной таблице точно менять не буду. Также интересует вопрос вычисления с ссылками на 2 ячейки умной таблицы. все вычисления в границах листа-умной таблицы.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim WsS As Range ActiveTable = ActiveCell.ListObject.Name 'рабочий WsS = ActiveSheet.Name For Each Cell In Target '2 If Not Intersect(cell, Range("A4:A1000")) Is Nothing Then ' работает но не умная таблица '3 If Not Intersect(cell, Range("Таблица1[Столбец1]")) Is Nothing Then ' работает но необходимо прописывать вручную каждую таблицу If Not Intersect(Cell, Range(ActiveTable & "[Столбец1]")) Is Nothing Then ' работает- то что нужно 'With Range(("C") & cell.Row) ' работает но с привязкой к столбцу а не к именованному столбцу умной таблицы ActiveTable = ActiveCell.ListObject.Name 'рабочий
With Range((WsS.ActiveTable & "[Столбец2]") & Cell.Row) ' не работает ????? .Value = Now ' работает .EntireColumn.AutoFit End With End If Next Cell End Sub
[/vba]
В книге 100 листов с одинаковыми по форме умными таблицами. Отличие листов и таблиц только в номере. Наименование столбцов и форматы в умной одинаковые. Задача автоматически заполнить значение времени в именованном "Столце2" при редактировании в ячейке "Столбца1" без указания имени активного листа, или редактируемой умной таблицы (макрос сам должен вычислять и подставлять в формулу имя листа и имя активной таблицы) С первой частью справился а со второй прошу помочь. Имеющиеся варианты макроса через диапазон A1:A100 и "With Target.Offset(0, 1)" не подходят так как количество столбцов может со временем меняться а названия столбцов в умной таблице точно менять не буду. Также интересует вопрос вычисления с ссылками на 2 ячейки умной таблицы. все вычисления в границах листа-умной таблицы.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim WsS As Range ActiveTable = ActiveCell.ListObject.Name 'рабочий WsS = ActiveSheet.Name For Each Cell In Target '2 If Not Intersect(cell, Range("A4:A1000")) Is Nothing Then ' работает но не умная таблица '3 If Not Intersect(cell, Range("Таблица1[Столбец1]")) Is Nothing Then ' работает но необходимо прописывать вручную каждую таблицу If Not Intersect(Cell, Range(ActiveTable & "[Столбец1]")) Is Nothing Then ' работает- то что нужно 'With Range(("C") & cell.Row) ' работает но с привязкой к столбцу а не к именованному столбцу умной таблицы ActiveTable = ActiveCell.ListObject.Name 'рабочий
With Range((WsS.ActiveTable & "[Столбец2]") & Cell.Row) ' не работает ????? .Value = Now ' работает .EntireColumn.AutoFit End With End If Next Cell End Sub
Если активная ячейка находится в пределах умной таблицы, то соответствующая ей ячейка колонки "Столбец2" умной таблицы (т.е. ячейка в той же строке рабочего листа) находится на пересечении полной строки активной ячейки и диапазона данных "Столбца2". Можно в коде зафиксировать соответствующий Range (ячейку пересечения), а затем прописать ему (ей) нужное значение, например, так: [vba]
Код
Sub test() Dim rng As Range Set rng = Intersect(ActiveCell.EntireRow, ActiveCell.ListObject.ListColumns("Столбец2").DataBodyRange) rng.Value = Now End Sub
[/vba]
P.S. Соответственно, Вашу событийную процедуру из поста №1 можно переписать следующим образом: [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, rng As Range
For Each cell In Target.Cells If Not Intersect(cell, cell.ListObject.ListColumns("Столбец1").DataBodyRange) Is Nothing Then
Set rng = Intersect(cell.EntireRow, cell.ListObject.ListColumns("Столбец2").DataBodyRange) With rng .Value = Now .EntireColumn.AutoFit End With End If Next cell
End Sub
[/vba]
Если активная ячейка находится в пределах умной таблицы, то соответствующая ей ячейка колонки "Столбец2" умной таблицы (т.е. ячейка в той же строке рабочего листа) находится на пересечении полной строки активной ячейки и диапазона данных "Столбца2". Можно в коде зафиксировать соответствующий Range (ячейку пересечения), а затем прописать ему (ей) нужное значение, например, так: [vba]
Код
Sub test() Dim rng As Range Set rng = Intersect(ActiveCell.EntireRow, ActiveCell.ListObject.ListColumns("Столбец2").DataBodyRange) rng.Value = Now End Sub
[/vba]
P.S. Соответственно, Вашу событийную процедуру из поста №1 можно переписать следующим образом: [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, rng As Range
For Each cell In Target.Cells If Not Intersect(cell, cell.ListObject.ListColumns("Столбец1").DataBodyRange) Is Nothing Then
Set rng = Intersect(cell.EntireRow, cell.ListObject.ListColumns("Столбец2").DataBodyRange) With rng .Value = Now .EntireColumn.AutoFit End With End If Next cell