基于新的基于VBA的Excel工作表,使用户可以根据一些后端标准/计算来输入一些数据并为其计算结果。
数据输入通过三列进行。第一个列出了产品的代码。根据产品的不同,用户还需要填写第2列或第3列。在另一页上是计算后的所有固定数据,包括两个包含所有产品的列表(每个产品仅在一个列表中)。根据产品所在的列表,确定需要填充哪一列,另一列更改为预定值(1或空单元格取决于产品所在的列表)。然后,不需要的单元格将被锁定,这样,当另一列保持解锁状态并能够进行数据输入时,用户甚至无法选择它。
我已经尝试了几种不同的方法来使它起作用,但到目前为止,没有任何一种方法可以将每个项目手动编码为VBA代码,如果要更改数据列表,这是一种不好的做法。确实证明其余代码似乎工作正常,并且如果我手动对其进行编码,则单元会根据需要进行更改/锁定/解锁,但这是一个开始。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ProductListA() As String
Dim ProductCountA As Integer
ProductCountA = Worksheets("Data").Range("D4").CurrentRegion.Rows.Count
'determines how many products are in the list
ReDim ProductListA(ProductCountA ) As String
ProductListA= Worksheets("Data").Range("D4").CurrentRegion.Value
'resizes ProductListA and populates with data from list, list is dynamically sized to account for any additions without needing to update code
'all above declarations etc is replicated for ProductListB with its corresponding list
'Checks if target is in either list
If IsInArray(Target.Value, ProductListA) Then
Target.Offset(0, 1).Value = 1
Target.Offset(0, 1).Locked = True
Target.Offset(0, 2).Locked = False
ElseIf IsInArray(Target.Value, ProductListB) Then
Target.Offset(0, 1).Value = ""
Target.Offset(0, 1).Locked = False
Target.Offset(0, 2).Locked = True
End If
End Sub
'Function checks if the target is in array
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function
似乎发生了两件事之一:
我将产品列表定义为字符串,当它尝试使用类型不匹配的数据为其分配数据时可能会失败,可能是由于产品列表中的多行项目无法分配给单个字符串。
我将产品列表定义为变体,运行代码,并将列表构建为字符串的变体。如果用户输入包含字母,则可以正常工作。但是,如果产品列表中的值是数字,则只会将其分配为variant-integer,而不是variant-string。在检查用户输入的数据是否在产品列表中时,由于试图将字符串与整数等进行比较而忽略了它,因此不会找到它。
任何建议将不胜感激。我感觉好像很接近,但是只是想念一件小东西。
答案 0 :(得分:0)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ProductListA()
Dim ProductCountA As Integer
ProductCountA = Worksheets("Data").Range("D4").CurrentRegion.Rows.Count
'determines how many products are in the list
ReDim ProductListA(ProductCountA )
ProductListA= Worksheets("Data").Range("D4").CurrentRegion.Value
'resizes ProductListA and populates with data from list, list is dynamically sized to account for any additions without needing to update code
'all above declarations etc is replicated for ProductListB with its corresponding list
'Checks if target is in either list
If IsInArray(Target.Value, ProductListA) Then
Target.Offset(0, 1).Value = 1
Target.Offset(0, 1).Locked = True
Target.Offset(0, 2).Locked = False
ElseIf IsInArray(Target.Value, ProductListB) Then
Target.Offset(0, 1).Value = ""
Target.Offset(0, 1).Locked = False
Target.Offset(0, 2).Locked = True
End If
End Sub
'Function checks if the target is in array
Function IsInArray(stringToBeFound, arr As Variant) As Boolean
IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function
答案 1 :(得分:0)
要添加到我上面的评论中:
{
'element1': {'element3', 'element2'},
'element2': {'element4', 'element1'},
'element3': {'element1'},
'element4': {'element2'}
}