【问题标题】:VBA Jagged Array to RangeVBA锯齿状数组到范围
【发布时间】:2017-05-06 02:59:41
【问题描述】:

我的宏遍历一个范围,按列循环,查找数字数据在每列中的开始位置,并将范围存储在一个锯齿状数组中(代码中的“矩阵”变体)。

之后,我想将整个矩阵返回到另一个工作表中的范围。如果我尝试将“matrix(1)”分配给我想要放置的范围,它工作正常,但如果我尝试将整个“矩阵”分配给一个范围,我会得到空白单元格。

如何在不使用循环的情况下一次将“矩阵”中的所有值返回到一个范围?

这是源数据,代码循环通过它:

我希望“矩阵”的所有行都返回如下:

这是我的代码:

       Sub MyMatrix()

        Dim wb1 As Workbook
        Set wb1 = ActiveWorkbook

        Dim wsNSA As Worksheet
        Set wsNSA = wb1.Worksheets("NSA")

        Dim wsSA As Worksheet
        Set wsSA = wb1.Worksheets("SA")

        Dim col As Range

        Dim matrix() As Variant


        'LR is the Last row and LC is the last column with data
        LR = wsNSA.Cells(1, 1).End(xlDown).Row
        LC = wsNSA.Cells(LR, 1).End(xlToRight).Column

        'Loops through columns and finds the row where numeric data begins
        For Each col In wsNSA.Range(wsNSA.Cells(1, 2), wsNSA.Cells(LR, LC)).Columns
        wsNSA.Activate
        nsa = wsNSA.Range(wsNSA.Cells(1, col.Column), wsNSA.Cells(LR, col.Column))

        num_linha = Application.Match(True, Application.Index(Application.IsNumber(nsa), 0), 0)
        nsa = wsNSA.Range(wsNSA.Cells(num_linha, col.Column), wsNSA.Cells(LR, col.Column))

    'The range starts in the column B in the worksheet, so the matrix ubound is 'col.column -1
        ReDim Preserve matrix(1 To col.Column - 1)
         matrix(col.Column - 1) = nsa

        Next

        wsSA.Range(wsSA.Cells(3, 2), wsSA.Cells(LR, LC)) = matrix


        End Sub

【问题讨论】:

  • 如果它是锯齿状的,最好的方法可能是遍历行,在单个语句中将每一行分配给一个范围。
  • 除了将matrix 用作值的临时存储之外,您是否在做任何事情?如果没有,ReDim Preserve 语句几乎肯定比简单地将每一行转储到循环中的wsSA 更昂贵。
  • 您希望输出返回时的样子?您是否希望将每个源列中的第一个数字项放置在目标的第 3 行,还是希望将源信息的每一行作为目标中的一行返回(但前导非数字单元格设置为空白)?也许更新您的问题以包括源数据的屏幕转储和您的预期输出。
  • 基于该示例输出,您确实最好将输出写入移动到循环内并摆脱matrix。你有什么理由不想在循环中写它?

标签: vba excel jagged-arrays


【解决方案1】:

您可以复制所有并删除之后的空白单元格:

Sheet1.Range("A3").CurrentRegion.Copy Destination:= Sheet2.Range("A3")

Sheet2.Range("A3").CurrentRegion.SpecialCells(xlCellTypeBlanks).Delete xlShiftUp

【讨论】:

    【解决方案2】:

    如果您愿意忘记输出不应写在循环内的要求,那么以下代码可能会满足您的要求:

    Sub MyMatrix()
    
        Dim wb1 As Workbook
        Set wb1 = ActiveWorkbook
    
        Dim wsNSA As Worksheet
        Set wsNSA = wb1.Worksheets("NSA")
    
        Dim wsSA As Worksheet
        Set wsSA = wb1.Worksheets("SA")
    
        Dim c As Long
        Dim LC As Long
        Dim LR As Long
        Dim num_linha As Long
        Dim nsa As Variant
    
        With wsNSA
            'LR is the Last row and LC is the last column with data
            '???? Is data1_linha declared anywhere and assigned a value? ????
            LR = .Cells(data1_linha, 1).End(xlDown).Row
            LC = .Cells(LR, 1).End(xlToRight).Column
    
            'Loops through columns and finds the row where numeric data begins
            For c = 2 To LC
                nsa = .Range(.Cells(1, c), .Cells(LR, c))
                num_linha = Application.Match(True, Application.Index(Application.IsNumber(nsa), 0), 0)
                wsSA.Cells(3, c).Resize(LR - num_linha + 1, 1).Value = .Range(.Cells(num_linha, c), .Cells(LR, c)).Value
            Next
        End With
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 2013-04-04
      • 2021-05-04
      • 2013-04-21
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2020-04-02
      相关资源
      最近更新 更多