保留重复但区分它们
Keep duplicates but distinguish them
我的问题很简单。我将简化示例。我得到了 2 列的 excel sheet。在第一列中,我想保留重复的项目,假设 'apple' 。但在另一列中,它们有所不同,可以说 'green'、'red' 等
我有带有组合框和文本框的用户表单。组合框与带有苹果的列相关,文本框与具有不同值(颜色)的列相关。当我在 Combobox 中选择项目时,它会在文本框中显示相关值。但是每次我在组合框中选择 Apple
时,它只会显示最后一个选项 - 在这种情况下为 red
。
有办法治疗吗?
A列的项目必须相同,不能是apple1
、apple2
等
并且A列中会有更多项,并且所有项都可以重复,例如apple
、apple
、pear
、orange
、orange
, 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
使用多列组合框并从组合框的第二列开始填充文本框。否则你无法区分 Apple
和 Apple
。
有关如何填充多列框的详细信息,请参阅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
您不需要按任何按钮,因为每次组合框更改时都会填充文本框
我的问题很简单。我将简化示例。我得到了 2 列的 excel sheet。在第一列中,我想保留重复的项目,假设 'apple' 。但在另一列中,它们有所不同,可以说 'green'、'red' 等
我有带有组合框和文本框的用户表单。组合框与带有苹果的列相关,文本框与具有不同值(颜色)的列相关。当我在 Combobox 中选择项目时,它会在文本框中显示相关值。但是每次我在组合框中选择 Apple
时,它只会显示最后一个选项 - 在这种情况下为 red
。
有办法治疗吗?
A列的项目必须相同,不能是apple1
、apple2
等
并且A列中会有更多项,并且所有项都可以重复,例如apple
、apple
、pear
、orange
、orange
, 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
使用多列组合框并从组合框的第二列开始填充文本框。否则你无法区分 Apple
和 Apple
。
有关如何填充多列框的详细信息,请参阅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
您不需要按任何按钮,因为每次组合框更改时都会填充文本框