2015-04-16 2 views
0

У меня есть таблица, в которой есть текстовые поля ActiveX, связанные с определенными ячейками. Когда число в ячейках изменяется, число в текстовом поле также изменяется. Довольно просто.Попытка упростить пошаговый макрос в VBA

Я хотел, чтобы числа в этих текстовых поля были красными, когда число больше нуля и белого, когда число равно нулю. Я выбрал белый цвет так, чтобы нули не отображались на печатной странице. У меня есть очень простой макрос, который делает это:

Sub textbox_change() 

Worksheets("PAGE01").E21.LinkedCell = "PAGE01!AB23" 
If Worksheets("PAGE01").E21.Value > 0 Then 
    Worksheets("PAGE01").E21.ForeColor = RGB(255, 0, 0) 
Else 
    Worksheets("PAGE01").E21.ForeColor = RGB(255, 255, 255) 
End If  

Worksheets("PAGE01").E22.LinkedCell = "PAGE01!AB24" 
If Worksheets("PAGE01").E22.Value > 0 Then 
    Worksheets("PAGE01").E22.ForeColor = RGB(255, 0, 0) 
Else 
    Worksheets("PAGE01").E22.ForeColor = RGB(255, 255, 255) 
End If 

End Sub 

Как вы можете видеть, код для каждого текстового поля завершается один на один раз. Как я могу объединить их так, чтобы макрос сразу менял эти цвета, без необходимости иметь блок кода для каждого текстового поля?

Примечание: Я использовал только два текстовых поля в примере, но я хотел бы иметь до 48 из этих ящиков. Это было бы много избыточности, когда я был бы уверен, что есть намного более короткий способ позаботиться об этих неприятных изменениях цвета.

Можете ли вы помочь добрым людям? Очень ценится ...

+0

Почему вы обновляя связанные ячейки для всех ваших флажков? Разве они уже не установлены? –

+0

Они настроены на печать как два отдельных отчета. Одним из отчетов будет таблица, в которой отображаются только цифры, и один отчет будет печататься как визуальная панель с изображениями, чтобы визуально представлять, что означают цифры. –

ответ

1

Вы можете перебираем OLEObjects коллекции листа и проверить текстовые поля:

Sub Tester() 
    Dim t 
    For Each t In Worksheets("PAGE01").OLEObjects 
     'is it a textbox ? 
     If t.progID = "Forms.TextBox.1" Then 
      'check the name begins with "E" 
      If t.Name Like "E*" Then 
       'Set the forecolor: using the built-in color constants, 
       ' but you could instead use specific RGB() values 
       t.Object.ForeColor = IIf(t.Object.Value > 0, vbRed, vbWhite) 
      End If 
     End If 
    Next t 
End Sub 
+0

Большое спасибо! –

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