我想在我的 excel 工作簿中进行一些数据验证。我想使用尽可能多的集中值进行数据验证,因为相同的值用于多张工作表。现在我添加了一些货币代码 (USD...) 验证。验证基于另一张工作表中的列表,并且工作得很好。我的问题是我仍然可以输入小写值,而不仅仅是精确值。我更希望不使用 VBA 的解决方案。如果只能使用 VBA,请添加一些有关如何将其添加到工作簿等的信息。
我想要允许的值是:
CHF
EUR
GBP
USD
DKK
SEK
NOK
数据验证如下所示:=Sheet1!$S$2:$S$8
但也允许上面的值为小写,这不是我想要的(我看到我可以在数据验证中列出值,然后它只接受精确匹配,但为了在值发生变化时不进行太多工作,我希望将它们集中起来)。
我认为将值转换为大写也足够了,但它必须在同一个单元格中发生,例如,我eur
在单元格中输入J6
,然后它应该将值转换为大写并将其写入J6
答案1
我找到了一个使用 VBA 的解决方案:
右键单击工作表的选项卡并选择“显示代码...”。在 VBA 编辑器中输入以下宏:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:C100")) Is Nothing Then
On Error GoTo ErrorHandler
Application.EnableEvents = False
Target.Value = UCase(Target)
ErrorHandler:
Application.EnableEvents = True
End If
End Sub
根据需要更改范围。您必须将文件另存为*.xlsm
。然后范围内的每个文本都会转换为大写。
答案2
如果要验证的单元格位于单元格 A1 中,请将数据验证类型设置为风俗而不是列表并粘贴此公式:
=AND(SUMPRODUCT(--((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>64)),--(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<91))=LEN(A1),--(IFERROR(IF(MATCH(A1,Sheet1!$S$2:$S$8,0),1),0)))
演练
此公式使用两个条件,结合AND()
- 首先检查值是否全部大写,其次检查值是否与允许的选项列表相匹配。
=AND(
SUMPRODUCT(
--(
(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>64)
)
,--(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<91)
)=LEN(A1)
,--(IFERROR(IF(MATCH(A1,Sheet1!$S$2:$S$8,0),1),0)))
看起来像的位CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>64
正在检查每个字符的 ASCII 码。如果它们在 ASCII 码 64 和 91 之间,我们就知道它们是大写字母。如果大写字母的数量与值字符串的长度匹配,我们就知道它们都是大写字母。
该MATCH()
部分检查您的货币列表中出现的价值。
笔记:呼喊这个帖子用于大写检查。