【问题标题】:Keep duplicates but distinguish them保留重复但区分它们
【发布时间】:2020-03-07 21:39:24
【问题描述】:

我有一个很简单的问题。我将简化示例。我得到了 2 列的 excel 表。在第一列中,我想保留重复的项目,比如说 'apple' 。但在另一列中,它们有所不同,比如“绿色”、“红色”等。

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

有办法治疗吗?

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

并且A列中将有更多项目,并且所有项目都可以重复,例如appleapplepearorangeorangeorange ...

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

请帮忙:)

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

这只是一个简单的例子。

每次我搜索这个时,我只发现“如何删除重复项”:(。

编辑:

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

代码:

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

【问题讨论】:

  • edit您的问题并显示您的代码。你如何填充组合框?你如何获得文本框的值?阅读minimal reproducible example 可能会帮助您改进您的问题。
  • 利用AutoFilter 获取ComboBox 所需的行,但正如@Pᴇʜ 上面提到的,没有您当前的代码以及如何获取值,很难更具体.
  • 对不起,这部分的代码很简单,我没有意识到这很重要,而且我在我的手机上,因为电脑不在线 :) 但我会编辑
  • @Majkl 您必须使用多列组合框并从组合框的第二列填充文本框。否则你无法区分“Apple”和“Apple”。请参阅Inserting values into multicolumn combobox • 由于您没有展示如何填充组合框(请参阅我之前的评论),我们无法提供更详细的帮助。
  • 我知道,我正在努力 :) 但在电话上很糟糕:D

标签: excel vba duplicates userform


【解决方案1】:

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

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

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

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

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

另一种填充 ComboBox 的简单方法是使用 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 的值将自动成为数据的第一列。如果您需要更改它,请重新排序您的数据列。

【讨论】:

  • 是的,也许这是最好的解决方案,感谢漂亮的可视化:)
【解决方案2】:

这是一个非常简单的示例,说明如何解决该问题。我建议对类别(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

【讨论】:

  • 是的,看起来不错,工作正常,但我知道在这里可能没有意义,但我想一次只显示一种“颜色”。所以“盲目”选择第二个“梨”,它只会显示“蓝色”,当我选择第三个“梨”时,它只会显示“红色”等。这就是我使用文本框的原因:)。
  • @Majkl 正如我之前所说:因此,您必须使用多列组合框,其中第一列列出水果名称,第二列列出其颜色。否则你无法区分它们。
  • 好的,非常感谢,也许我会考虑listbox,我会考虑的,但无论如何感谢您的努力:)
  • @Majkl,我已经用另一部分编辑了答案,向您展示如何接近您前进的方向。然而,正如 Peh 所提到的,你觉得你将如何区分相同类型的类别?就目前而言,我强烈建议您重新考虑您的方法。
【解决方案3】:

您也可以使用单列组合框

这是您的用户表单代码窗格中的完整代码:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多