【问题标题】:Pasting data only into unprotected (unlocked) cells on a worksheet from another workbook仅将数据从另一个工作簿粘贴到工作表上未受保护(解锁)的单元格中
【发布时间】:2018-02-22 05:43:15
【问题描述】:

我正在尝试将数据从一个工作簿的工作表复制并粘贴到另一个工作簿(2 个不同的工作簿)。但是,只能将数据粘贴到目标工作表上未受保护的单元格中。两个工作表具有相同的结构。如果能得到你的帮助来调试它会很棒,这是我到目前为止所做的总结:

 Sub PasteData()

    Dim sourceWB As Workbook, targetWB As Workbook, sourceRange As Range, targetRange As Range, scell As Range, tcell As Range

    Set sourceWB = Workbooks.Open("Target.xlsx")
    Set sourceRange = sourceWB.Sheets("Tsheet").Range("D2:BE109")
    Set targetWB = Workbooks.Open("Source.xlsx")
    Set targetRange = targetWB.Sheets("Source").Range("D2:BE109")


   For Each tcell In targetRange
    For Each scell in Range sourceRange
      If Not tcell.Locked Then            
        If Not scell Is Nothing Then
                    Set tcell = scell
                End If
        End If
    Next scell
  Next tcell
End Sub

【问题讨论】:

  • 您遇到错误了吗?
  • 不,没有错误,但我只是没有看到目标工作簿上的数据
  • 只有tcell.Value = scell.Value,没有Set
  • 您当前正在为源中的每个单元检查目标中的每个单元。您正在进行 5832² 或 34,012,224 次检查,而不是 5832 次配对考试。

标签: vba excel


【解决方案1】:

将源单元格拉入一个二维变体数组。该数组将具有与目标单元矩阵相同的维度。

Sub PasteAPRA()

    Dim sourceWB As Workbook, sourceVals As variant
    dim targetWB As Workbook, targetRange As Range
    dim i as long, j as long

    Set sourceWB = Workbooks.Open("Target.xlsx", readonly:=true)
    sourceVals = sourceWB.Sheets("Tsheet").Range("D2:BE109").value2
    sourceWB.close savechanges:=false

    Set targetWB = Workbooks.Open("Source.xlsx")
    Set targetRange = targetWB.Sheets("Source").Range("D2:BE109")

    with targetRange 
       For i= lbound(sourcevals, 1) to ubound(sourcevals, 1)
           For j= lbound(sourcevals, 2) to ubound(sourcevals, 2)
               If Not .cells(i, j).Locked and not isempty(sourcevals(i, j)) Then            
                   .cells(i, j) = sourcevals(i, j)
               End If
           Next j
       Next i
    end with

End Sub

您自己的循环和赋值需要对单元格进行数字迭代并赋值,而不是 Set 对象。

dim c as long
For c=1 to targetRange.cells.count
    set tcell = targetrange.cells(c)
    set scell = sourceRange.cells(c)
    If Not tcell.Locked Then            
        If Not isempty(scell) Then
            tcell = scell.value
        End If
    End If
Next c

【讨论】:

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