代码之家  ›  专栏  ›  技术社区  ›  Rich Prag

VBA试图指定新创建的工作簿而不是activeworkbook(将一些数据粘贴到新工作簿中)

  •  2
  • Rich Prag  · 技术社区  · 7 年前

    我有一些复制数据的代码,然后我希望它创建一个新工作簿,并将复制的数据粘贴到新工作簿中。目前代码使用 ActiveSheet.Range("A1").PasteSpecial 等等,如果新创建的工作簿是活动工作表,那么这很好,但如果不是,那么显然不起作用。这是整个潜艇(带有一些 stop 标记,因为我一直在调试它):

    Sub ExportToCSV()
    Dim ws As Worksheet, xFolder As String, xName As String
    Dim InitialFoldr$
    
    InitialFoldr$ = "L:\107xxx\1077898 A34 Oxford junctions 1718\200 M & A"
    
    MsgBox ("Choose where to save the Paramics demands")
    xFolder = GetFolder(InitialFoldr$)
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name Like "*PDMND" Then
            xName = ws.Name
            ws.Range("BJ4:CK82").Copy
            'Stop
            With CreateObject("Excel.Application")
                .Workbooks.Add
                .Visible = True
            End With
            ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteValues
            Stop
            ActiveWorkbook.SaveAs Filename:=xFolder + "\" + xName + ".csv", FileFormat:=xlCSV, CreateBackup:=False
    
            Application.DisplayAlerts = False
            ActiveWorkbook.Close
            Application.DisplayAlerts = True
        End If
        'Stop
    Next
    End Sub
    

    之后 with 循环创建新工作簿时,我想创建一个引用新工作簿的变量,然后我可以使用该变量将数据粘贴到正确的位置,或者类似的地方,以替换 ActiveSheet.Paste 一点我如何做到这一点?

    编辑:我使用了类似答案中的信息 here 所以我的代码现在看起来像这样:

    xFolder = GetFolder(InitialFoldr$)
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name Like "*PDMND" Then
            xName = ws.Name
        ws.Range("BJ4:CK82").Copy
    
        Set oWb = Workbooks.Add
    
                oWb.Range("A1").PasteSpecial Paste:=xlPasteValues
                Stop
    

    但是现在Excel在我选择保存文件夹后崩溃了。这有明显的原因吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   braX    7 年前

    创建新工作簿时,请保存工作簿对象,以便以后可以引用它。。。这样地:

    在开始循环之前,添加:

        Dim wbNew as Workbook
    

    然后在你的循环中。。。

        With CreateObject("Excel.Application")
            Set wbNew = .Workbooks.Add
            .Visible = True
        End With
        wbNew.WorkSheets(1).Range("A1").PasteSpecial Paste:=xlPasteValues