为何VBA宏会生成空VBAProject?如何删除该项目?
关于Excel VBA导入CSV时生成空VBAProject的问题及解决方法
问题描述
我需要导入CSV文件,但Excel/VBA解析CSV格式的效果很差,找到的可行方法是先将CSV复制为TXT文件,再通过Workbooks.OpenText导入。以下是可用的功能代码:
Sub CopierDonneesDepuisCSV() ' Convert .csv into a .txt, import .txt then delete it ' Usefull when Excel doesn't know how to parse csv... Dim Newsheet As String Newsheet = ThisWorkbook.Sheets(importSheet).Range("fileDate").Value 'path file Dim ws As Worksheet Set ws = Sheets(templateSheet) ws.Copy After:=ws ActiveSheet.Name = Newsheet With Worksheets(Newsheet) .Range("B4").Value = ThisWorkbook.Sheets(importSheet).Range("filePath").Value .Range("B5").Value = ThisWorkbook.Sheets(importSheet).Range("fileDate").Value .Range("B6").Value = ThisWorkbook.Sheets(importSheet).Range("commentaire").Value .Range("B7").Value = ThisWorkbook.Sheets(importSheet).Range("auteur").Value .Range("B8").Value = ThisWorkbook.Sheets(importSheet).Range("hash").Value .Range("B11").Value = ThisWorkbook.Sheets(importSheet).Range("nbGen").Value .Range("B12").Value = ThisWorkbook.Sheets(importSheet).Range("timeout").Value .Range("B13").Value = ThisWorkbook.Sheets(importSheet).Range("efficiency").Value ' Creating the .txt file Dim data_csv As Workbook pathTxt = ThisWorkbook.Sheets(importSheet).Range("filePath").Value & ".txt" FileCopy ThisWorkbook.Sheets(importSheet).Range("filePath").Value, pathTxt Workbooks.OpenText Filename:=pathTxt, Comma:=True, DataType:=1, TrailingMinusNumbers:=False Set data_csv = ActiveWorkbook data_csv.Sheets(1).Range("A2:K60").Copy .Range("E16:O100").PasteSpecial Paste:=xlPasteValues data_csv.Sheets(1).Range("A2:A60").Copy .Range("A17:A100").PasteSpecial Paste:=xlPasteValues data_csv.Close False ' Deleting the .txt file Kill ThisWorkbook.Sheets(importSheet).Range("filePath").Value & ".txt" End With Call ImportTextFile End Sub
但每次运行该宏时,都会生成一个以TXT文件名命名的空VBAProject。我有两个疑问:
- 为什么会生成这个VBAProject?
- 尝试右键删除“VBAProject”“Microsoft Excel Objects”和“Feuill1”,但无法删除,该如何操作?
解答
1. 空VBAProject生成的原因
当调用Workbooks.OpenText打开TXT文件时,Excel会自动为这个临时工作簿创建对应的VBA项目容器(即VBAProject)——即使工作簿中没有任何宏代码,这个容器也会被初始化。
你在代码中用data_csv.Close False关闭临时工作簿时选择了不保存,但Excel的VBA项目缓存机制不会立即清理未保存工作簿对应的项目容器;如果宏运行过程中存在未释放的对象引用,或者后续调用的ImportTextFile宏也涉及工作簿操作,会进一步导致这个空VBAProject残留在VBA编辑器中。
2. 删除空VBAProject的方法
方法一:修改代码从根源避免生成
最彻底的解决方式是跳过“打开临时工作簿”的步骤,直接读取TXT文件内容并写入目标工作表,这样就不会生成多余的VBAProject。示例代码如下:
Sub ImportCSVWithoutTempWB() Dim fso As Object, ts As Object Dim filePath As String, pathTxt As String Dim lineData As String, arrData As Variant Dim destWs As Worksheet, rowNum As Integer ' 获取文件路径 filePath = ThisWorkbook.Sheets(importSheet).Range("filePath").Value pathTxt = filePath & ".txt" FileCopy filePath, pathTxt ' 创建目标工作表(与原逻辑一致) Dim Newsheet As String Newsheet = ThisWorkbook.Sheets(importSheet).Range("fileDate").Value Dim ws As Worksheet Set ws = Sheets(templateSheet) ws.Copy After:=ws ActiveSheet.Name = Newsheet Set destWs = ActiveSheet ' 复制元数据(与原逻辑一致) With destWs .Range("B4").Value = filePath .Range("B5").Value = Newsheet .Range("B6").Value = ThisWorkbook.Sheets(importSheet).Range("commentaire").Value .Range("B7").Value = ThisWorkbook.Sheets(importSheet).Range("auteur").Value .Range("B8").Value = ThisWorkbook.Sheets(importSheet).Range("hash").Value .Range("B11").Value = ThisWorkbook.Sheets(importSheet).Range("nbGen").Value .Range("B12").Value = ThisWorkbook.Sheets(importSheet).Range("timeout").Value .Range("B13").Value = ThisWorkbook.Sheets(importSheet).Range("efficiency").Value End With ' 读取TXT文件内容并写入工作表 Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(pathTxt, 1) ' 1=只读模式 rowNum = 16 ' 从E16开始写入数据 Do While Not ts.AtEndOfStream lineData = ts.ReadLine arrData = Split(lineData, ",") ' 按逗号拆分CSV内容 If rowNum >= 16 And rowNum <= 100 Then ' 写入E到O列(对应原CSV的A到K列) destWs.Range("E" & rowNum).Resize(1, UBound(arrData) + 1).Value = arrData ' 写入A列数据 destWs.Range("A" & rowNum + 1).Value = arrData(0) End If rowNum = rowNum + 1 Loop ' 清理资源 ts.Close Kill pathTxt Set ts = Nothing Set fso = Nothing Call ImportTextFile End Sub
方法二:手动清理已生成的空VBAProject
如果空VBAProject已经存在,无法直接右键删除,可按以下步骤操作:
- 完全退出Excel程序(包括后台运行的Excel进程),重新打开后,未保存的临时VBAProject缓存会被自动清理。
- 若重启后仍存在,按
Ctrl+F6切换所有打开的工作簿,找到对应TXT文件名的空工作簿,手动关闭它,对应的VBAProject会随之消失。
内容的提问来源于stack exchange,提问作者Oimat
相关产品推荐
相关产品推荐

