我有一个非常具体的用例,我需要读取每个单元格的数据验证字段中输入的值。 如果该值是一个列表,则该值应按原样存储在字符串中。但是,如果它是范围或命名范围,则应破译范围,然后将值转换为列表并存储。
例如,如果验证为“活动、非活动”,则 permissible_values =“活动、非活动” 如果验证为“=Sheet1!A1:A4”,则如果 A1 =“是”、A2 =“否”、A3 =“可能”且 A4 =“NA”,则 permissible_values =“是、否、也许、NA”
我已经能够从验证字段中读取值,但是如何破译字符串中的值是列表还是范围?
Temp = Range(Cells(5, Counter).Address).Validation.Formula1
Temp = Right(Temp, Len(Temp) - 1)
Sheet1.Select
Set Temp2 = Range(Temp)
New_Sheet.Cells(Counter + 1, 3).Value = TJoin(";", Temp2)
我使用上面的代码来读取范围值并从中创建一个字符串。但这不适用于静态。无法为此形成 if 条件。另外,在上面的代码中,如果它是一个范围,那么当前sheet不是一个变量。我在代码中手动选择 Sheet1,然后选择范围。我可以使工作表选择也可变,这可以根据验证中的值来完成吗?
不是完整的答案,但您可以尝试按照这些思路进行操作。
Public Function get_validation_summary(rngCell As Range) As String
Dim v As Validation
Dim r As Range
Dim a() As Variant
Set v = rngCell.Validation
Set r = is_range((Right(v.Formula1, Len(v.Formula1) - 1)))
If Not r Is Nothing Then
a = Application.Transpose(r)
get_validation_summary = Join(a, ",")
Else
get_validation_summary = v.Formula1
End If
End Function
Public Function is_range(strFormula As String) As Range
On Error GoTo eHandle:
Set is_range = Range(strFormula)
exit_function:
Exit Function
eHandle:
Set is_range = Nothing
GoTo exit_function
End Function