Как передать перечисления как текст в VBA? - PullRequest
0 голосов
/ 10 октября 2019

Я создаю инструмент условного форматирования. Пользователь заполняет электронную таблицу, описывая, какие форматы он хотел бы добавить и где.

Мой VBA помечает каждый столбец в этой электронной таблице индексным номером столбца и передает каждый элемент в VBA, когда он проходит по каждой строке. .

У меня возникла ошибка несоответствия типов с этим оператором (ниже), и я решил проблему с передачей перечисления для аргументов Тип правила и Оператор в методе условий условия;VBA читает его как текст, тогда как из исследований я понимаю, что перечисления - это по существу длинные типы в текстовой форме (?).

    Sub s_ApplyFormats()

    Dim rng_FormattingInfo As Range
    Dim rng_RowItem As Range

    Const int_VBAFormatTypeCol As Integer = 2  'xlCellValue or xlExpression
    Const int_VBAOperatorCol As Integer = 4 'xlEqual, xlBetween, etc.
    Const int_FormulaCol As Integer = 5
    Const int_WorksheetCol As Integer = 6
    Const int_RangeCol As Integer = 7
    Const int_FormatCol As Integer = 8
    Const int_StopIfTrueCol As Integer = 10
    'The column numbers of the relevant columns in the Conditional Formatting admin worksheet

    Set rng_FormattingInfo = Range("rng_ConditionalFormattingData")
    'Contains all columns in the Conditional Formatting admin worksheet          

    For Each rng_RowItem In rng_FormattingInfo.Rows
        With Worksheets(rng_RowItem.Cells(int_WorksheetCol).Value2) _
         .Range(rng_RowItem.Cells(int_RangeCol)).FormatConditions _
          .Add(rng_RowItem.Cells(int_VBAFormatTypeCol).Value2, rng_RowItem.Cells(int_VBAOperatorCol).Value2, _
           rng_RowItem.Cells(int_FormulaCol))
            .Font.ColorIndex = rng_RowItem.Cells(int_FormatCol).Font.ColorIndex
            .Interior.ColorIndex = rng_RowItem.Cells(int_FormatCol).Interior.ColorIndex
        End With
    Next rng_RowItem

    End Sub

В качестве потенциального решения я мог бы создать поиск в книге, чтобы, когда пользовательвыбирает «xlCellValue» в электронной таблице, а перечисленное значение (1) передается в VBA. Это требует от меня составления списка строковых и числовых форм каждого перечисления.

Однако есть ли способ передать строковую форму перечисления в VBA из ячейки?

1 Ответ

0 голосов
/ 10 октября 2019

Редактировать:

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

Sub s_ApplyFormats()

    Dim rng_FormattingInfo As Range
    Dim rng_RowItem As Range
    Dim i As Long 'used in loop for row numbers
    Dim VBAFormatTypeCol As Excel.XlFormatConditionType, VBAOperatorCol As Excel.XlFormatConditionOperator

    Set rng_FormattingInfo = Range("rng_ConditionalFormattingData")       

    For Each rng_RowItem In rng_FormattingInfo.Rows
        i = i + 1
        With Worksheets(rng_RowItem.Cells(i, int_WorksheetCol).Value2)

            VBAFormatTypeCol = FormatTypeToXLEnum(CLng(Trim(rng_RowItem.Cells(i, int_VBAFormatTypeCol).Value2)))
            VBAOperatorCol = OperatorTypeToXLEnum(CLng(Trim(rng_RowItem.Cells(i, int_VBAOperatorCol).Value2)))

            With .Range(rng_RowItem.Cells(i, int_RangeCol))
                    .FormatConditions.Add(VBAFormatTypeCol, VBAOperatorCol, rng_RowItem.Cells(i, int_FormulaCol))
            End With 

            .Font.ColorIndex = rng_RowItem.Cells(i, int_FormatCol).Font.ColorIndex
            .Interior.ColorIndex = rng_RowItem.Cells(i, int_FormatCol).Interior.ColorIndex

        End With

        VBAFormatTypeCol = Empty
        VBAOperatorCol = Empty

    Next rng_RowItem

End Sub


Private Function FormatTypeToXLEnum(ByVal FormatType as Long) As Excel.XlFormatConditionType

    Select Case FormatType

        Case 1
            FormatTypeToXLEnum = xlCellValue

        Case 2
            FormatTypeToXLEnum = xlExpression 

    End Select

End Function 


Private Function OperatorTypeToXLEnum(ByVal OperatorType as Long) As Excel.XlFormatConditionOperator

    Select Case OperatorType

        Case 1
            OperatorTypeToXLEnum = xlBetween 

        Case 2
            OperatorTypeToXLEnum = xlNotBetween  

        Case 3
            OperatorTypeToXLEnum = xlEqual  

        Case 4
            OperatorTypeToXLEnum = xlNotEqual  

        Case 5
            OperatorTypeToXLEnum = xlGreater 

        Case 6
            OperatorTypeToXLEnum = xlLess  

        Case 7
            OperatorTypeToXLEnum = xlGreaterEqual  

        Case 8
            OperatorTypeToXLEnum = xlLessEqual   

    End Select

End Function 

Оригинал:

Попробуйте явно преобразовать значения ячеек в тип long. Подумайте о следующем:

'Define constants at the top of the module
Private Const int_VBAFormatTypeCol As Long = 2  'xlCellValue or xlExpression
Private Const int_VBAOperatorCol As Long = 4 'xlEqual, xlBetween, etc.
Private Const int_FormulaCol As Long = 5
Private Const int_WorksheetCol As Long = 6
Private Const int_RangeCol As Long = 7
Private Const int_FormatCol As Long = 8
Private Const int_StopIfTrueCol As Long = 10

Sub s_ApplyFormats()

    Dim rng_FormattingInfo As Range
    Dim rng_RowItem As Range
    Dim i As Long 'used in loop for row numbers
    Dim VBAFormatTypeCol As Long, VBAOperatorCol As Long

    Set rng_FormattingInfo = Range("rng_ConditionalFormattingData")       

    For Each rng_RowItem In rng_FormattingInfo.Rows
        i = i + 1
        With Worksheets(rng_RowItem.Cells(i, int_WorksheetCol).Value2)

            VBAFormatTypeCol = CLng(Trim(rng_RowItem.Cells(i, int_VBAFormatTypeCol).Value2))
            VBAOperatorCol = CLng(Trim(rng_RowItem.Cells(i, int_VBAOperatorCol).Value2))

            With .Range(rng_RowItem.Cells(i, int_RangeCol))
                    .FormatConditions.Add(VBAFormatTypeCol, VBAOperatorCol, rng_RowItem.Cells(i, int_FormulaCol))
            End With 

            .Font.ColorIndex = rng_RowItem.Cells(i, int_FormatCol).Font.ColorIndex
            .Interior.ColorIndex = rng_RowItem.Cells(i, int_FormatCol).Interior.ColorIndex

        End With

        VBAFormatTypeCol = Empty
        VBAOperatorCol = Empty

    Next rng_RowItem

End Sub

Попробуйте запустить его и посмотреть, что вы получите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...