【问题标题】:VBA to open several workbooks, copy specific data, remove duplicate rows and paste the information in a new workbookVBA 打开多个工作簿,复制特定数据,删除重复行并将信息粘贴到新工作簿中
【发布时间】:2018-07-11 11:07:42
【问题描述】:

我知道标题不是很清楚,但我希望我能在这个描述中更好地解释它。我是 VBA 新手,我需要编写一些代码来执行以下操作:

。打开特定文件夹中的多个工作簿并将信息从源工作表(只有一个活动)中间的表复制到新工作簿中的目标 Sheet1。问题 1:表格的列数相同但行数不同(最初它们从 A42 到 L##(?) 不同,因为用户可以添加或删除行,或者将它们留空)所以我所做的是创建一个新的每个源文件中的隐藏工作表都有第一个带有 1 和 0 的 A 列,因此我可以知道我的副本的范围并“预格式化”我想要传输到目标文件的信息)

。将每个源文件的隐藏工作表中的信息复制到目标工作簿,从目标工作簿的 Sheet1 的第二行开始(对于正在复制的表) - 第一行将有一个预先写好的标题 - 并继续粘贴目标工作表第一个可用空白行中下一个文件的信息

。删除重复行:如果用户多次运行宏,将不会看到原始表被复制了多次(还没有到这一步)

我对 VBA 知之甚少,所以这就是我复制粘贴我在网上搜索到的不同内容的过程(顺便说一句,代码没有按预期工作):

Sub ImportWorksheets()
Dim sFile As String           'file to process
Dim wsTarget As Worksheet
Dim wbSource As Workbook
Dim wsSource As Worksheet

'check the folder exists
If Not FileFolderExists(FOLDER_PATH) Then
  MsgBox "Specified folder does not exist, exiting!"
  Exit Sub
End If

'reset application settings in event of error
On Error GoTo errHandler
Application.ScreenUpdating = False

'set up the target worksheet
Set wsTarget = Sheets("Sheet1")

Dim NextRow0 As Long
NextRow0 = 2
'using NextRow0 to paste the new tables in in target sheet

'loop through the Excel files in the folder
sFile = Dir(FOLDER_PATH & "*.xls*")
Do Until sFile = ""

  'open the source file and set the source worksheet - ASSUMED WORKSHEET(1)
  Set wbSource = Workbooks.Open(FOLDER_PATH & sFile)
  Set wsSource = wbSource.Worksheets(2) 'EDIT IF NECESSARY

  Dim lRow As Long

  lRow = wsSource.Columns("A").Find(1, SearchDirection:=xlPrevious, LookIn:=xlValues, LookAt:=xlWhole).Row
  wsSource.Range("B1:N" & lRow).Copy Destination:=wsTarget.Range("A" & NextRow0)
  NextRow0 = wsTarget.Range("A100000").End(xlUp).Row

  'close the source workbook, increment the output row and get the next file
  wbSource.Close SaveChanges:=False
  sFile = Dir()
Loop

errHandler:
On Error Resume Next
Application.ScreenUpdating = True


'tidy up
Set wsSource = Nothing
Set wbSource = Nothing
Set wsTarget = Nothing
End Sub

现在代码没有将信息粘贴为值,而是路径,并且没有复制正确的信息(第二列返回#REF)。你能帮我弄清楚如何纠正错误并结束代码吗?

【问题讨论】:

    标签: vba excel excel-formula excel-2016


    【解决方案1】:

    替换

      wsSource.Range("B1:N" & lRow).Copy Destination:=wsTarget.Range("A" & NextRow0)
    

     wsSource.Range("B1:N" & lRow).Copy 
     wsTarget.Range("A" & NextRow0).pastespecial xlpastevalues
    

    将您的数据从公式(即#REF)转换为值。假设您的其余代码可以解决问题

    【讨论】:

    • 谢谢!!这解决了我的部分问题,因为我现在能够从源文件中获取我需要的所有信息。我收到一个窗口,提示剪贴板中有大量信息。有没有办法自动关闭它?我应该尝试在其中包含重复检查还是将其添加为不同的宏?
    • 在 pastespecial 之后添加行 Application.CutCopyMode = False 以停止警告。使用 wstarget.UsedRange.RemoveDuplicates Header:=xlYes 导入所有数据后,我将删除重复项
    • 是的,我问了之后才知道,对不起。我在关闭之前添加了 wbSource.Application.CutCopyMode = False 而没有保存更改并且它有效。我在“整理”部分之前添加了 wstarget.UsedRange.RemoveDuplicates Header:=xlYes,并且我正在为两个测试文件运行宏。如果我运行宏两次,它会从文件 1 复制一次表,然后从文件 2 复制两次表。如果我为三个测试文件运行两次,我猜它会显示表 1、表 2、表 3,然后是表2和表3再次,但我没有检测到这个问题来自哪里。 :S
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多