【问题标题】:Combobox ElseIF statement组合框 ElseIF 语句
【发布时间】:2018-01-22 22:51:08
【问题描述】:

我已经为此工作了一段时间,我有一个带有 3 个组合框的用户表单,每个组合框都分配给一个值列表。我目前只能让第三个组合框工作“Storagebin”,一旦我选择一个值并按搜索,它就会填充剩余的框。 我正在寻找代码,无论我将文本放入什么组合框,都会返回值。使用提供的代码,“Oldmaterialnumber”和“Materialnumber”没有任何回报 谢谢!

Private Sub Search_Click()

If Len(Oldmaterialnumber.Text) <> 0 Then

row_number = row_number + 1
item_in_review = Sheets("Database").Range("B" & row_number)
If item_in_review = Oldmaterialnumber.Text Then
    Materialnumber.Text = Sheets("Database").Range("A" & row_number)
    Storagebin.Text = Sheets("Database").Range("C" & row_number)
    Olddescription.Text = Sheets("Database").Range("D" & row_number)
 End If


ElseIf Len(Materialnumber.Text) <> 0 Then

row_number = row_number + 1
item_in_review = Sheets("Database").Range("A" & row_number)
If item_in_review = Materialnumber.Text Then
    Oldmaterialnumber.Text = Sheets("Database").Range("B" & row_number)
    Storagebin.Text = Sheets("Database").Range("C" & row_number)
    Olddescription.Text = Sheets("Database").Range("D" & row_number)
End If



ElseIf Len(Storagebin.Text) <> 0 Then

row_number = 0
Do
DoEvents
row_number = row_number + 1
item_in_review = Sheets("Database").Range("C" & row_number)
If item_in_review = Storagebin.Text Then
    Materialnumber.Text = Sheets("Database").Range("A" & row_number)
    Oldmaterialnumber.Text = Sheets("Database").Range("B" & row_number)
    Olddescription.Text = Sheets("Database").Range("D" & row_number)
End If

Loop Until item_in_review = ""

End If
End Sub

【问题讨论】:

  • 你只是想让每个组合框都有相同的选择吗?例如。如果您在第一个组合框中选择第一项,那么其他两项也将显示第一项?
  • 嗨@DarrenBartrup-Cook。不,我有 4 列数据在单独的工作表上。目前我只能在“Storagebin”组合框中选择一个值,一旦我按下搜索,它就会在与该值相关的列中找到其他值。即我选择了 JVX-123,它也填充了 Materialnumber、Oldmaterialnumber 和 description 的组合框。我希望能够从任何组合框中选择任何值并让它更新其他字段

标签: vba excel


【解决方案1】:

尝试以下方法:

Private Sub Search_Click()
If Len(Oldmaterialnumber.Text) <> 0 Then
    lastrow = Sheets("Database").Cells(Sheets("Database").Rows.Count, "B").End(xlUp).Row
    For i = 1 To lastrow
        item_in_review = Sheets("Database").Range("B" & i)
        If item_in_review = Oldmaterialnumber.Text Then
            Materialnumber.Text = Sheets("Database").Range("A" & i)
            Storagebin.Text = Sheets("Database").Range("C" & i)
            Olddescription.Text = Sheets("Database").Range("D" & i)
            Exit For
        End If
    Next i
End If

If Len(Materialnumber.Text) <> 0 Then
    lastrow = Sheets("Database").Cells(Sheets("Database").Rows.Count, "A").End(xlUp).Row
    For i = 1 To lastrow
        item_in_review = Sheets("Database").Range("A" & i)
        If item_in_review = Materialnumber.Text Then
            Oldmaterialnumber.Text = Sheets("Database").Range("B" & i)
            Storagebin.Text = Sheets("Database").Range("C" & i)
            Olddescription.Text = Sheets("Database").Range("D" & i)
            Exit For
        End If
    Next i
End If

If Len(Storagebin.Text) <> 0 Then
    lastrow = Sheets("Database").Cells(Sheets("Database").Rows.Count, "C").End(xlUp).Row
    For i = 1 To lastrow
        item_in_review = Sheets("Database").Range("C" & i)
        If item_in_review = Storagebin.Text Then
            Materialnumber.Text = Sheets("Database").Range("A" & i)
            Oldmaterialnumber.Text = Sheets("Database").Range("B" & i)
            Olddescription.Text = Sheets("Database").Range("D" & i)
            Exit For
        End If
    Next i
End If
End Sub

【讨论】:

  • 你绝对做到了。谢谢一百万,花了很多时间!
【解决方案2】:

我采用了不同的方法。花了一点时间,但你可能仍然想看看。下面的代码将“数据库”工作表中的 A:D 列加载到表单上的 3 个组合框中,包括 D 列,它进入其中一个隐藏列(实际上是 CbxBin)。当您在其中一个组合框中选择一个项目时,其他项目会自动对齐,相互引用而不是工作表。不需要搜索按钮(实际上是搜索)。在表单上进行选择时会发生更新。因此,您在组合框中选择一个项目,然后单击其他地方(任何地方)进行更新。

这可能还不是最好的解决方案。我使用了组合框的Update 事件,以便您可以输入您的 CBX。如果您打算严格只从下拉列表中进行选择,请将代码更改为使用 Change 事件,该事件可为您提供即时更新,而无需单击其他位置。

要测试此代码,请将第一部分安装在标准代码模块(我想是您的 Module1)中,它会替换您现有的 Button1 过程。确保 Enum 位于代码表的顶部。

Option Explicit
    Enum Ndb                                        ' Database columns
        ' 22 Jan 2018
        NdbMatNum = 1                               ' 1 = column A
        NdbOldMatNum
        NdbBin
        NdbOldDesc
    End Enum

    Sub Button1()
        ' 22 Jan 2018

        Dim MyForm As SetCbxs

        Set MyForm = New SetCbxs
        MyForm.Show
        Unload MyForm
    End Sub

将用户窗体重命名为“SetCbxs”或更改上述代码以提及您的窗体名称。它在Button1 proc 中被提及两次,仅此而已。

在用户表单的代码表中安装代码的第二部分。表单必须有 3 个组合框,名为“CbxMatNum”、“CbxOldMatNum”和“CbxBin”。它还需要一个名为“TbxOldDesc”的文本框以及访问您的“DataBase”工作表以从中读取数据。该代码还提供了一个名为“CmdOK”的命令按钮。

Option Explicit

Private Sub UserForm_Initialize()
    ' 22 Jan 2018

    Dim Rng As Range
    Dim Arr As Variant
    Dim IsBin As Boolean
    Dim Rl As Long                              ' last row
    Dim C As Long                               ' column

    With Worksheets("Database")                 ' change as appropriate
        ' presume that all columns are of the same length
        Rl = .Cells(.Rows.Count, NdbMatNum).End(xlUp).Row
        For C = NdbMatNum To NdbBin             ' columns A:C
            IsBin = C = NdbBin                  ' include column D in CbxBin
            ' start in row 2, presuming that row 1 holds captions
            Set Rng = Range(.Cells(2, C), .Cells(Rl, C - CInt(IsBin)))
            Arr = Rng.Value
            With Me.Controls(CtlName(C))
                .List = Arr
                .ListIndex = 0
                .ColumnCount = 1 - CInt(IsBin)  ' 2 columns for CbxBin
                If IsBin Then
                    ' hide 2nd column in dropdown
                    .ColumnWidths = .Width - 8 & "pt, 0 pt"
                End If
            End With
        Next C
    End With
End Sub

Private Sub CmdOK_Click()
    ' 22 Jan 2018
    Me.Hide
End Sub

Private Sub CbxBin_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    ' 22 Jan 2018
    UpdateForm NdbBin
End Sub

Private Sub CbxMatNum_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    ' 22 Jan 2018
    UpdateForm NdbMatNum
End Sub

Private Sub CbxOldMatNum_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    ' 22 Jan 2018
    UpdateForm NdbOldMatNum
End Sub

Private Sub UpdateForm(ByVal CbxId As Ndb)
    ' 22 Jan 2018

    Dim i As Ndb
    Dim R As Integer

    Application.EnableEvents = False
    R = Me.Controls(CtlName(CbxId)).ListIndex
    For i = NdbMatNum To NdbBin             ' each of the 3 Cbx's
        If i <> CbxId Then
            Me.Controls(CtlName(i)).ListIndex = R
        End If
        TbxOldDesc.Text = CbxBin.Column(1)  ' Column is zero-based
    Next i
    Application.EnableEvents = True
End Sub

Private Function CtlName(ByVal Id As Long) As String
    ' 22 Jan 2018
    ' better not to repeat the names everwhere in the code:
    ' first item's index = 0
    CtlName = Split("CbxMatNum CbxOldMatNum CbxBin")(Id - 1)
End Function

【讨论】:

  • 嗨@variatus 只是想知道我应该为CbxID重命名什么,它给了我一个“未找到用户定义的类型”代码“Private Sub UpdateForm(ByVal CbxId As Ndb)”我尝试重命名到用户窗体,但也失败了。
  • VBA 抱怨 Enum Ndb 声称它丢失了。它应该在代码表的顶部,在任何程序之前。
  • 对不起,我对 VBA 很陌生,只是给了我一个运行时错误 70 Sub Button1() UserForm.Show End Sub 因为我设置了那个宏来显示用户窗体,所以我对 Ndb 进行了排序有问题,谢谢!
  • 刚刚意识到“Private Sub UserForm_Initialize()”正在这样做,这可能是导致错误的原因。
  • 我怀疑代码无法访问您的工作表。它可能受到保护或位于不同的文件夹中。你的原始代码在哪里?似乎可以正常访问工作表。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多