При написании большого проекта задался вопросом - как назначить переменные часто используемым ячейкам/диапазонам ячеек и при изменении адреса изменять его в одном месте, а не вылавливать в модулях, листах и формах? Искал (возможно плохо) по форумам и ничего простого не нашёл. Были варианты с глобальными переменными и макросом их обновляющим. Попробовал сам воспользоваться пользовательским типом данных в виде массива содержащего ключ, имя листа и координаты - получилось, но слишком громоздко и неудобно. Итогом поисков и размышлений стало вот это:
[vba]
Код
Function rwCell(ByRef xRange, ByRef func, Optional ByVal xData) 'read/write
Select Case xRange Case "L1c1": Set xList = Лист1.Cells(9, 3) Case "L1c2": Set xList = Лист1.Cells(9, 6) Case "L1c3": Set xList = Лист1.Cells(9, 12) Case "L1c4": Set xList = Лист1.Cells(11, 6) Case "L1cArr": Set xList = Лист1.Range(Лист1.Cells(9, 9), Лист1.Cells(11, 10))
Case Else: Exit Function End Select
With xList If IsMissing(xData) Then Select Case func Case "v2": rwCell = .Value2 Case "ic": rwCell = .Interior.Color Case "fs": rwCell = .Font.Size End Select Else Select Case func Case "v2": .Value2 = xData Case "ic": .Interior.Color = xData Case "fs": .Font.Size = xData End Select End If End With
End Function
[/vba]
Пока это скорее черновик функции.
Для примера сделал чтение/запись значения ячеек, их цвета и размера шрифта. Так же проверил чтение/запись массива.
Основными требованиями были: - простота - обращение к внутреннему имени листа - изменение адреса ячейки только в одном месте кода
Главным минусом считаю плохую "читаемость" кода:
[vba]
Код
rwCell "L1c1", "v2", 67890 'Запись
MsgBox rwCell("L1c2", "v2") ' Чтение
[/vba]
!!! И самое главное - возможно из-за своего низкого уровня знания VBA я изобретаю "велосипед" и есть более простое решение? !!!
Простой пример в файле:
Добрый день!
При написании большого проекта задался вопросом - как назначить переменные часто используемым ячейкам/диапазонам ячеек и при изменении адреса изменять его в одном месте, а не вылавливать в модулях, листах и формах? Искал (возможно плохо) по форумам и ничего простого не нашёл. Были варианты с глобальными переменными и макросом их обновляющим. Попробовал сам воспользоваться пользовательским типом данных в виде массива содержащего ключ, имя листа и координаты - получилось, но слишком громоздко и неудобно. Итогом поисков и размышлений стало вот это:
[vba]
Код
Function rwCell(ByRef xRange, ByRef func, Optional ByVal xData) 'read/write
Select Case xRange Case "L1c1": Set xList = Лист1.Cells(9, 3) Case "L1c2": Set xList = Лист1.Cells(9, 6) Case "L1c3": Set xList = Лист1.Cells(9, 12) Case "L1c4": Set xList = Лист1.Cells(11, 6) Case "L1cArr": Set xList = Лист1.Range(Лист1.Cells(9, 9), Лист1.Cells(11, 10))
Case Else: Exit Function End Select
With xList If IsMissing(xData) Then Select Case func Case "v2": rwCell = .Value2 Case "ic": rwCell = .Interior.Color Case "fs": rwCell = .Font.Size End Select Else Select Case func Case "v2": .Value2 = xData Case "ic": .Interior.Color = xData Case "fs": .Font.Size = xData End Select End If End With
End Function
[/vba]
Пока это скорее черновик функции.
Для примера сделал чтение/запись значения ячеек, их цвета и размера шрифта. Так же проверил чтение/запись массива.
Основными требованиями были: - простота - обращение к внутреннему имени листа - изменение адреса ячейки только в одном месте кода
Главным минусом считаю плохую "читаемость" кода:
[vba]
Код
rwCell "L1c1", "v2", 67890 'Запись
MsgBox rwCell("L1c2", "v2") ' Чтение
[/vba]
!!! И самое главное - возможно из-за своего низкого уровня знания VBA я изобретаю "велосипед" и есть более простое решение? !!!
Похоже, Вам надо погуглить по строке "именованные диапазоны в Excel" и поизучать тему.
В Excel можно задать имя одной ячейке или диапазону и дальше комфортно оперировать с этим именем в формулах или макросах VBA. В простейшем случае имя можно задать вручную через "Диспетчер имен" (быстрый вызов комбинацией Ctrl+F3).
Например, задали имя "МойДиапазон" диапазону Лист1!$B$2:$D$4 и дальше можете его использовать в своей программе VBA, объявив в самом ее начале переменную для диапазона, скрывающегося под этим именем: [vba]
Код
Sub io1() Dim МойДиапазон As Range
Set МойДиапазон = ThisWorkbook.Names("МойДиапазон").RefersToRange 'или 'Set МойДиапазон = Application.Range(ThisWorkbook.Names("МойДиапазон").Name)
МойДиапазон.Value2 = "общее значение" End Sub
[/vba] При добавлении/удалении ячеек/строк вокруг именованного диапазона его адрес будет автоматически перестраиваться в соответствии с обновленной ситуацией, самому следить за этим не нужно. И при каждом запуске программы переменная МойДиапазон будет автоматически соответствовать новому адресу диапазона.
Есть нюанс, связанный с возможным заданием имени диапазона на уровне всей книги или отдельного листа. Во втором случае можно задавать одинаковые имена диапазонам на разных листах. Но с этим рекомендую подробнее познакомиться потом, если в целом возьмете на вооружение подход с именами.
С Новым годом!
Похоже, Вам надо погуглить по строке "именованные диапазоны в Excel" и поизучать тему.
В Excel можно задать имя одной ячейке или диапазону и дальше комфортно оперировать с этим именем в формулах или макросах VBA. В простейшем случае имя можно задать вручную через "Диспетчер имен" (быстрый вызов комбинацией Ctrl+F3).
Например, задали имя "МойДиапазон" диапазону Лист1!$B$2:$D$4 и дальше можете его использовать в своей программе VBA, объявив в самом ее начале переменную для диапазона, скрывающегося под этим именем: [vba]
Код
Sub io1() Dim МойДиапазон As Range
Set МойДиапазон = ThisWorkbook.Names("МойДиапазон").RefersToRange 'или 'Set МойДиапазон = Application.Range(ThisWorkbook.Names("МойДиапазон").Name)
МойДиапазон.Value2 = "общее значение" End Sub
[/vba] При добавлении/удалении ячеек/строк вокруг именованного диапазона его адрес будет автоматически перестраиваться в соответствии с обновленной ситуацией, самому следить за этим не нужно. И при каждом запуске программы переменная МойДиапазон будет автоматически соответствовать новому адресу диапазона.
Есть нюанс, связанный с возможным заданием имени диапазона на уровне всей книги или отдельного листа. Во втором случае можно задавать одинаковые имена диапазонам на разных листах. Но с этим рекомендую подробнее познакомиться потом, если в целом возьмете на вооружение подход с именами.Gustav