【问题标题】:excel copy all from workbook 2, paste in workbook [duplicate]excel从工作簿2中复制所有内容,粘贴到工作簿中[重复]
【发布时间】:2017-08-15 02:50:36
【问题描述】:

我正在尝试从我的服务器上的工作簿中复制所有数据并将values 粘贴到另一个工作簿中的B2。

这是我目前所拥有的。它把我带到了工作簿 2,但我必须手动选择全部并复制然后粘贴到工作簿 1 中。

Sub UpdateTSOM()
    Application.ScreenUpdating = False
    Dim LastRow As Long
    Dim StartCell As Range

    Set sht = Sheet5
    Set reportsheet = Sheet5
    Set StartCell = Range("B2")

    'Refresh UsedRange
    Worksheets("TSOM").UsedRange

    'Find Last Row
    LastRow = sht.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

    'Select Range
    sht.Range("B2:B" & LastRow).Select
    With Range("B2:B" & LastRow)

        If MsgBox("Clear all Transmission Stock data?", vbYesNo) = vbYes Then

            Worksheets("TSOM").Range("B2:N2000").ClearContents

            MsgBox ("Notes:" & vbNewLine & vbNewLine & _ 'This is not needed if I can automate the copy and paste.
            "Copy ALL" & vbNewLine & _
            "Paste as Values")
        End If
    End With
    Workbooks.Open "P:\ESO\1790-ORL\OUC\_Materials\Stock Status\Transmission Stock Status **-**-**.xlsx"
    ThisWorkbook.Activate

    reportsheet.Select
    Range("B2").Select

    whoa: 'If filename changes then open folder
    Call Shell("explorer.exe" & " " & "P:\ESO\1790-ORL\OUC\_Materials\Stock Status", vbNormalFocus)
    Range("B2").Select
    Application.ScreenUpdating = True
End Sub

谢谢

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    一些猜测,因为您没有提供所有详细信息

    Sub UpdateTSOM()
    
    Application.ScreenUpdating = False
    
    Dim LastRow As Long
    Dim StartCell As Range
    Dim sht As Worksheet
    Dim wb As Workbook
    
    Set sht = Sheet5
    Set StartCell = sht.Range("B2")
    
    'Find Last Row
    LastRow = sht.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    
    If MsgBox("Clear all Transmission Stock data?", vbYesNo) = vbYes Then
        Worksheets("TSOM").Range("B2:N2000").ClearContents
    End If
    
    Set wb = Workbooks.Open("P:\ESO\1790-ORL\OUC\_Materials\Stock Status\Transmission Stock Status **-**-**.xlsx")
    wb.Sheets(1).UsedRange.Copy
    StartCell.PasteSpecial xlValues
    
    Application.ScreenUpdating = True
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      避免使用SendKeys,因为您只是粘贴值,因此您不需要使用任何一个 Copy 或Paste/PasteSpecial。

      With wsCopyFrom.Range("A1:N3000")
          wsCopyTo.Range("B2").Resize(.Rows.Count, .Columns.Count).Value = .Value 
      End With
      

      以下是将值从一个文件复制到另一个文件的其他几种方法:

      Copy from one workbook and paste into another

      【讨论】:

        【解决方案3】:

        这就是我要工作的。它会打开一个选择文件夹并将其中的所有数据复制到我当前的工作簿中。然后它用不带扩展名的文件名命名 B1(我的标题)。

        Sub UpdateTSOM()
        Application.ScreenUpdating = False
        Dim vFile As Variant
        Dim wbCopyTo As Workbook
        Dim wsCopyTo As Worksheet
        Dim wbCopyFrom As Workbook
        Dim wsCopyFrom As Worksheet
        Dim s As String
        
        Set mycell = Worksheets("TSOM").Range("B1")
        Set wbCopyTo = ActiveWorkbook
        Set wsCopyTo = ActiveSheet
        
        If MsgBox("Update transmission Stock Status data?", vbYesNo) = vbYes Then
        Worksheets("TSOM").Range("B2:N3000").ClearContents
        Else: Exit Sub
        End If
        
        'Locate file to copy data from
        vFile = Application.GetOpenFilename("Excel Files (*.xl*)," & _
        "*.xl*", 1, "Select Excel File", "Open", False)
        
        'Assign filename to Header
        s = Mid(vFile, InStrRev(vFile, "\") + 1)
        s = Left$(s, InStrRev(s, ".") - 1)
        mycell.Value = s
        
        Set wbCopyFrom = Workbooks.Open(vFile)
        Set wsCopyFrom = wbCopyFrom.Worksheets(1)
        
        'Copy Range
        wsCopyFrom.Range("A1:N3000").Copy
        wsCopyTo.Range("B2").PasteSpecial Paste:=xlPasteValues, _
        Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        
        SendKeys "Y"
        SendKeys ("{ESC}")
        
        'Close file that was opened
        wbCopyFrom.Close SaveChanges:=False
        Application.Wait (Now + 0.000005)
        Call NoSelect
        Exit Sub
        
        End Sub
        

        【讨论】:

        • 你为什么使用SendKeys?
        • 另外,代替你的s = Mid(vFile, InstrRev(vFile, "\"), + 1) 只需做s = Dir(vFile)。
        • my sendkeys 用于关闭可能的“大副本”弹出框。无论如何@DavidZemens?
        • 是的,禁用 Application.DisplayAlerts 应该强制使用 default 选项并禁止该对话框。或者您可以进行直接赋值(无需调用Copy 或Paste/PasteSpecial),这将完全避免任何警告。
        猜你喜欢
        • 2016-10-25
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        相关资源
        最近更新 更多