excel - VBA 将工作表另存为 CSV 会破坏现有模块
问题描述
我正在尝试构建一个 VBA 子程序,它将复制工作表并将其保存为 CSV。我正在使用经过验证的真实方法:
1) 复制工作表
2) 打开一个新的工作簿
3)将复制的数据粘贴到该新工作簿中
4) 将该工作簿保存为 CSV
源表在两个单元格中包含几个公式和一个模块,所以我打算使用.PasteSpecial xlPasteValues
. 但是,运行子程序会引发错误 1004 并破坏源工作表中的模块(然后它们显示为 #VALUE)。
我尝试单步执行子程序,问题似乎.PasteSpecial
出在源表中的方法/东西上。当我得到这.PasteSpecial
一步时,源表中包含的模块启动,然后我陷入了一个循环。
作为旁注,该Set csvFileName
行指的是在运行子之前连接文件名值的单元格。我不认为这是导致问题的原因,因为我删除了它并看到了相同的行为。
这是代码:
Sub SaveAsCSV()
Dim csvFileName As String
Dim ThisWB As Workbook, csvWB As Workbook
Set ThisWB = ActiveWorkbook
ThisWB.Sheets("SourceSheet").UsedRange.Copy
Set csvWB = Application.Workbooks.Add(1)
csvWB.Sheets(1).Range("A1").PasteSpecial xlPasteValues
Set csvFileName = ThisWB.Path & "\" & ThisWB.Sheets("Instructions").Range("E10").Value & ".csv"
Application.DisplayAlerts = False
csvWB.SaveAs FileName:=csvFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
csvWB.Close SaveChanges:=False
Application.DisplayAlerts = True
MsgBox "File has been Created and Saved"
End Sub
还有一些注意事项:
该模块工作正常,直到我运行
SaveAsCSV
子。该模块保存在工作簿级别。它基本上是一个带有连接的高级 vlookup。在其中一张纸内移动它会破坏它。
SaveAsCSV
子也处于工作簿级别。将其移至“说明”表不会停止该行为。使用 Excel for Mac,版本 16.21.1
任何帮助将不胜感激!!
编辑:5-23-19
作为参考,这里是模块代码:
Function MultipleLookupNoRept(Lookupvalue As String, LookupRange As Range, ColumnNumber As Integer)
Dim i As Long
Dim Result As String
For i = 1 To LookupRange.Columns(1).Cells.Count
If LookupRange.Cells(i, 1) = Lookupvalue Then
For J = 1 To i - 1
If LookupRange.Cells(J, 1) = Lookupvalue Then
If LookupRange.Cells(J, ColumnNumber) = LookupRange.Cells(i, ColumnNumber) Then
GoTo Skip
End If
End If
Next J
Result = Result & " " & LookupRange.Cells(i, ColumnNumber) & ","
Skip:
End If
Next i
MultipleLookupNoRept = Left(Result, Len(Result) - 1)
End Function
解决方案
试试这个(没有复制/粘贴):
Sub SaveAsCSV()
Dim csvFileName As String
Dim ThisWB As Workbook, csvWB As Workbook, rngUsed As Range
Set ThisWB = ActiveWorkbook
Set rngUsed = ThisWB.Sheets("SourceSheet").UsedRange
csvFileName = ThisWB.Path & "\" & _
ThisWB.Sheets("Instructions").Range("E10").Value & ".csv" 'no Set!
Application.DisplayAlerts = False
With Application.Workbooks.Add(1)
.Sheets(1).Range("A1").Resize(rngUsed.Rows.Count, _
rngUsed.Columns.Count).Value = rngUsed.Value
.SaveAs Filename:=csvFileName, FileFormat:=xlCSV, _
CreateBackup:=False, Local:=True
.Close SaveChanges:=False
End With
Application.DisplayAlerts = True
MsgBox "File has been Created and Saved"
End Sub
推荐阅读
- bitcoinj - Bitcoinj get transactions from blockchain
- powershell - PowerShell 读取 csv 文件并相应地创建文件
- c++ - 如何重构重复的控制结构?
- r - 如何从知道相机像素分辨率、焦距和高度的照片开始计算 R 中的叶面积?
- python - 无法解析树莓派上的主机地址
- javascript - [Vue 警告]:渲染错误:“TypeError:无法读取属性 'id' of null”
- c# - 在 c# 和 c++ 之间将 double 类型的二维多维数组作为输入和输出的 pinvoke 编组
- azure - 无法在 Azure B2C 注册页面中执行注册属性重新排序
- java - 将 weka 与 android 一起使用时出现错误
- virtualbox - Virtual Box 多远程桌面