Несовпадение типа 13 в VBA с инструкциями Case - PullRequest
1 голос
/ 01 ноября 2019

Я относительно новичок в программировании в Excel / VBA, но мне было поручено сделать простую кнопку в Excel. Цель этого состоит в том, чтобы использовать пользовательские вводы в одном диапазоне и затем возвращать значение в другом диапазоне после проверки определенных условий. Ниже вы можете найти мой код. Поэтому я сначала связал переменные с конкретными ячейками. Затем в бите button_click он проверяет операторы case / nested if ... then. Проблема в том, что он возвращает несоответствие типа 13 в строке «Дело« H232 »или« H250 », и я не уверен, как это исправить. Заранее спасибо!

РЕДАКТИРОВАТЬ: дать более подробную информацию о проекте. Пользователи должны вводить коды опасности (H-коды), используемые Гармонизированной системой GLOBAL (GHS) для маркировки опасностей различных продуктов. Пользователи должны ввести соответствующие коды в диапазоне H_Code_Input (что я теперь понимаю, неверно). Затем этот код предназначен для проверки введенных пользователем данных в соответствии с условиями, изложенными в моем случае выбора, а затем для получения данных в назначенных ячейках. Пронумерованные выходные сигналы помечены как условия или уровни серьезности. Я попытаюсь настроить его как цикл For Loop, проходящий через столбец вместо использования строки H_Code_Input.

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

Private Sub GetCellValue()
    'Preparing variable values for GHS by assigning them to output cells
    Dim Pyrophoric As Range
        Set Pyrophoric = Range("G5")
    Dim Gas_Under_Pressure As Range
        Set Gas_Under_Pressure = Range("G6")
    Dim Flammable_Gas As Range
        Set Flammable_Gas = Range("G7")
    Dim Liquefied_Gas As Range
        Set Liquefied_Gas = Range("G8")
    Dim Flammable_Liquid As Range
        Set Flammable_Liquid = Range("G9")
    Dim Oxidizing_Gas As Range
        Set Oxidizing_Gas = Range("G10")
    Dim Skin_Corrosion As Range
        Set Skin_Corrosion = Range("G11")
    Dim Eye_Irritant As Range
        Set Eye_Irritant = Range("G12")
    Dim Respiratory_Sensitizer As Range
        Set Respiratory_Sensitizer = Range("G13")
    Dim Skin_Sensitizer As Range
        Set Skin_Sensitizer = Range("G14")
    Dim Germ_Cell_Mutagen As Range
        Set Germ_Cell_Mutagen = Range("G15")
    Dim Carcinogen As Range
        Set Carcinogen = Range("G16")
    Dim Respiratory_Hazard As Range
        Set Respiratory_Hazard = Range("G17")
    Dim STORE As Range
        Set STORE = Range("G18")
    Dim STOSE As Range
        Set STOSE = Range("G19")
    Dim Environ_Acute As Range
        Set Environ_Acute = Range("G20")
    Dim Environ_Chronic As Range
        Set Environ_Chronic = Range("G21")
    Dim Ozone_Deplete As Range
        Set Ozone_Deplete = Range("G22")


    'Creating input range
    Dim H_Code_Input As Range
        Set H_Code_Input = Range("B5:B24")




End Sub

Private Sub CommandButton2_Click()
    'Establishing outputs based on user input H codes
    Select Case H_Code_Input
        Case H_Code_Input = "H232" Or "H250"
            Pyrophoric = 1
        Case "H280"
            Gas_Under_Pressure = 1
        Case "H224" Or "H225" Or "H226" Or "H227"
            If H_Code_Input.Value = "H224" Then
                Flammable_Gas = 1
            ElseIf H_Code_Input.Value = "H225" Then
                Flammable_Gas = 2
            ElseIf H_Code_Input.Value = "H226" Then
                Flammable_Gas = 3
            ElseIf H_Code_Input.Value = "H227" Then
                Flammable_Gas = 4
            End If
        Case "H270"
            Oxidizing_Gas = 1
        Case "H314" Or "H315" Or "H316"
            If H_Code_Input.Value = "H314" Then
                Skin_Corrosion = "1A, B, C"
            ElseIf H_Code_Input.Value = "H315" Then
                Skin_Corrosion = 2
            ElseIf H_Code_Input.Value = "H314" Then
                Skin_Corrosion = 3
            End If
        Case "H318" Or "H319" Or "H320"
            If H_Code_Input.Value = "H318" Then
                Eye_Irritant = 1
            ElseIf H_Code_Input.Value = "H319" Then
                Eye_Irritant = "2A"
            ElseIf H_Code_Input.Value = "H320" Then
                Eye_Irritant = "2B"
            End If
        Case "H334"
            Respiratory_Sensitizer = "1, 1A, 1B"
        Case "H317"
            Skin_Sensitizer = 1
        Case "H340" Or "H341"
            If H_Code_Input.Value = "H340" Then
                Germ_Cell_Mutagen = "1A, 1B"
            ElseIf H_Code_Input.Value = "H341" Then
                Germ_Cell_Mutagen = 2
            End If
        Case "H350" Or "H351-i" Or "H351"
            If H_Code_Input.Value = "H350" Or "H350-i" Then
                Carcinogen = "1A, 1B"
            ElseIf H_Code_Input.Value = "H351" Then
                Carcinogen = 2
            End If
        'Need Respiratory Hazard parameters
        Case "H372" Or "H373"
            If H_Code_Input.Value = "H372" Then
                STORE = 1
            ElseIf H_Code_Input.Value = "H373" Then
                STORE = 2
            End If
        Case "H335" Or "H370" Or "H371"
            If H_Code_Input.Value = "H335" Then
                STOSE = 3
            ElseIf H_Code_Input.Value = "H370" Then
                STOSE = 1
            ElseIf H_Code_Input.Value = "H371" Then
                STOSE = 2
            End If
        Case "H400" Or "H401" Or "H402"
            If H_Code_Input.Value = "H400" Then
                Environ_Acute = 1
            ElseIf H_Code_Input.Value = "H401" Then
                Environ_Acute = 2
            ElseIf H_Code_Input.Value = "H402" Then
                Environ_Acute = 3
            End If
        Case "H410" Or "H411" Or "H412" Or "H413"
            If H_Code_Input.Value = "H410" Then
                Environ_Chronic = 1
            ElseIf H_Code_Input.Value = "H411" Then
                Environ_Chronic = 2
            ElseIf H_Code_Input.Value = "H412" Then
                Environ_Chronic = 3
            ElseIf H_Code_Input.Value = "H413" Then
                Environ_Chronic = 4
            End If
        Case "H420"
            Ozone_Deplete = 1

    End Select

End Sub

Ответы [ 3 ]

4 голосов
/ 01 ноября 2019
Case "H224" Or "H225" Or "H226" Or "H227"

Анализируется как побитовое или выражение, что недопустимо для операндов String;вам нужен список альтернатив через запятую:

Case "H224", "H225", "H226", "H227"

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

Я бы настоятельно рекомендовал прочитать о области видимости и установить флажок «Требуется объявление переменной» в параметрах VBIDE, чтобы Option Explicit систематически добавлялся в каждый модуль.

Rubberduck (отказ от ответственности: я управляю этим проектом с открытым исходным кодом). Проверки кода предупредят вас обо всех этих неиспользуемых переменных, а также обо всех неявно объявленных переменных.

0 голосов
/ 04 ноября 2019

Этот новый код возвращает правильные значения, как и предполагалось. Сейчас я собираюсь распечатать больше информации о H-коде в других колонках. Спасибо за помощь, ребята!

Option Explicit

Private Sub CommandButton1_Click () 'Установить переменную счетчика Dim i As Integer

'Preparing variable values for GHS by assigning them to output cells
Dim Pyrophoric As Range
    Set Pyrophoric = Range("G5")
Dim Gas_Under_Pressure As Range
    Set Gas_Under_Pressure = Range("G6")
Dim Flammable_Gas As Range
    Set Flammable_Gas = Range("G7")
Dim Liquefied_Gas As Range
    Set Liquefied_Gas = Range("G8")
Dim Flammable_Liquid As Range
    Set Flammable_Liquid = Range("G9")
Dim Oxidizing_Gas As Range
    Set Oxidizing_Gas = Range("G10")
Dim Skin_Corrosion As Range
    Set Skin_Corrosion = Range("G11")
Dim Eye_Irritant As Range
    Set Eye_Irritant = Range("G12")
Dim Respiratory_Sensitizer As Range
    Set Respiratory_Sensitizer = Range("G13")
Dim Skin_Sensitizer As Range
    Set Skin_Sensitizer = Range("G14")
Dim Germ_Cell_Mutagen As Range
    Set Germ_Cell_Mutagen = Range("G15")
Dim Carcinogen As Range
    Set Carcinogen = Range("G16")
Dim Respiratory_Hazard As Range
    Set Respiratory_Hazard = Range("G17")
Dim STORE As Range
    Set STORE = Range("G18")
Dim STOSE As Range
    Set STOSE = Range("G19")
Dim Environ_Acute As Range
    Set Environ_Acute = Range("G20")
Dim Environ_Chronic As Range
    Set Environ_Chronic = Range("G21")
Dim Ozone_Deplete As Range
    Set Ozone_Deplete = Range("G22")

'For Loop to run Select Case to print category
For i = 5 To 24
    Select Case Cells(i, 2)
        Case "H232", "H250":    Pyrophoric = 1
        Case "H280":            Gas_Under_Pressure = 1
        Case "H220":            Flammable_Gas = 1
        Case "H221":            Flammable_Gas = 2
        Case "H224":            Flammable_Liquid = 1
        Case "H225":            Flammable_Liquid = 2
        Case "H226":            Flammable_Liquid = 3
        Case "H227":            Flammable_Liquid = 4
        Case "H270":            Oxidizing_Gas = 1
        Case "H314":            Skin_Corrosion = "1A, 1B, 1C"
        Case "H315":            Skin_Corrosion = 2
        Case "H316":            Skin_Corrosion = 3
        Case "H318":            Eye_Irritant = 1
        Case "H319":            Eye_Irritant = "2A"
        Case "H320":            Eye_Irritant = "2B"
        Case "H334":            Respiratory_Sensitizer = "1, 1A, 1B"
        Case "H317":            Skin_Sensitizer = 1
        Case "H340":            Germ_Cell_Mutagen = "1A, 1B"
        Case "H341":            Germ_Cell_Mutagen = 2
        Case "H350", "H350-i":  Carcinogen = "1A, 1B"
        Case "H351":            Carcinogen = 2
        Case "H372":            STORE = 1
        Case "H373":            STORE = 2
        Case "H335":            STOSE = 3
        Case "H370":            STOSE = 1
        Case "H371":            STOSE = 2
        Case "H400":            Environ_Acute = 1
        Case "H401":            Environ_Acute = 2
        Case "H402":            Environ_Acute = 3
        Case "H410":            Environ_Chronic = 1
        Case "H411":            Environ_Chronic = 2
        Case "H412":            Environ_Chronic = 3
        Case "H413":            Environ_Chronic = 4
        Case "H420":            Ozone_Deplete = 1
    End Select

Next i

End Sub

0 голосов
/ 01 ноября 2019

Примерно так:

'...
Case "H318" Or "H319" Or "H320"
        If H_Code_Input.Value = "H318" Then
            Eye_Irritant = 1
        ElseIf H_Code_Input.Value = "H319" Then
            Eye_Irritant = "2A"
        ElseIf H_Code_Input.Value = "H320" Then
            Eye_Irritant = "2B"
        End If
 '...

функционально эквивалентен (при условии, что вы должны были включить исправление Матье) в:

        '...
        Case "H318": Eye_Irritant = 1
        Case "H319": Eye_Irritant = "2A"
        Case "H320": Eye_Irritant = "2B"
        '...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...