2017-02-16 46 views
4

Я хочу установить массив цветов с помощью VBA.
Это было не просто, как я думал, что это будет.Как установить массив цветов с помощью vba?

с помощью Vb.NET вы можете объявить массив цвета так:

Dim ar() As Color = {Color.Yellow, Color.Red, Color.Green} 

так я пытался что-то similer в VBA (и не был настолько удивлен, что ошибка компиляции был выброшен, я задаюсь вопросом, какой тип данных vbYellow (Enum ?)):

Private Sub CommandButton1_Click() 

Dim ar(3) As Object 
Dim a, b, c As Object 

Set a = vbYellow 
Set b = vbRed 
Set c = vbGreen 

ar(0) = a 
ar(1) = b 
ar(2) = c 

End Sub 

спасибо.

+1

Как правило, вы можете щелкнуть правой кнопкой мыши по любому идентификатору в VB6 IDE, выбрать «Перейти к определению», и он покажет вам его тип данных и т. Д. Это даст понять, что vbYellow - это всего лишь числовой код (длинный), а не тип объекта. – DaveInCaz

+0

спасибо, я попытался найти что-то подобное в IDE – jonathana

ответ

7

vbYellow возвращает числовое значение, поэтому вам необходимо определить свою переменную как Long. Таким образом, до этого не нужно Set.

Вы можете использовать прямой подход, с ar(0) = vbYellow (вам не нужны переменные a, b0 как «средний человек»).

Private Sub CommandButton1_Click() 

Dim ar(3) As Long 
Dim a As Long, b As Long, c As Long 

a = vbYellow 
b = vbRed 
c = vbGreen 

ar(0) = a 
ar(1) = b 
ar(2) = c 

End Sub 
+0

thx, поэтому цвет не является объектом в vba ... Например, 'Interior.Color' принимает значение long int ... – jonathana

+0

@jonathana yes, он также принимает 'Long' –

6

В VBA/VB6 Object типа зарезервировано для переменных, которые содержат ссылку на объект . В отличие от .NET, не все является объектом - поэтому вы не можете назначить константу enum (в основном) целую сумму с именем 10).

Вместо этого используйте Variant тип, и вы можете встраивать декларацию массива с помощью функции Array:

Dim colors As Variant 
colors = Array(vbRed, vbGreen, vbBlue, vbYellow) 

Также в VB.NET это:

Dim a, b, c As Object 

Объявляет 3 Object переменные.

В VBA/VB6 однако, что декларирует c как Object, и оставляет a и b как неявные Variant переменных: вы хотите, чтобы избежать нескольких объявлений на одной и той же линии.

+0

Спасибо @ Мат's Кружка за четкое объяснение. – jonathana

+2

@jonathana мое удовольствие! обратите внимание на то, что ряд ошибок VBA (например, неявное типирование переменных) покрывается моей надстройкой VBE [Rubberduck] (http://rubberduckvba.com) и ее проверками кода. –

+1

Я знаю комментарии, чтобы добавить дополнительную ценность для обсуждения, но я должен сказать, что ваш проект Rubberduck очень впечатляет! – jonathana

1

Для VBA вы можете использовать эту функцию (я сделал это и успешно использовать в нескольких проектах)

Function GetColorFromColrName(ColrName As String) As Long 
    Dim rgbc As Long 
    Select Case ColrName 
    Case "red" 
     rgbc = RGB(255, 0, 0) 
    Case "brown" 
    rgbc = RGB(165, 42, 42) 
Case "coral" 
    rgbc = RGB(255, 127, 80) 
Case "orange red" 
    rgbc = RGB(255, 69, 0) 
Case "orange" 
    rgbc = RGB(255, 165, 0) 
Case "gold" 
    rgbc = RGB(255, 215, 0) 
Case "yellow" 
    rgbc = RGB(255, 255, 0) 
Case "yellow green" 
    rgbc = RGB(154, 205, 50) 
Case "lawn green" 
    rgbc = RGB(124, 252, 0) 
Case "green" 
    rgbc = RGB(0, 128, 0) 
Case "lime" 
    rgbc = RGB(0, 255, 0) 
Case "aqua" 
    rgbc = RGB(0, 255, 255) 
Case "blue" 
    rgbc = RGB(0, 0, 255) 
Case "blue violet" 
    rgbc = RGB(138, 43, 226) 
Case "dodgerblue" 
    rgbc = RGB(30, 144, 255) 
Case "dark magenta" 
    rgbc = RGB(139, 0, 139) 
Case "dark violet" 
    rgbc = RGB(148, 0, 211) 
Case "purple" 
    rgbc = RGB(128, 0, 128) 
Case "magenta" 
    rgbc = RGB(255, 0, 255) 
Case "chocolate" 
    rgbc = RGB(210, 105, 30) 
Case "black" 
    rgbc = RGB(0, 0, 0) 
Case "dim gray" 
    rgbc = RGB(105, 105, 105) 
Case "gray" 
    rgbc = RGB(188, 188, 188) 
Case "silver" 
    rgbc = RGB(192, 192, 192) 
Case "white" 
    rgbc = RGB(255, 255, 255) 
Case "" 

    End Select 
    GetColorFromColrName = rgbc 
End Function 

Все самое лучшее!

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

  • Нет связанных вопросов^_^