验证列表会自动将字符串转换为VBA中的日期

时间:2018-10-22 12:34:57

标签: excel vba

我正在尝试使用工作表的名称创建一个验证列表。第一部分,我将每个工作表的名称添加到数组中(表名类似于“ 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在代码运行后以不需要的转换工作表名称作为日期格式运行: enter image description here

即使在join()之后,我仍尝试使用CStr()来强制进行字符串转换,但现在我没有发现任何有效的方法。

非常感谢您的帮助

2 个答案:

答案 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