Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/UDF - ссылки на ячейки для всех макросов проекта - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
UDF - ссылки на ячейки для всех макросов проекта
ddp1481ne Дата: Вторник, 30.12.2025, 19:39 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 3 ±
Замечаний: 0% ±

2013
Добрый день!

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

[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 я изобретаю "велосипед" и есть более простое решение? !!!

Простой пример в файле:
К сообщению приложен файл: udf_rwcell_ddp1481ne.xls (67.0 Kb)
 
Ответить
СообщениеДобрый день!

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

[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 я изобретаю "велосипед" и есть более простое решение? !!!

Простой пример в файле:

Автор - ddp1481ne
Дата добавления - 30.12.2025 в 19:39
Gustav Дата: Четверг, 01.01.2026, 23:41 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2877
Репутация: 1217 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
С Новым годом!

Похоже, Вам надо погуглить по строке "именованные диапазоны в 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]
При добавлении/удалении ячеек/строк вокруг именованного диапазона его адрес будет автоматически перестраиваться в соответствии с обновленной ситуацией, самому следить за этим не нужно. И при каждом запуске программы переменная МойДиапазон будет автоматически соответствовать новому адресу диапазона.

Есть нюанс, связанный с возможным заданием имени диапазона на уровне всей книги или отдельного листа. Во втором случае можно задавать одинаковые имена диапазонам на разных листах. Но с этим рекомендую подробнее познакомиться потом, если в целом возьмете на вооружение подход с именами.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеС Новым годом!

Похоже, Вам надо погуглить по строке "именованные диапазоны в 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
Дата добавления - 01.01.2026 в 23:41
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2026 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!