保留重复但区分它们

Keep duplicates but distinguish them

我的问题很简单。我将简化示例。我得到了 2 列的 excel sheet。在第一列中,我想保留重复的项目,假设 'apple' 。但在另一列中,它们有所不同,可以说 'green'、'red' 等

我有带有组合框和文本框的用户表单。组合框与带有苹果的列相关,文本框与具有不同值(颜色)的列相关。当我在 Combobox 中选择项目时,它会在文本框中显示相关值。但是每次我在组合框中选择 Apple 时,它只会显示最后一个选项 - 在这种情况下为 red

有办法治疗吗?

A列的项目必须相同,不能是apple1apple2

并且A列中会有更多项,并且所有项都可以重复,例如appleapplepearorangeorange , orange ...

这是一个糟糕的例子,但我希望它有意义

请帮忙:)

Private Sub Userform_click() 
Dim fruit As String
Dim color As String

row_number = 1

Do

fruit = Sheets("List1").Range("A" & row_number)
color = Sheets("List1").Range("B" & row_number)

If ComboBox1 = fruit Then
    TextBox1 = color
End If

row_number = row_number + 1

Loop Until fruit = ""

End Sub



Private Sub CommandButton1_Click()
Dim fruit As String

row_number = 2

With ComboBox1
    .Clear
End With

Do

fruit = Sheets("List1").Range("A" & row_number)

If fruit <> "" Then
    With ComboBox1
        .AddItem fruit
    End With
End If

row_number = row_number + 1

Loop Until fruit = ""

End Sub

这只是一个简单的例子。

每次我搜索这个我只找到 'how to remove duplicates' :(.

编辑:

好吧,伙计们,还有一件事,这是一张图片,其中说明了我想要做什么(再次),但是你能把完整的代码发给我吗(如果不是太复杂的话?)。我还是想不通。 (新手)

代码:

Private Sub CommandButton1_Click()
Dim fruit As String
Dim number As String

row_number = 1

With ComboBox1
    .Clear
End With

Do

number = Sheets("List1").Range("A" & row_number)
fruit = Sheets("List1").Range("B" & row_number)

If TextBox1 = number Then
    With ComboBox1
        .AddItem fruit
    End With
End If

row_number = row_number + 1

Loop Until fruit = ""

End Sub

Private Sub ComboBox1_Change()
Dim fruit As String
Dim fshape As String
Dim fcolor As String

row_number = 1

Do

fruit = Sheets("List1").Range("B" & row_number)
fshape = Sheets("List1").Range("C" & row_number)
fcolor = Sheets("List1").Range("D" & row_number)

If ComboBox1 = fruit Then
    TextBox2 = fshape
    TextBox3 = fcolor
End If

row_number = row_number + 1

Loop Until fruit = ""

End Sub

这是一个非常简单的示例,说明您可以如何解决该问题。我建议对类别(Apple、Pear、Orange)使用 ComboBox,对不同的产品使用 ListBox

示例数据如:

用户表单喜欢:

代码如下:

Private Sub UserForm_Initialize()
    Me.ComboBox1.List = Array("Apple", "Pear")
End Sub

Private Sub ComboBox1_Change()

With Sheet1 'Change according to your own sheets CodeName.
    Dim lr As Long: lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    Dim cl As Range, rng As Range: Set rng = .Range("A1:B" & lr)
    rng.AutoFilter 1, Me.ComboBox1.Value
    Dim arr As Variant: arr = rng.Columns(2).Offset(1).Resize(rng.Columns(2).Rows.Count - 1).SpecialCells(xlCellTypeVisible)
    Me.ListBox1.List = arr
    rng.AutoFilter
    Me.TextBox1.Value = ""
End With

End Sub

Private Sub ListBox1_Click()
    Me.TextBox1.Value = Me.ListBox1.Value
End Sub

结果:


您目前尝试的工作方式效率很低,但下面是您也可以解决这种方式的方法(但是@Peh 他的建议效率更高)

其他类型的用户表单:

新代码:

Private Sub UserForm_Initialize()

With 'Change according to your sheets CodeName
    Dim lr As Long: lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    Dim arr As Variant: arr = .Range("A2:A" & lr)
    Me.ComboBox1.List = arr
End With

End Sub

Private Sub ComboBox1_Change()

With Sheet1 'Change according to your sheets CodeName
    Me.TextBox1.Value = .Cells(Me.ComboBox1.ListIndex - 1, 2).Value
End With

End Sub

使用多列组合框并从组合框的第二列开始填充文本框。否则你无法区分 AppleApple

有关如何填充多列框的详细信息,请参阅Inserting values into multicolumn combobox

使用以下代码从组合框选择中填充文本框:

Private Sub ComboBox1_Change()
    Me.TextBox1.Text = Me.ComboBox1.List(Me.ComboBox1.ListIndex, 1)
End Sub

如果您希望第二列不可见,只需将其宽度设置为 0

填充组合框的另一种简单方法是使用 RowSource property:

Private Sub UserForm_Initialize()
    Dim DataRange As Range
    Set DataRange = ThisWorkbook.Worksheets("Sheet1").Range("A2:D7")

    With Me.ComboBox1
        .RowSource = DataRange.Address
        .ColumnCount = 4
        .ColumnWidths = "40;50;50;100"
        .ColumnHeads = True
    End With
End Sub

请注意,ComboBox 的值将自动成为数据的第一列。如果您需要更改它,请重新排序您的数据列。

您也可以使用单列组合框

这是用户窗体代码窗格中的全部代码:

Option Explicit

Dim fruits As Variant, colors As Variant

Private Sub ComboBox1_Change()
    If Me.ComboBox1.ListIndex <> -1 Then Me.TextBox1.Value = colors(Me.ComboBox1.ListIndex + 1, 1)
End Sub


Private Sub UserForm_Initialize()
    With Sheets("List1")
        With .Range("A2", .Cells(.Rows.Count, "A").End(xlUp))
            fruits = .Value
            colors = .Offset(, 1).Value
        End With
    End With
    Me.ComboBox1.List = fruits
 End Sub

您不需要按任何按钮,因为每次组合框更改时都会填充文本框