Код VBA возвращает строку в качестве переменной для расположения диапазона - PullRequest
0 голосов
/ 02 июля 2018

Появляется пользовательская форма, и пользователь делает различные выборы (одним из которых является CombobBox_Location), который затем вводится как переменная; например "C18"

Затем он объединяется со строками «Location_» и «UPC_» для создания переменных, которые ссылаются на именованные диапазоны под тем же именем; поэтому Location_C18 и UPC_C18 - это два именованных диапазона.

Я хочу сослаться на диапазон Location_C18 (состоящий из множества ячеек, не объединенных), чтобы увидеть, все ли они пусты.

Я также хочу установить значение Combobox_UPC.value в именованный диапазон UPC_C18.

Когда я запускаю код, я получаю сообщение об ошибке в строке If Range(LocationRow).Value <> 0 Then ... Я бы предположил, что это потому, что я его неправильно пишу. (Нормальные диапазоны используют кавычки, даже для именованных диапазонов, но поскольку это переменная, я не уверен.)

Я пытался затемнить строки, LocationRow и UPCRow как диапазоны и строки, но безуспешно.

Любая помощь приветствуется!

Private Sub OK_Click()
Application.ScreenUpdating = False

    Row = ComboBox_Location.Value

    LocationRow = "Location_" & Row
    UPCRow = "UPC_" & Row

        If Range(LocationRow).Value <> 0 Then

            If MsgBox("This row already has data. Are you sure you want to clear it and begin with a new UPC?", vbYesNo) = vbYes Then

                Range(UPCRow).Value = ComboBox_UPC.Value

                Range(LocationRow).Value = 0

            ElseIf MsgBox("This row already has data. Are you sure you want to clear it and begin with a new UPC?", vbYesNo) = vbNo Then

                'Do Nothing

            End If

        Else

            Range(UPCRow).Value = ComboBox_UPC.Value

            Range(LocationRow).Value = 0

        End If

    ComboBox_Location.Clear
    ComboBox_UPC.Clear
    Corresponding_Material.Value = ""
    Corresponding_Material_Description.Value = ""

    Change_Material.Hide

Application.ScreenUpdating = True
End Sub

1 Ответ

0 голосов
/ 02 июля 2018

Вам нужна функция быстрой проверки, чтобы увидеть, существует ли названный диапазон. Ваш тест Range(LocationRow).Value <> 0 выдаст ошибку, если это имя не определено.

Попробуйте это

Public Function NameIsDefined(ByVal name As String) As Boolean
    On Error Resume Next
    Dim notUsed As Long
    notUsed = Range(name).Rows.Count

    If Err = 1004 Then
        NameIsDefined = False
        Exit Function
    Else
        NameIsDefined = True
    End If
    On Error GoTo 0
End Function

Затем вы должны проверить все ячейки в этом диапазоне для данных (предположительно из вашего примера, что все ячейки должны иметь значение больше нуля):

Public Function CellsHaveData(ByRef dataArea as Range) As Boolean
    CellsHaveData = True
    Dim dataCell As Variant
    For Each dataCell In dataArea
        If dataCell.Value = 0 Then
            '--- if only one cell in the range is not zero, then
            '    we don't have data
            CellsHaveData = False
            Exit Function
        End If           
    Next dataCell
End Function

Тогда ваш собственный саб будет выглядеть как

Private Sub OK_Click()
    Application.ScreenUpdating = False
    Row = ComboBox_Location.Value
    LocationRow = "Location_" & Row
    UPCRow = "UPC_" & Row

    If NameIsDefined(LocationRow) Then
        If Not CellsHaveData(Range(LocationRow)) Then
            Dim answer As VbMsgBoxResult
            answer = MsgBox("This row already has data. Are you sure you want to " & _
                            "clear it and begin with a new UPC?", vbYesNo)
            If answer = vbYes Then
                Range(UPCRow).Value = ComboBox_UPC.Value
                Range(LocationRow).Value = 0
            ElseIf answer = vbNo Then
                'Do Nothing
            End If
        Else
            Range(UPCRow).Value = ComboBox_UPC.Value
            Range(LocationRow).Value = 0
        End If
    Else
        MsgBox "Named Range " & LocationRow & " does not exist.", vbOK
    End If

    ComboBox_Location.Clear
    ComboBox_UPC.Clear
    Corresponding_Material.Value = ""
    Corresponding_Material_Description.Value = ""

    Change_Material.Hide
    Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...