При написании большого проекта задался вопросом - как назначить переменные часто используемым ячейкам/диапазонам ячеек и при изменении адреса изменять его в одном месте, а не вылавливать в модулях, листах и формах? Искал (возможно плохо) по форумам и ничего простого не нашёл. Были варианты с глобальными переменными и макросом их обновляющим. Попробовал сам воспользоваться пользовательским типом данных в виде массива содержащего ключ, имя листа и координаты - получилось, но слишком громоздко и неудобно. Итогом поисков и размышлений стало вот это:
[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 я изобретаю "велосипед" и есть более простое решение? !!!