То-есть создать метод, и в каждом ифе прописывать условия и потом присвоение свойству ? а если их 50 ???
Да пипец какой-то. Ну как так. Нужна структура данных key=>value: 1) Ассоциативные массивы ?? VBA -> не, НеСлыхал. 2) Юзаем new Collection. Там можно обращаться к свойству по значению. Но блин, стапэ, там нельзя изменять значения 3) Ок есть пользовательские классы. Можно изменять значения. Но мать его нельзя по человечески обращаться к свойству 4) Ок есть Dictionary, но хрен он заработает у другого юзера, без подключённой библиотеке. 5) Вишенка на торте - нет доступа к ключам. То-есть храним дополнительно список ключей ???
Я правильно понял структуру данных key=>value в VBA?
Приветствую. Подскажите плз Как обратиться к свойству объекта класса по значению переменной, таким образом чтобы вызвался Сеттер (Let property) Это необходимо для динамического изменения свойств в цикле
модуль BksiExecute -> execute()
Код
Sub execute()
Dim b As BKSI
Dim val
Set b = New BKSI
b.init
val = b.test1
val = b.test2
Set lst = b.getKeys
Set lst = b.getKeys 'Кэш
For Each k In lst
' КАК ОБРАТИТЬСЯ К СВОЙСТВУ ОБЬЕКТА КЛАССА
' ПО ЗНАЧЕНИБЮ ПЕРЕМЕННОЙ
'b(k) = "For Each"
Next
End Sub
класс BKSI
Код
Private pTest1Private pTest2
Private listKeys As Collection
Public Function init() As Boolean
pTest1 = "init1"
pTest2 = "init2"
End Function
Public Property Get test1()
test1 = pTest1
End Property
Public Property Let test1(val)
pTest1 = val
End Property
Public Property Get test2()
test2 = pTest2
End Property
Public Property Let test2(val)
pTest2 = val
End Property
Public Function getKeys() As Collection
If Not listKeys Is Nothing Then GoTo EndFn
Set lst = New Collection
lst.Add "test1"
lst.Add "test2"
Set listKeys = lst
EndFn:
Set getKeys = listKeys
End Function
Мдяяяя, эти факанутые примечания не дали мне заснуть !! --------------------------------------------------------------------------------------- ' BKSI доработка: ' - Не используется цикл для выключения комментариев ' - Позиционирует примечание в правом верхнем углу ' - Автоматически корректирует размер по наполнению текста ' - Исправлен баг со вставкой строк\колонок в "объединённых ячейках" '---------------------------------------------------------------------------------------
Если мы тыкаем по навигации(Заголовкам) и обращаемся к свойствам Target происходит какойто перерасчёт выделенных областей.
Код
If Target.MergeCells <> False Then 'есть состояние NULL
или
If Not (Target.Comment Is Nothing) Then
Кстати у Target.MergeCells есть состояние NULL и оно соответствует тому как мы тыкаем по навигации (вроде :Р)
Но можно обратиться к свойству Count и будет всё норм
Код
If Target.Count >= 5000 Then GoTo Erreble
МОЖЕТ ЕСТЬ какое-то более адекватное решение определения клика по навигации ?
'---------------------------------------------------------------------------------------
' Module : Лист1
' DateTime : 23.11.2009 11:02
' Author : The_Prist
' Purpose : http://www.planetaexcel.ru/forum.php?thread_id=11528
' Отображение примечания при активации ячейки.
' Тема: Как настроить примечания ?
' Автор: ksmspb
'---------------------------------------------------------------------------------------
' https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=154115
' BKSI доработка:
' - Не используется цикл для выключения комментариев
' - Позиционирует примечание в правом верхнем углу
' - Автоматически корректирует размер по наполнению текста
' - Исправлен баг со вставкой строк\колонок в "объединённых ячейках"
'---------------------------------------------------------------------------------------
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim oComment As Comment
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayCommentIndicator = xlCommentIndicatorOnly
If Target.Count >= 5000 Then GoTo EndFn
If Not (Target.Comment Is Nothing) Then
Set oComment = Target.Comment
' Target.MergeCells есть состояние NULL (клик по навигации)
ElseIf Target.MergeCells <> False And Not (Target.Cells(1).Comment Is Nothing) Then
Set oComment = Target.Cells(1).Comment
Else
GoTo EndFn
End If
oComment.Shape.Top = Target.Top
oComment.Shape.Left = Target.Left + Target.Width + 10
oComment.Shape.TextFrame.AutoSize = True
oComment.Visible = True
EndFn:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Чуток переделал для фиксации примечаний, но проблема была и в изначальном коде. Помогите плиз
Цитата
Когда есть примечание на странице НЕЛЬЗЯ !!! вставить строку или колонку Внутрь объединённой области. Если ткнуть по навигации (11-18) или (E-L) происходит выделение всех строк или колонок задействованных в области
В файле есть 3 тестовых листа На третьем попробуйте вставить строку\колонку
Приветствую. Для себя рещил етот вопрос таким образом: 1) Страничка "НАВИГАЦИЯ" всегда находится на первой позиции. С помощью неё осуществляются переходы на "Листы" с данными 2) "Лист" на который был выполнен переход, или был активирован с помощью закладки перемещается на вторую позицию. 3) Перед закрытием книги - активирую страничку "НАВИГАЦИЯ"
Таким образом у меня на первом месте Навигация, на Втором месте Рабочий лист. КРАСОТА но и БЕДА!! Выполняя .Move Before:= Excel сбрасывает то что было скопировано на страничке. Тоесть книга становится не пригодной для КопиПаста. В комментариях я написал как сделать ЗАТЫЧКУ но ето бред
Подскажите плиз Как сохранить те данные которые были скопированны в екселе(вместе с форматированием) и потом обратно их впихнуть в Буфер для дальнейшей вставки в Excel. Либо как отменить ето дурацкое событие - сброс буфера
Код
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
' If Application.CutCopyMode Then
' BuferData = Данные которые были скопированы на страничке в EXEL
' End If
With Application
' ЗАТЫЧКА. если было выполнено копирование - выход
' If .CutCopyMode Then Exit Sub
Set Sh = ActiveSheet
If (Sh.Name = "НАВИГАЦИЯ") Then Exit Sub
.ScreenUpdating = False
.EnableEvents = False
Sheets("НАВИГАЦИЯ").Move Before:=Sheets(1)
Sh.Move Before:=Sheets(2)
.EnableEvents = True
.ScreenUpdating = True
End With
' If BuferData then
' Вставить обратно данные в буфер
' End If
End Sub
'-------------------------------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Application
.ScreenUpdating = False
.EnableEvents = False
If Sheets("НАВИГАЦИЯ").Index <> 1 ThenSheets("НАВИГАЦИЯ").Move Before:=Sheets(1)
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub