【问题标题】:Reduce amount of dimensions in an array减少数组中的维数
【发布时间】:2015-03-02 16:13:52
【问题描述】:

我有 Range(一维),我想通过连接所有值在一个单元格中进行汇总。我以为我可以这样做:

Dim Data_array()
Dim Source_Range as Range

Set Source_Range = Selection
Data_array() = Source_Range.Value2
Source_range.Offset( -1 ,0).Value = Join(Data_array, ", ")

然而,这会返回 error 5,因为 Data_array 是一个 (1 To X, 1 To 1) 数组,它有两个维度,而最后一行的 Join 要求您只提供一个维度数组。

所以我的问题是有没有办法删除“1 到 1”维度?
如果不是,您将如何在一个单元格中连接一维范围。

例子

     A
1    
2    2
3    4
4    6

想要的结果

     A
1    2, 4, 6
2    2
3    4
4    6

【问题讨论】:

  • 这行得通吗? Redim Data_Array(1 to X)
  • "脚本超出范围。"错误 9 谢谢
  • 嗯,你需要定义 X,我认为你有,因为你在你的例子中使用了它。 X = Source_Range.Count Redim Data_array(1 to x)

标签: arrays vba excel


【解决方案1】:

你离得太近了!下面的代码假定您将选择空目标单元格下方的单元格。我不仅仅是对原始代码的两个调整:

Sub testing()

    Dim Data_array()
    Dim Source_Range As Range

    Set Source_Range = Selection
    Data_array() = WorksheetFunction.Transpose(Source_Range.Value2)
    Source_Range.Offset(-1, 0).Resize(1, 1).Value = Join(Data_array, ", ")

End Sub

【讨论】:

    【解决方案2】:

    下面是一个想法。注意:我不确定您的代码中的 OFFSET 部分是否符合您的要求。测试代码,如果是,请告诉我。

    Dim Data_array()
    Dim Source_Range As Range
    Dim nIncrement As Integer
    
    Set Source_Range = Selection
    nIncrement = 1
    
    ReDim Data_array(1 To Source_Range.Rows.Count)
    For Each cel In Source_Range
        Data_array(nIncrement) = cel.Value
        nIncrement = nIncrement + 1
    Next cel
    
    Source_Range.Offset(-1, 0).Value = Join(Data_array, ", ")
    

    【讨论】:

      【解决方案3】:

      对于您的数据,我不会打扰 VBA 数组。考虑:

      Public Function Konkat(rin As Range) As String
          For Each r In rin
              v = r.Value
              If v <> "" Then
                  Konkat = Konkat & "," & v
              End If
          Next r
          Konkat = Right(Konkat, Len(Konkat) - 1)
      End Function
      

      这是因为在您的代码中,data_Array 实际上是一个二维数组。

      【讨论】:

        【解决方案4】:

        您可以使用 INDEX 工作表函数来切出一列或一行。

        Sub JoinRangeComma()
        
            Dim vaData As Variant
            Dim rSource As Range
            Dim wf As WorksheetFunction
        
            Set wf = Application.WorksheetFunction
            Set rSource = Selection
            vaData = rSource.Value2
            rSource.Cells(1).Offset(-1, 0).Value = Join(wf.Index(wf.Transpose(vaData), 1, 0), ", ")
        
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-15
          • 2017-08-22
          • 1970-01-01
          • 2018-08-01
          • 1970-01-01
          • 2015-06-18
          • 2011-03-25
          • 1970-01-01
          相关资源
          最近更新 更多