我正在尝试使用工作表的名称创建一个验证列表。第一部分,我将每个工作表的名称添加到数组中(表名类似于“ 2018年1月”,“ 2018年2月”等),第二部分,通过用逗号分隔符连接数组的每个部分来创建列表。
问题是ValidationList将我的字符串(如“ January 2018”)转换为日期格式 “ Jan-18”。而且我不能继续执行我的代码,因为不尊重工作表名称...
这是我的代码:
Sub RefreshMonth()
Dim xsheet as Worksheets
Dim monthList(20) As String
Dim valList As String
''' This part add every sheet names on an array and work well '''
i = 0
For Each xsheet In ActiveWorkbook.Sheets()
If xsheet.Name Like "*20*" Then
monthList(i) = xsheet.Name
i = i + 1
End If
Next xsheet
'This part create the validation list, where the unwanted conversion happend '''
With Range("B1").Validation
.Delete
.Add Type:=xlValidateList, _
Formula1:=Join(monthList, ",")
End With
在这里,我的ValidationList在代码运行后以不需要的转换工作表名称作为日期格式运行:
即使在join()之后,我仍尝试使用CStr()来强制进行字符串转换,但现在我没有发现任何有效的方法。
非常感谢您的帮助
答案 0 :(得分:3)
尝试这种稍有不同的方法,首先将所有工作表名称保存在工作表中的某个位置(我已经使用了AA列,但可以更改此名称),然后分配此范围进行验证。
Sub RefreshMonth()
Dim xsheet As Worksheet
Dim valList As String
Dim validationrange As Range
i = 1
For Each xsheet In ThisWorkbook.Worksheets
If xsheet.Name Like "*20*" Then
Range("AA" & i).NumberFormat = "@"
Range("AA" & i) = xsheet.Name
i = i + 1
End If
Next xsheet
Set validationrange = Range("AA1:AA" & i - 1)
With Range("B1").Validation
.Delete
.Add Type:=xlValidateList, Formula1:="=" & validationrange.Address
End With
End Sub
答案 1 :(得分:1)
解决方案接近您的原始帖子
数据验证实际上将可以解释为日期的字符串转换为日期(根据本地设置中的语言)。
要解决您的问题,您将必须告诉应用程序只需要一个字符串。我尝试通过在您的Chr(1)
值分配中添加 MonthList(i)
字符来完成此任务。验证列表现在仅显示纯字符串值(例如January 2018
)作为选择,而返回的单元格值(手动验证后)现在为B1的单元格内容添加'
前缀,从而将其标记/保存为字符串( ►{'January 2018
)。因此,您可以克服上面您的帖子中描述的有害行为。
修改后的代码
Option Explicit
Sub RefreshMonth()
Dim xSheet As Worksheet ' corrected to data type WorkSheet
Dim monthList(20) As String
Dim valList As String
Dim i& ' added declaration (Long)
i = 0
For Each xSheet In ThisWorkbook.Worksheets
If xSheet.Name Like "*20*" Then
monthList(i) = xSheet.Name & Chr(1) ' << added chr(1) instead of prefixing apostrophe "'"
i = i + 1
End If
Next xSheet
'This unchanged part creates the validation list, but returns string values now (e.g. 'February 2018)
With Range("B1").Validation
.Delete
.Add Type:=xlValidateList, _
Formula1:=Join(monthList, ",")
End With
End Sub