首页 > 解决方案 > 使用后组合框列表中的项目变灰,因此用户无法选择它们

问题描述

我有一个项目正在开发新位置的硬件部署。我有一个用户表单组合框,其中包含将分配给某些硬件项目(即信用卡机器)的 IP 地址列表。我试图找到一种方法,一旦选择使用其中一个 IP 地址,组合框列表中的项目要么被删除,要么变灰,用户无法重用。但是,如果由于某种原因 IP 重新可用,则该项目现在可以在列表中使用。硬件和 IP 和其他信息将添加到 Excel 中的表/数据库中。所以我假设我必须针对那个表/数据库来验证这个 IP 列表。但我不知道如何完成验证。我已经尝试过数据验证,但我想在基于组合框的 VBA 中进行验证。 在此处输入图像描述

这是输入 IP 地址组合框的当前代码。您可以输入单个 IP 或范围。

Private Sub Submit_Data_Click()
 Dim wb As Workbook, ws As Worksheet, rngTarget As Range
    Dim s1 As String, ip1 As Variant
    Dim s2 As String, ip2 As Variant
    Dim i As Integer, n As Integer

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Arrays")
    Set rngTarget = ws.Range("I" & Rows.Count).End(xlUp)

    If Me.Add_single_IP = True Then
        s1 = Me.sgle_IP_add_tb1
        s2 = s1
    Else
        s1 = Me.rge_IP_start_tb2
        s2 = Me.Rge_IP_End_tb2
    End If

    ' split string into bytes
    ip1 = Split(s1, ".")
    ip2 = Split(s2, ".")

    ' validate
    Dim msg As String
    If UBound(ip1) <> 3 Or UBound(ip2) <> 3 Then
        msg = "IP must be n.n.n.n"
    ElseIf ip1(3) > 255 Or ip2(3) > 255 Then
        msg = "Host must be 1 to 255"
    ElseIf ip1(3) > ip2(3) Then
        msg = s1 & " is greater then " & s2
    ElseIf ip1(0) <> ip2(0) Or ip1(1) <> ip2(1) Or ip1(2) <> ip2(2) Then
        msg = "Different networks"
    End If

    ' failed validation
    If Len(msg) > 0 Then
        MsgBox msg, vbCritical, s1 & "-" & s2
        Exit Sub
    End If

    ' calc range and write to sheet
    n = ip2(3) - ip1(3) + 1
    For i = 1 To n
       Set rngTarget = rngTarget.Offset(1, 0) ' move down
       rngTarget = Join(ip1, ".")
       ip1(3) = ip1(3) + 1
    Next
    MsgBox n & " addresses added ", vbInformation, s1 & "-" & s2
End Sub

在此处输入图像描述 就像我之前所说的......如果我可以在分配 IP 时从选择中删除它们,这样我们就没有重复项,然后如果不再使用硬件部件就能够再次使其可用,那就太好了。如果它更容易,那么允许它仍然可见但在列表中显示为灰色,当然不允许选择它并向用户添加一个 MsgBox 错误,表明 IP 已在使用中也可以正常工作。

组合框应将可用/未使用的 IP 写入名为 MstrInv 的工作表上的数据库表中的列 M。

在此处输入图像描述

感谢您的任何帮助。

标签: excelvbacomboboxuserform

解决方案


从组合框的 RowSource 中删除 Column I 并在窗体初始化时添加所需的项目。

Private Sub UserForm_Initialize()

    Dim ws As Worksheet, iLastRow As Long, i As Long
    Set ws = ThisWorkbook.Sheets("Arrays")
    Me.ComboBox1.Clear
    iLastRow = ws.Cells(Rows.Count, "I").End(xlUp).Row
    For i = 3 To iLastRow
        If Len(ws.Cells(i, "H")) = 0 Then ' not assigned
            Me.ComboBox1.AddItem ws.Cells(i, "I")
        End If
    Next

End Sub

推荐阅读