まずは少し背景:選択したディレクトリにn CSVファイルをコピーし、それぞれのデータをコピーしてnタブの「マスター」Excelワークブックファイルに貼り付ける必要がありました。私はまた、自動的にタブに何か有用な名前を付けるスクリプトが必要です。私のExcel VBスクリプトが遅くなる原因は何ですか?
私はFrankenstein'dが一緒にマクロ録音の組み合わせを使用して、私がここで見つけた作品と良いオール '流行のグーグルを使用しています。あまりにも多くのエラーがなくても実行されます。ただし、プロセスの最後に向かって(10以上のCSVファイルがある場合)、かなり遅くなります。
私は、クリップボードがクリアされていること、コピーされている現在のファイルが閉じられていること、マスターファイルの開閉アニメーションを抑制していることなどを確認するためにいくつかの異なるバージョンを試しました。私はクリップボードをクリアしていました。
私はこれがVisual Basicへの私の最初のベンチャーであり、プロのプログラマーではないことを認めます。そのため、コードはおそらくメモリを適切に処理しません。
私の質問はです。最後に向かってコードが遅くなっているセクションや操作を見つけることができますか?あるいは、なぜそれが起こっているのかに関して、少なくとも実行可能な説明を提供していますか?一般に、私のラップトップは恥ずかしがり屋ではありません。 i5プロセッサと8GBのRAMを搭載したHP EliteBookだから、リソースの問題だとは想像もしません。
コードと個人用ディレクトリへの参照をすべて消して下に掲載しました。
ありがとうございました。
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
メモ:32ビットのExcelを使用している場合は、RAMの使用量が2Gbになります。だからあなたの8Gbのコンピュータは、わずか1四半期が使用されています。 64ビットは、利用可能なものを使用します。 –
WbToPasteを開いたり閉じたりする理由を理解できません。常に同じものです。開いてループの外側に設定し、ループの後に保存します。また、これらのワークブックにワークブックイベントがある場合は、これを実行する前にイベントを無効にすると、不要なワークブックの実行/非アクティブ化を防ぐことができます。 'Application.EnableEvents = false'最後に、DragonSamuのように画面を更新してtrueに戻します。 –
[Application.ScreenUpdating](https://msdn.microsoft.com/en-us/library/office/aa196875(v = office.11).aspx)を使用することをお勧めします。これは何が起こるかを表示せず、何も表示する必要がないので、プロセスはずっと高速になります。 – DragonSamu