【问题标题】:Pasting a range of cells onto a same size target range with special conditions?在特殊条件下将一系列单元格粘贴到相同大小的目标范围?
【发布时间】:2016-04-12 11:01:21
【问题描述】:

感谢您帮助我。我在网上找不到解决方案,所以这里是:P。我想知道如何将一系列值(在本例中为 C6:R371)粘贴到另一个相同大小的工作表中。我的问题是我只想将源工作表中的数据粘贴到目标工作表上空白的单元格中,而不是更改目标工作表上已经在 C6:R371 范围内的值。本质上,我有一系列需要 c&p 的单元格,但我希望宏只将范围内的值粘贴到目标范围的空白单元格上。非常感谢你

    Range("C6:S371").Select
    Selection.Copy
    wbWest2.Activate
    Dim rng As Range 
    Dim row As Range 
    Dim cell As Range 
    Set rng = Range("D9:S374") 
    For Each row In rng.Rows 
    For Each cell in row.Cells 
    If cell.value = 0 then selection.paste 
    Next cell 
    Next row         

【问题讨论】:

  • 目标范围左上角的单元格是什么?您已声明它们的大小相同,但不是目的地的实际单元格地址。
  • D1:S374 的大小C6:S371 的大小相同。请澄清。
  • 好的。您想设置两个范围,而不仅仅是一个。因为它们在不同的工作表上,所以您想对它们进行限定,否则计算机如何知道每个范围在哪个工作表上?限定格式为sheet.range。编辑:还考虑更好的变量名。 srcRng 比简单的 rng 更好。
  • 你必须让 if 每次 b4 它复制另一个单元格时它在工作表之间来回移动,对吗?
  • 哈哈,感谢您的帮助,先生(或女士!)感谢您的帮助,您让我学到了很多 :)

标签: excel vba range conditional-statements copy-paste


【解决方案1】:

使用With ... End With statements 隔离两个工作表,以便它们的单元格是唯一考虑的单元格。最快的比较是将两个范围批量加载到变体数组中。

Sub fill_blanks_from_source()
    Dim r As Long, c As Long, aSRCs As Variant, aDSTs As Variant

    With Worksheets("Sheet1")     '<~~ source
        aSRCs = .Range("C6:R371").Value2
    End With
    With Worksheets("Sheet2")     '<~~ destination
        aDSTs = .Range("D9").Resize(UBound(aSRCs, 1), UBound(aSRCs, 2)).Value2
    End With

    For r = LBound(aDSTs, 1) To UBound(aDSTs, 1)
        For c = LBound(aDSTs, 2) To UBound(aDSTs, 2)
            If Not CBool(Len(aDSTs(r, c))) Then
                aDSTs(r, c) = aSRCs(r, c)
            End If
        Next c
    Next r

    With Worksheets("Sheet2")
        .Range("D9").Resize(UBound(aDSTs, 1), UBound(aDSTs, 2)) = aDSTs
    End With

End Sub

一旦满足比较条件并且目标中的空白值填充了源中的值,整个变体数组就会返回到目标工作表。

范围将始终保持相同的大小。将源值加载到第一个变量数组后,LBoundUBound 函数将用于从左上角的单元格扩展的目标范围的所有进一步尺寸标注。

【讨论】:

  • 这是迄今为止评估和传输大块值的最快方法,但请记住,格式不会被传递;只有原始值。这可能是一件好事,也可能是个问题,具体取决于个人情况。
  • 当我运行此代码时出现错误,在调试器中它突出显示行 If "Not CBool​​(Len(aDSTs(r, c))) Then" 并说 Len(aDSTs(r, c)) = ”以及“aDSTs(r, c) = Error 2015”@Jeeped
  • @VbaNoob - 你能看看this sample吗?如果它运行,也许您可​​以确定为什么目标中的值给您带来麻烦。这很可能是数据问题,因此无法远程诊断。
  • 我的荣幸。请勾选 Jeeped 答案左上角的复选框。
  • 没有。携带公式是一个完全不同的过程。
猜你喜欢
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
相关资源
最近更新 更多