你能find什么导致我的Excel VB脚本减慢?

首先是一个小背景:我需要一个脚本,在我select的目录中取得n个 CSV文件,并将其个别数据复制并粘贴到一个带有n个选项卡的“主”Excel工作簿文件中。 我也需要脚本来自动命名标签有用的东西。

我Frankenstein的一个脚本一起使用macros观录制,我在这里find的片断和良好的谷歌search结合使用谷歌search。 它运行时没有太多的错误; 然而,在这个过程结束的时候(如果有10个以上的CSV文件),它会变慢一点。

我已经尝试了几个不同的版本,确保剪贴板被清除,被复制的当前文件被closures,抑制主文件的打开和closuresanimation等等。到目前为止,成功的唯一的东西是(什么我认为是有效的)清除剪贴板。

我承认这是我第一次进入Visual Basic,我不是一个专业程序员,所以代码可能无法正确处理内存。

我的问题是:你能find一个(或多个)正在减慢代码的部分吗? 或至less提供一个可行的解释,为什么会发生? 一般来说,我的笔记本电脑是没有懒散的。 这是一个惠普EliteBook i5处理器和8GB的RAM,所以我无法想象这是一个资源问题。

我已经清理了代码和任何对个人目录的引用,并将其公布在下面。

预先感谢您的帮助。

Sub MultiCSV_to_Tabs() Dim vaFiles As Variant Dim i As Long Dim wbkToCopy As Workbook Dim wbkToPaste As Workbook vaFiles = Application.GetOpenFilename("CSV Files (*.csv), *.csv", _ Title:="Select files", MultiSelect:=True) 'User_Created_File = "PLACE YOUR DIRECTORY AND FILE NAME IN BETWEEN THESE QUOTATION MARKS" If IsArray(vaFiles) Then For i = LBound(vaFiles) To UBound(vaFiles) 'Open the first CSV file in the list of selections Set wbkToCopy = Workbooks.Open(Filename:=vaFiles(i)) 'Split the vaFiles variable on backslashes to dissect the PathName and FileName SplitFileName = Split(vaFiles(i), "\") 'Go find the last entry in the SplitFileName variable. This should be the exported file name we selected. ExportedCSVFileName = SplitFileName(UBound(SplitFileName)) 'Select all cells and copy that selection wbkToCopy.Application.DisplayAlerts = False Cells.Select Selection.Copy 'Close the current workbook without saving changes wbkToCopy.Close savechanges:=False 'Open the summary workbook Set wbkToPaste = Workbooks.Open(User_Created_File) 'Add a new tab to the end of the last tab Sheets.Add After:=Sheets(Sheets.Count) 'Define new sheetname using the parsed filename from the workbook shtname = Mid(ExportedCSVFileName, 17, 25) ActiveSheet.Name = shtname 'Paste the selection we copied earlier wbkToPaste.Application.DisplayAlerts = False ActiveSheet.Paste wbkToPaste.Application.CutCopyMode = False 'Close the summary workbook and save the changes. Go to the next file in the array. wbkToPaste.Close savechanges:=True Next i End If Set wbkToCleanUp = Workbooks.Open(User_Created_File) Sheets("Sheet1").Delete wbkToCleanUp.Close savechanges:=True MsgBox ("Copy/Paste complete") End Sub 

Cells.Select正在占用大量内存。 find表单的实际范围并复制该表单。

例如

 Sub Sample() Dim ws As Worksheet Dim Lrow As Long, LCol As Long Dim rng As Range Set ws = Sheet1 With ws '~~> Find Last row which has data Lrow = .Cells.Find(What:="*", _ After:=wks.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row '~~> Find Last column which has data LCol = .Cells.Find(What:="*", _ After:=wks.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column Set rng = .Range("A1:" & Split(Cells(, LCol).address, "$")(1) & Lrow) rng.Copy '~~> Paste where you want End With End Sub 

在粘贴之前也不要closures该文件。 粘贴时还必须小心。 在粘贴之前将Copy命令放在一行。 有时剪贴板会清理干净,而且可能会遇到问题。