Vba 将多个工作簿中的值复制并粘贴到另一个工作簿中的工作表/在循环中粘贴值

Vba 将多个工作簿中的值复制并粘贴到另一个工作簿中的工作表/在循环中粘贴值,vba,excel,Vba,Excel,这个问题的重担已经在这里解决了: 在修改代码后,我在大约15分钟内使所有东西都能完美地工作。然而,我随后花了3个小时搜索stackoverflow和互联网的其他部分,试图找出如何让它只粘贴值,而不是带上格式和公式 我尝试过使用.pasteValues,但每次尝试时,我都会收到一个错误,上面写着“编译错误:预期:语句结束” 我还尝试过使用.PasteSpecial(xlPasteValues),我得到一个错误,上面写着“运行时错误“1004”:无法获取Range类的PasteSpecial属性

这个问题的重担已经在这里解决了:

在修改代码后,我在大约15分钟内使所有东西都能完美地工作。然而,我随后花了3个小时搜索stackoverflow和互联网的其他部分,试图找出如何让它只粘贴值,而不是带上格式和公式

我尝试过使用.pasteValues,但每次尝试时,我都会收到一个错误,上面写着“编译错误:预期:语句结束

我还尝试过使用.PasteSpecial(xlPasteValues),我得到一个错误,上面写着“运行时错误“1004”:无法获取Range类的PasteSpecial属性

我担心的是,这两种方法都不起作用,因为一开始甚至没有.Paste函数

因此,当我尝试添加.Paste时,它给了我一个“运行时错误'438”:对象不支持此属性或方法

这是全部代码,但我主要是想弄清楚除了只粘贴值之外,如何做完全相同的事情。谢谢

Sub ConsolidateAllOrdenes()

Dim wb As Workbook
Dim myPath As String
Dim myFile As String
Dim myExtension As String
Dim FldrPicker As FileDialog
Dim lRow As Long
Dim ws2 As Worksheet
Dim y As Workbook

'Optimize Macro Speed
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual

'Retrieve Target Folder Path From User
Set FldrPicker = Application.FileDialog(msoFileDialogFolderPicker)

With FldrPicker
.Title = "Choose Target Folder Path"
.AllowMultiSelect = False
If .Show <> -1 Then GoTo NextCode
myPath = .SelectedItems(1) & "\"
End With

'In Case of Cancel
NextCode:
myPath = myPath
If myPath = "" Then GoTo ResetSettings

'Target File Extension (must include wildcard "*")
myExtension = "*.xlsm*"

'Target Path with Ending Extention
myFile = Dir(myPath & myExtension)

Set y = Workbooks.Open("C:\Consolidado\Consolidado_2018-09-05a.xlsm")
Set ws2 = y.Sheets("Consolidado_Orden")

'Loop through each Excel file in folder
Do While myFile <> ""
'Set variable equal to opened workbook
Set wb = Workbooks.Open(Filename:=myPath & myFile)

'Copy data on "Orden de Compras" sheet to "consolidado_orden" Sheet in other     workbook
With wb.Sheets("Orden de Compras")
    lRow = .Range("C" & Rows.Count).End(xlUp).Row
    .Range("A5:M" & lRow).Copy ws2.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)

End With

wb.Close SaveChanges:=False
'Get next file name
myFile = Dir
Loop

'Message Box when tasks are completed
MsgBox "I hope that worked!"

ResetSettings:
'Reset Macro Optimization Settings
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
Sub-ConsolidateAllOrdenes()
将wb设置为工作簿
将myPath设置为字符串
将myFile设置为字符串
Dim myExtension作为字符串
Dim FldrPicker As FILE对话框
暗淡的光线和长的一样
将ws2设置为工作表
将y作为工作簿
'优化宏速度
Application.ScreenUpdating=False
Application.EnableEvents=False
Application.Calculation=xlCalculationManual
'从用户检索目标文件夹路径
Set FldrPicker=Application.FileDialog(msoFileDialogFolderPicker)
用FldrPicker
.Title=“选择目标文件夹路径”
.AllowMultiSelect=False
如果.Show-1,则转到下一个代码
myPath=.SelectedItems(1)和“\”
以
"如果取消,
下一个代码:
myPath=myPath
如果myPath=”“,则转到重置设置
'目标文件扩展名(必须包含通配符“*”)
myExtension=“*.xlsm*”
'具有结束扩展名的目标路径
myFile=Dir(myPath&myExtension)
设置y=工作簿。打开(“C:\Consolidado\Consolidado_2018-09-05a.xlsm”)
设置ws2=y.Sheets(“合并”)
'循环浏览文件夹中的每个Excel文件
当我的文件“”时执行此操作
'将变量设置为等于打开的工作簿
设置wb=Workbooks.Open(文件名:=myPath&myFile)
'将“Orden de Compras”工作表中的数据复制到其他工作簿中的“consolidado_Orden”工作表中
带有工作分解表(“Orden de COMPAS”)
lRow=.Range(“C”和Rows.Count).End(xlUp).Row
.Range(“A5:M”和lRow)。复制ws2.Range(“A”和Rows.Count)。结束(xlUp)。偏移量(1,0)
以
wb.Close SaveChanges:=False
'获取下一个文件名
myFile=Dir
环
'任务完成时的消息框
MsgBox“我希望这能奏效!”
重置设置:
'重置宏优化设置
Application.EnableEvents=True
Application.Calculation=xlCalculationAutomatic
Application.ScreenUpdating=True
端接头

用以下内容替换您的复制/粘贴:

With wb.Sheets("Orden de Compras")
    Range("A2:M" & Cells(Rows.Count, "A").End(xlUp).Row).Copy
    ws2.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
End With
With wb.Sheets("Orden de Compras")
    If WorksheetFunction.CountA(wb.Sheets("Orden de Compras").Range("C5:C200")) <> 0 Then
    lRow = .Range("C" & Rows.Count).End(xlUp).Row
    wb.Sheets("Orden de Compras").Range("A5:M" & lRow).Copy
    ws2.Range("A" & Rows.Count).End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    Else
    End If
End With

对不起,我是新手,但我想我终于明白了。我相信复印件的范围缺少明确的工作簿和工作表

一旦我为副本指定了工作簿和工作表,将粘贴范围放在另一行并添加
.PasteSpecial paste:=xlPasteValues
,就没有问题了

我还从每个工作簿中复制了两行实际上没有任何内容的内容,因此我添加了
If WorksheetFunction.CountA(wb.Sheets(“Orden de Compras”).Range(“C5:C200”))0,然后
,以及以后的
Else
End If
,如果工作簿中没有C5:C200范围内的内容,则跳过该工作簿

我还添加了
Application.CutCopyMode=False
,因为每个文件后都会弹出一个消息框

将复制/粘贴替换为以下内容:

With wb.Sheets("Orden de Compras")
    Range("A2:M" & Cells(Rows.Count, "A").End(xlUp).Row).Copy
    ws2.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
End With
With wb.Sheets("Orden de Compras")
    If WorksheetFunction.CountA(wb.Sheets("Orden de Compras").Range("C5:C200")) <> 0 Then
    lRow = .Range("C" & Rows.Count).End(xlUp).Row
    wb.Sheets("Orden de Compras").Range("A5:M" & lRow).Copy
    ws2.Range("A" & Rows.Count).End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    Else
    End If
End With
带有工作分解表(“Orden de Compras”)
如果工作表功能计数(工作表(“压缩顺序”)范围(“C5:C200”)为0,则
lRow=.Range(“C”和Rows.Count).End(xlUp).Row
工作分解表(“压缩命令”)。范围(“A5:M”和lRow)。副本
ws2.Range(“A”和Rows.Count).End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode=False
其他的
如果结束
以

感谢大家,尤其是@GMalc的帮助

如果只需要这些值,请不要复制和粘贴。只需设置值-
rng1.Value=rng2.Value
@Comintern我之前也尝试过,但我只是将行切换到:
ws2.Range(“A”&Rows.Count)。End(xlUp)。Offset(1,0)。Value=.Range(“A5:M”&lRow)。Value
,以及:
ws2.Range(“A”&Rows.Count)。End(xlUp)。Offset(1,0)。Value=wb.Sheets(“Orden de Compras”).Range(“A5:M”和lRow).Value
它只是从每个工作簿中获取了一个单元格(C3),而不是之前获取的整个数据集。不确定我是否做对了。当您已经知道要打开的文件时,为什么要使用
FldrPicker
?仅复制值时,两个工作表的范围大小必须相同。这与复制/粘贴不同,粘贴范围只需要一个单元格。我相信FldrPicker允许我选择要从中抓取的文件夹,因此,如果我决定将所有文件放在不同的文件夹中,就不必键入。谢谢!值的粘贴工作正常,但它忽略了根据C列中的内容将特定单元格复制和粘贴到主合并工作表上不断增长的列表中的所有操作。然而,在仔细查看了您提供的允许使用PasteSpecial的代码之后,我终于明白了为什么它不允许我使用PasteSpecial创建另一行!!!我想这是因为我没有为第一个范围定义工作簿和工作表!