Я пытаюсь создать сабвуфер VBA, который будет копировать лист и сохранять его как CSV.Я использую проверенный и проверенный метод:
1) Копирование листа
2) Открытие новой рабочей книги
3) Вставка скопированных данных в эту новую рабочую книгу
4) Сохранение этой книги в формате CSV
Исходный лист содержит несколько формул и модуль в двух ячейках, поэтому я планировал использовать .PasteSpecial xlPasteValues
.Однако при запуске подпрограммы выдается ошибка 1004 и разбиваются модули в исходном листе (они затем отображаются как # ЗНАЧЕНИЕ).
Я попытался пройти по подпрограмме, и проблема, похоже, связана с методом .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 для 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