【问题标题】:VBA, Array storing formulasVBA,数组存储公式
【发布时间】:2020-09-21 19:47:51
【问题描述】:

我有一个过滤数据、存储在数组中并将其粘贴到另一张表的代码。 为什么我的数组粘贴公式并留下空白值?我存储在数组中的值是公式,但我想粘贴这些值。

它应该存储这些值:

并粘贴它们,而是粘贴四个公式单元格。公式为=O10,为空等。

.Range("$A7:$AJ7").AutoFilter field:=35, Criteria1:="<>", Criteria2:="<>0", Criteria2:="<>-0"
    saLastRow = .Range("AI" & .Rows.Count).End(xlUp).Row

    Set sFiltered = Worksheets("BusinessDetails").Range("AI8:AI" & saLastRow).SpecialCells(xlCellTypeVisible) 'SA


    ReDim Arr(1 To sFiltered.Areas.Count)
    I = 0
    For Each V In sFiltered.Areas
        I = I + 1
        Arr(I) = V
        'Debug.Print I
   Next V
      
      sFiltered.Copy Sheets("Step 4 CM").Range("S10")

谢谢。

【问题讨论】:

  • V 将是一个范围,并且该范围可能并不总是一个单元格。区域是一组连续的单元格。所以Arr(I) = V 实际上是在创建一个数组数组,而不是一个简单的一维数组。还有处理Arr 的代码在哪里?复制/粘贴也将粘贴它在工作表复制区域中的公式。您可能希望使用 PasteSpecial 仅粘贴值。
  • Arr 可能是不必要的。尝试类似sFiltered.Copy Sheets("Step 4 CM").Range("S10").PasteSpecial Paste:=xlPasteValues 但出现编译错误。
  • 迭代区域然后迭代生成的范围,将值放入数组中。然后将数组批量加载到目标中。
  • 啊我好像听不懂。

标签: excel vba


【解决方案1】:

数组中介不需要复制数据,我也不会使用 sFiltered 范围。您只需要一个直接的 Copy 和 PasteSpecial。例如:

Sub TestFilteredRangeCopy()
    With ThisWorkbook.Worksheets("Sheet1")
        Dim rTable As Range: Set rTable = .Range("C3:D11")
        
        rTable.Columns(2).SpecialCells(xlCellTypeVisible).Copy
        
        .Range("C13").PasteSpecial xlPasteFormulas
        .Range("D13").PasteSpecial xlValues
    End With
End Sub

如果你确实想加载一个数组,那么这样的事情会起作用:

Sub TestFilteredRangeCopy()
    With ThisWorkbook.Worksheets("Sheet1")
        Dim rTable As Range: Set rTable = .Range("C3:D11")
        Dim v As Range, i As Long: i = 1
        Dim arr() As Variant
        
        If rTable.Columns(2).SpecialCells(xlCellTypeVisible).Cells.Count > 0 Then
            ReDim arr(1 To rTable.Columns(2).SpecialCells(xlCellTypeVisible).Cells.Count)
            For Each v In rTable.Columns(2).SpecialCells(xlCellTypeVisible)
                arr(i) = v.Formula  ' .Value
                i = i + 1
            Next v
            .Range("C13").Resize(UBound(arr) - LBound(arr) + 1, 1) = WorksheetFunction.Transpose(arr)
        End If
    End With
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多