2014-12-05 3 views
1

Прямо сейчас, когда пользователь выбирает ячейку, связанная ячейка подсвечивается добавлением границы толщины среды. Это делается для календаря раз.VBA обратное форматирование на ячейке unselect

Например, когда пользователь щелкает Д4 он должен добавить границу B5 и когда снимает выделение пользователя d4 он должен не-пограничную B5:

Код для этого выглядит следующим образом, и она работает:

If Not Intersect(Target, Range("$D$4")) Is Nothing Then 
    Range("$B$5").Borders(xlEdgeBottom).Weight = xlMedium 
    Range("$B$5").Borders(xlEdgeTop).Weight = xlMedium 
    Range("$B$5").Borders(xlEdgeLeft).Weight = xlMedium 
    Range("$B$5").Borders(xlEdgeRight).Weight = xlMedium 
Else 
    Range("$B$5").Borders(xlEdgeBottom).Weight = xlThin 
    Range("$B$5").Borders(xlEdgeTop).Weight = xlThin 
    Range("$B$5").Borders(xlEdgeLeft).Weight = xlThin 
    Range("$B$5").Borders(xlEdgeRight).Weight = xlThin 
End If 

Проблема в том, что он работает в течение 30 ячеек при каждом выборе ячейки. Это означает, что даже если ничего не изменилось, все 30 ячеек проверяют и перезапускают их форматирование, или все 30 «остальных» блоков запускаются каждый раз без необходимости. Это всего несколько сотен команд, но это определенно быстро ускоряет работу. Есть ли способ очистить это? В противном случае понадобится 30 ячеек * 11 строк кода, которые кажутся чрезмерными.

+1

Это поможет показать код, который запускает форматирование. Возможно, ваш код будет гораздо более кратким, если у нас будет немного больше контекста. –

+1

Я предполагаю, что вы пытаетесь добавить функцию «фокус» на ваш предел, а ваша «еще» часть сбрасывает все остальные границы. Но все, что вам нужно, чтобы сбросить предыдущую 1 выделенную ячейку. можете ли вы записать выбранную ячейку и сохранить ее в vba или скрытой ячейке и только сбросить эту ячейку в части «If»? – Larry

ответ

2

Вы не должны взывать границы индивидуально:

Dim wt as Long 

If Not Intersect(Target, Range("$D$4")) Is Nothing Then 
    wt = xlMedium 
Else 
    wt = xlThin 
End If 

Range("$B$5").Borders.Weight = wt 

Это не слишком ясно, как вы захватить выбор, но более быстрый подход мог бы установить весь диапазон xlThin, а затем обрабатывать выбранные ячейки.

0

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

'Make them all thin 
Range("B4:B10").Borders.Weight = xlThin 

If Not Intersect(Target, Range("D4:D9")) Is Nothing Then 
    'Make medium border on cell one below and two to the right 
    Target.Offset(1,-2).Borders.Weight = xlMedium 
End If 

Этот код принадлежит к событию Worksheet_SelectionChange. (По-видимому, вы уже знаете это.)

enter image description here

Ты право задать вопрос; почти нет причин для копирования-вставки кода несколько раз. Если вы обнаружите, что делаете это, тогда вам, вероятно, не хватает гораздо более простого способа делать что-то.

Смежные вопросы