Excel 选择最后一个条目并按1行偏移,然后粘贴值不起作用
此代码出现运行时错误1004Excel 选择最后一个条目并按1行偏移,然后粘贴值不起作用,excel,copy-paste,offset,vba,Excel,Copy Paste,Offset,Vba,此代码出现运行时错误1004 Sub LoopAllExcelFilesInFolder() 'PURPOSE: To loop through all Excel files in a user specified folder and perform a set task on them 'SOURCE: www.TheSpreadsheetGuru.com Dim wb As Workbook Dim myPath As String Dim myFile As String D
Sub LoopAllExcelFilesInFolder()
'PURPOSE: To loop through all Excel files in a user specified folder and perform a set task on them
'SOURCE: www.TheSpreadsheetGuru.com
Dim wb As Workbook
Dim myPath As String
Dim myFile As String
Dim myExtension As String
Dim FldrPicker As FileDialog
'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 = "Select A Target Folder"
.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 = "*.xls*"
'Target Path with Ending Extention
myFile = Dir(myPath & myExtension)
'Loop through each Excel file in folder
Do While myFile <> ""
'Set variable equal to opened workbook
Set wb = Workbooks.Open(Filename:=myPath & myFile)
'Ensure Workbook has opened before moving on to next line of code
DoEvents
Dim LastRow As Long
Dim rng1 As Range
wb.Worksheets(1).Activate
Set rng1 = Range("B15:E81,N15:O81")
With ThisWorkbook.Worksheets("Sheet1") '<-- modify "Sheet1" to your sheet's name
LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row ' get last row with data in column "E"
' paste
.Range("E" & LastRow + 1) = rng1
End With
'Save and Close Workbook
wb.Close SaveChanges:=True
'Ensure Workbook has closed before moving on to next line of code
DoEvents
'Get next file name
myFile = Dir
Loop
'Message Box when tasks are completed
MsgBox "Task Complete!"
ResetSettings:
'Reset Macro Optimization Settings
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Sub-LoopAllExcelFilesInFolder()
'用途:循环浏览用户指定文件夹中的所有Excel文件并对其执行设置任务
来源:www.TheSpreadsheetGuru.com
将wb设置为工作簿
将myPath设置为字符串
将myFile设置为字符串
Dim myExtension作为字符串
Dim FldrPicker As FILE对话框
'优化宏速度
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=“*.xls*”
'具有结束扩展名的目标路径
myFile=Dir(myPath&myExtension)
'循环浏览文件夹中的每个Excel文件
当我的文件“”时执行此操作
'将变量设置为等于打开的工作簿
设置wb=Workbooks.Open(文件名:=myPath&myFile)
'在继续下一行代码之前,确保工作簿已打开
多芬特
最后一排一样长
变暗rng1 As范围
wb.工作表(1).激活
设置rng1=范围(“B15:E81,N15:O81”)
使用ThisWorkbook.Worksheets(“Sheet1”)您的代码段运行时不会出错。不过,您可能需要重新考虑该方法。使用激活和选择的代码速度慢且效率低。在大多数情况下,不需要激活和选择。对象可以直接寻址
有关避免选择和激活的技术,请参阅。您的代码片段运行时不会出错。不过,您可能需要重新考虑该方法。使用激活和选择的代码速度慢且效率低。在大多数情况下,不需要激活和选择。对象可以直接寻址
有关避免选择和激活的技术,请参阅。首先,正如@teylyn所建议的,您应该避免使用选择
和激活
(99.9%的时间不需要它们,它们所做的唯一“贡献”是浪费时间,因为代码运行时间更长)
第二个,您还应该指定要粘贴到此工作簿
对象中的工作表
代码
Dim LastRow As Long
wb.Worksheets(1).Range("B15:E81").Copy
With ThisWorkbook.Worksheets("Sheet1") '<-- modify "Sheet1" to your sheet's name
LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row ' get last row with data in column "E"
' paste
.Range("E" & LastRow + 1).PasteSpecial Paste:=xlPasteValues
End With
Dim LastRow尽可能长
wb.工作表(1).范围(“B15:E81”).副本
使用此工作簿.工作表(“Sheet1”)首先,正如@teylyn所建议的,您应该避免使用选择
和激活
(99.9%的时间不需要它们,它们所做的唯一“贡献”是浪费时间,因为代码运行时间更长)
第二个,您还应该指定要粘贴到此工作簿
对象中的工作表
代码
Dim LastRow As Long
wb.Worksheets(1).Range("B15:E81").Copy
With ThisWorkbook.Worksheets("Sheet1") '<-- modify "Sheet1" to your sheet's name
LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row ' get last row with data in column "E"
' paste
.Range("E" & LastRow + 1).PasteSpecial Paste:=xlPasteValues
End With
Dim LastRow尽可能长
wb.工作表(1).范围(“B15:E81”).副本
第三,使用xlUp
而不是xlDown
。(我很确定这是错误的根源,您在代码中自动修复了它,但忘记了将其作为可能的原因。)您的代码工作得很好,但在第三次文件操作后,使用pastevalue代码时遇到了错误。我用rng1=Range(“B15:E81”)来代替我使用@teylyn建议的帖子进行复制的方式。但是我如何粘贴到列E的下一个空单元格中?@Tyler行范围(“E”&LastRow+1)。粘贴特殊粘贴:=xlPasteValues
在找到更新的LastRow
后粘贴到下一个空行。我认为错误可能来自代码中的另一个地方。请分享代码的其他相关部分。您可以从上面的链接访问该模块。我将rng1添加到.Range(“E”&LastRow+1)=rng1,但什么也没有发生。您可以检查我从模块本身进行的编辑anyway@Tyler我可以;t从当前电脑访问Dropbox,抱歉第三,使用xlUp
而不是xlDown
。(我很确定这是错误的根源,您在代码中自动修复了它,但忘记了将其作为可能的原因。)您的代码工作得很好,但在第三次文件操作后,使用pastevalue代码时遇到了错误。我用rng1=Range(“B15:E81”)来代替我使用@teylyn建议的帖子进行复制的方式。但是我如何粘贴到列E的下一个空单元格中?@Tyler行范围(“E”&LastRow+1)。粘贴特殊粘贴:=xlPasteValues
在找到更新的LastRow
后粘贴到下一个空行。我认为错误可能来自代码中的另一个地方。请分享代码的其他相关部分。您可以从上面的链接访问该模块。我将rng1添加到.Range(“E”&LastRow+1)=rng1,但什么也没有发生。您可以检查我从模块本身进行的编辑anyway@Tyler我可以;抱歉,无法从当前电脑访问Dropbox