我正在为此制作一个条目数据,我实现了一个互联网代码来制作一个能够在一系列单元格内搜索的组合框。如果在数据验证列表中引用的值是绝对范围(例如='Posibles valores'!$P$4:$P$103
),则该代码运行良好。但我不想更新引用,而只是在表上创建新闻行。我试过这些方法:
创建一个包含函数的命名范围
=INDIRECT("Tubos_Tipo[Tubos-Tipos]"
。对表进行引用。但在这种情况下,组合框只显示表引用。这种方式在数据验证列表上对我有用,但不是不使用这个宏。另一方面,试图使用另一个函数的函数
=OFFSET('Posibles valores'!$P$4;0;0;COUNTA('Posibles valores'!$P$4:'Posibles valores'!$P$1000);1))
,但它给出了一个错误you cannot use reference operators (such as unions, intersections, and intervals), array constants, or the LAMBDA function for Validation of specific data
。
这是带有一些注释的可搜索组合框的代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim xCombox As OLEObject
Dim xStr As String
Dim xWs As Worksheet
Dim xArr
Set xWs = Application.ActiveSheet
On Error Resume Next
Set xCombox = xWs.OLEObjects("TempCombo")
With xCombox
.ListFillRange = ""
.LinkedCell = ""
.Visible = False
End With
If Target.Validation.Type = 3 Then
Target.Validation.InCellDropdown = False
Cancel = True
xStr = Target.Validation.Formula1
xStr = Right(xStr, Len(xStr) - 1)
Set nameRangeFormula = Application.ActiveWorkbook.Names(xStr)
nameRangeFormula = Right(nameRangeFormula, Len(nameRangeFormula) - 1)
Dim rangeFormula As Range
'Application.ActiveSheet.Select
'Set rangeFormula = Range(nameRangeFormula).Select
Set rangeFormula = Names(nameRangeFormula).RefersToRange
If xStr = "" Then Exit Sub
With xCombox
.Visible = True
.Left = Target.Left
.Top = Target.Top
.Width = Target.Width + 5
.Height = Target.Height + 5
'.ListFillRange = rangeFormula
.ListFillRange = xStr
If .ListFillRange = "" Then
xArr = Split(xStr, ",")
Me.TempCombo.List = xArr
End If
.LinkedCell = Target.Address
End With
xCombox.Activate
Me.TempCombo.DropDown
End If
Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 9
Application.ActiveCell.Offset(0, 1).Activate
Case 13
Application.ActiveCell.Offset(1, 0).Activate
End Select
End Sub
我对 VBA 的了解并不多于我在过去两周学到的知识。首先,我想知道是否有某种方法可以执行函数并返回 Range。在我认为不可能解决此问题的唯一方法是创建一个以表头引用作为参数的方法时,创建一个范围。
最后两件事,可搜索的宏功能用于每一列,并通过列表验证代码在其中。有什么方法可以选择排他的工作表和它们可以使用的列。此代码允许给出错误的结果。它只是用绿色角突出显示错误的字段,如果它是错误的,可以通过任何方式删除,或者像默认数据验证一样弹出窗口。
提前致谢
If Target.Column = 3 Or Target.Column = 4 Then
编辑:在做第一个 big 之前,我只为我想要的列激活了组合框if
。据我了解,每个“页面”都有自己的代码。这个对吗?