【问题标题】:Direct value transfer instead of select copy/paste between workbooks直接价值转移,而不是在工作簿之间选择复制/粘贴
【发布时间】:2019-03-08 23:48:34
【问题描述】:

我可以使用录制的宏在工作簿之间选择复制/粘贴。它正在工作。但是,在阅读时,我正在学习有一种更快的方法,它不涉及复制/粘贴剪贴板。希望有人能帮助教我钓鱼。

让我解释一下发生了什么。

  • 打开主工作簿的 Excel,转到 FILE OPEN 然后打开文本文件。
  • 遍历文本分隔部分。
  • 在打开新文本工作簿时选择(“A2:G2000”)点击复制。
  • 回到主 excel 文件,找到您的工作表,找到您的 Range("B6:H6") 点击粘贴。

就是这样。

我将行四舍五入为 2000,因为这是一个安全的赌注,数据不会通过这一行。但是,我知道有更好的方法。目前,我收到 438 错误对象不支持此属性或方法。也许你可以帮助阐明这一点。

我将附上我的 vba 代码的副本,其中包含贯穿整个过程的 rem 语句。先感谢您。我只是在学习 stackoverflow 的设置,希望我能提前付款。谢谢你,布默

    `Sub import_data()
    '
    ' import_data Macro
    Dim wb1 As Workbook

    Application.ScreenUpdating = False

    'Using FILE-OPEN text file and run thru text delimited setup

  Workbooks.OpenText (Module33.FileDir + "\cf_data.txt"), Origin:=437, _
  StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
  ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
  , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), _
  Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1)), 
  TrailingMinusNumbers:=True

        'Applying the newly open excel workbook (text file)to a variable wb1
  Set wb1 = ThisWorkbook

         'Switching to the first sheet within this wb1 workbook
  With wb1.Sheets(1)

         'Selecting Columns A thru G and all rows in each columns that have 
          'values. text or numbers, no formulas.
  lr = .Range("A:G").Find(what:="*", after:=.Range("A1"), 
  searchorder:=xlByRows, _
  searchdirection:=xlPrevious).Row
  .Range(.Cells(2, "A"), .Cells(lr, "G")).Value          '<====Run-time 438 '- Object doesn't support this property or method

  End With

  wb1.Close SaveChanges:=False

        'Switches back to main workbook to sheet 2 then range B6 and paste 
        'all data

  Workbooks("Auto_Data.xlsm").Sheet2.Range("B6").Resize(UBound(arr, 
        1), UBound(arr, 2)) = arr


    'The code below does what I'm wanting however, it is very sluggish. This 
    'code, when in use, will sit just below text delimited section.

'    Range("A2:G2000").Select
'    Selection.Copy
'    Windows("Auto_Data.xlsm").Activate
'    Sheet2.Select
'    Range("B6:H6").Select
'    ActiveSheet.Paste
'    Selection.AutoFilter
'    Application.CutCopyMode = False
'    ActiveWindow.ActivateNext
'    ActiveWindow.Close
'    Range("B4").Select


Application.ScreenUpdating = True

End Sub

【问题讨论】:

    标签: excel vba copy-paste


    【解决方案1】:

    所以这里有一个简单的例子供你适应你的需要。您需要注意的是明确您对哪个工作簿、工作表和范围的引用。在这个例子中,唯一被复制的是数据。使用复制/粘贴更适合复制数据和嵌入格式(这不适用于您的情况)。

    Option Explicit
    
    Sub ImportData()
        Dim destWB As Workbook
        Set destWB = ThisWorkbook
    
        Dim textWB As Workbook
        Dim textWS As Worksheet
        Workbooks.OpenText "C:\Temp\testdata.txt", Space:=True
        Set textWB = ActiveWorkbook
        If textWB Is Nothing Then
            MsgBox "Unable to open the text data"
            Exit Sub
        Else
            Set textWS = textWB.Sheets(1)
        End If
    
        '--- determine the data range and copy to a memory-based array
        Dim lastRow As Long
        Dim lastCol As Long
        Dim textArea As Range
        Dim textData As Variant
        With textWS
            lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
            lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
            Set textArea = .Range("A1").Resize(lastRow, lastCol)
            textData = textArea
        End With
    
        Dim destWS As Worksheet
        Dim destArea As Range
        Set destWS = destWB.Sheets("Sheet1")
        Set destArea = destWS.Range("A1").Resize(lastRow, lastCol)
        destArea = textData
    
        textWB.Close SaveChanges:=False
    End Sub
    

    编辑: 更新了答案以解决 OP 的问题 厘米。

    Sub ImportData2()
        Dim destWB As Workbook
        Set destWB = ThisWorkbook
    
        Dim textWB As Workbook
        Dim textWS As Worksheet
        Workbooks.OpenText "C:\Temp\testdata.txt", Space:=True
        Set textWB = ActiveWorkbook
        If textWB Is Nothing Then
            MsgBox "Unable to open the text data"
            Exit Sub
        Else
            Set textWS = textWB.Sheets(1)
        End If
    
        Dim destWS As Worksheet
        Set destWS = destWB.Sheets("Sheet1")
    
        '--- first range to copy A2:A<lastRow> to destWS A2
        CopyData textWS, 1, 1, destWS, "A2"
    
        '--- second range to copy E2:E<lastRow> to destWS E2
        CopyData textWS, 5, 1, destWS, "E2"
    
        '--- third range to copy G2:J<lastRow> to destWS G2
        CopyData textWS, 7, 4, destWS, "G2"
    
        textWB.Close SaveChanges:=False
    End Sub
    
    Private Sub CopyData(ByRef srcWS As Worksheet, _
                         ByVal startColumn As Long, _
                         ByVal numberOfColumns As Long, _
                         ByRef destWS As Worksheet, _
                         ByVal destCell As String)
        Dim lastRow As Long
        Dim textArea As Range
        Dim textData As Variant
        With srcWS
            lastRow = .Cells(.Rows.Count, startColumn).End(xlUp).Row
            Set textArea = .Cells(2, startColumn).Resize(lastRow, numberOfColumns)
            textData = textArea
        End With
    
        Dim destArea As Range
        Set destArea = destWS.Range(destCell).Resize(textArea.Rows.Count, _
                                                     textArea.Columns.Count)
        destArea = textData
    End Sub
    

    【讨论】:

    • 谢谢 PeterT,感谢您提供的信息。我发誓有一天这对我来说是有意义的。我了解您的变量,并相信我可以保持正确。但是我的麻烦在于范围条目。 ?,。我的示例是(“A2:G2000”),在您的 [ WITH textWS ] 语句中,我是否会将 lastCol 设置插入为 7? A 到 G 列是 7 列。我的想法正确吗?
    • 并且使用 [ Set textArea = .Range("A2") ],textArea 将从第 (2,A) 行开始计算超过 7 列?我相信最后一个?是,使用您的 lastRow 和 lastCol 语句,这将检查从每列底部向上移动的数据?这是正确的想法吗?我的灯泡很暗,我知道的足够多,真的把事情搞砸了。大声笑再次感谢您帮助我。我很感激。
    • 您好 PeterT,在通过工作簿/工作表/文本数据引用工作后,我似乎已经完成了从 textData 到 destArea 的第一次成功传输。你说得对,这很棘手。代码的位置是关键。我已经解决了所有测距问题以使转移工作。但我很高兴能尝试更多这样的东西。我相信它应该使这个过程更有效率。 ?对你来说......由于这段代码非常适合批量数据传输,它可以用于不连续的多个列吗?我想我可以看到这方面的工作,但很长。
    • 我很高兴你让它工作。是的,我的代码会自动计算出您正在使用的数据范围的大小(行和列)。您可以执行非常相似的过程来复制多个不连续的列。例如,您可以获取 textArea 中的 A-E 列并复制到 textData,然后设置您的 destArea 并按上述方式复制。然后对另一组列重复相同的过程(例如 L-P,然后 R-S,W-Z)。每组列都是一个单独的步骤。
    • 这太棒了!!!!!!我受够了!!!!现在我开始考虑使用它来删除工作表数据。我们正在导入的数据块也将(或可能被删除)。现在有一个宏。并且工作得非常快。我认为它很快,因为它只是在工作簿中删除了我列出的 25 张工作表。但是,我最初为此使用了录制的宏。有几个 SELECT 语句和选择的 clearcontents。我打赌你给我看的,我也可以摆脱那些额外的 SELECT 语句。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多