【问题标题】:VBA convert range to array and format dateVBA将范围转换为数组并格式化日期
【发布时间】:2011-12-01 03:31:41
【问题描述】:

我正在努力在 VBA 中转换为数组:

Dim list As Range
Set list = Range(series, series.End(xlDown))
list.Select
Dim table() As Variant
Set table = list.value

我的理解是value 返回一个数组对吗?我不明白为什么 VBA 告诉我我 "can't assign to array"

我的list 范围与 Excel 中的 Select 类似,我的目标是将其作为一个数组,以便我可以使用 Format(table.Rows(i).Columns(1).value, "yyyy-mm-dd") 之类的东西来格式化我的日期,在我的桌子上循环。

02-Sep-09   1.00
18-Sep-09   1.00
16-Oct-09   1.00
20-Nov-09   1.00
18-Dec-09   1.00
19-Mar-10   1.00
18-Jun-10   1.00

顺便问一下,可以原地修改表格吗?

谢谢!

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    这里有很多问题。

    问题 1

    Set table = list.value
    

    table 不是一个对象,所以你不能设置它。试试:

    table = list.value
    

    问题 2

    series 是与图表相关的 VBA 关键字。请选择一个名称,例如 MyWSTable,这对 VBA 没有任何意义。

    问题 3

    工作表名称本身不是范围。试试:

    Dim Table() As Variant
    Table = Names("MyWSTable").RefersToRange.Value
    

    注意:您不需要变量列表,也不需要选择范围。

    格式问题的答案

    以下代码将重新格式化您的日期:

    For inxrow = 1 To UBound(Table, 1)
      For inxcol = 1 To UBound(Table, 2)
        Table(inxrow, 1) = "ddd d mmm yyyyy"
        Table(inxrow, 2) = ""
      Next
    Next
    
    Names("MyWSTable").RefersToRange.NumberFormat = Table
    

    【讨论】:

    • 额外警告。除非您使用美国日期,否则将日期从工作表移动到数组然后再返回是不安全的。从工作表到数组的移动是可以的。但是,在向后移动时,如果日期可以解释为美国日期,那就是。因此,“2009 年 10 月 16 日”将保持不变,因为“16/10/2009”不是有效的美国日期,但“2009 年 9 月 2 日”将变为“2009 年 2 月 9 日”。在将数组复制到工作表或复制回工作表之前,您必须将日期转换为明确的字符串。
    • 如果您使用数字Date 数据类型,则不是这样;在这种情况下,日期表示为 IEEE 双精度。你是如何选择我岳父岳母的生日的?
    • 几年前我第一次尝试 Excel VBA 时就发现了这个问题。过了一段时间,我才意识到我的数据库中的许多日期都是错误的,然后我在确定原因之前进行了很多实验。我从日期变量开始,但我尝试了其他格式,但我发现在单元格中放置日期的唯一可靠方法是使用格式为 ddmmyyyy 的字符串。从那以后我一直保持相同的方法,所以这个错误可能在我没有注意到的情况下在更高版本的 Excel 中得到修复。您将不得不询问 jerome G 他从哪里得到的日期。
    • 我在之前的评论中从格式字符串中省略了一个“m”。我的意思是“ddmmmyyyy”。例如:2011 年 12 月 2 日。
    • SQL(至少 JET SQL)要求日期文字的美国日期格式,这可以解释为什么数据库日期不正确,但如果您有 VBA 日期类型值,则该值是纯数字并且 没有特定于文化的格式。 特定于文化的格式仅在您转换为字符串(例如,用于显示)或从字符串(例如,解析输入)时发挥作用。
    【解决方案2】:

    您可以删除您的选择:list.Select

    为确保在将范围分配给数组时不会出错,最好将数组声明为变体:

    Dim table As Variant
    table = Range(series, series.End(xlDown)).Value
    

    【讨论】:

      【解决方案3】:

      因为您使用 SET 来填充数组,所以弹出该错误消息。放下 SET,它应该会加载。

      你可以直接填写数组如下:

      Dim table() As Variant
      table=Range(series, series.End(xlDown))
      

      省略 Select 步骤可使您的代码更安全、更快速。

      很遗憾,您不能将值直接加载为日期。您将不得不遍历数组的每个项目并将它们转换为日期。

      【讨论】:

        【解决方案4】:

        你做错了。您应该使用范围的NumberFormat 属性来指定显示格式。像这样的:

        Range("A:A").NumberFormat = "yyyy-mm-dd"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-20
          • 2013-08-11
          相关资源
          最近更新 更多