У меня есть макрос Visio Vba, который должен принимать путь к файлу листа Excel из глобальной переменной. Затем он открывает этот файл, создает новый лист Excel, берет листы из старого пути и копирует их в сгенерированный файл. Моя проблема заключается в копировании листов. Первый файл, который я ему даю, иногда работает, но когда я снова запускаю другой или тот же файл, когда он запускает эту конкретную строку:
PriceWs.Copy After:=excelWorkbook.Sheets("Sheet1")
Я получаю ошибку 1004 во время выполнения: такой интерфейс не поддерживается, и я не могу понять, почему он продолжает это делать.
Если это поможет, я получаю путь к файлу через глобальную строку, которая содержит только путь к файлу. Пример значения: C:\Users\things\Documents\TESTING.xlsx
Я запускаю этот код с помощью командной кнопки в пользовательской форме, которая запускает только этот макрос и ничего больше.
Кроме того, во время отладки тип PriceWs — это рабочий лист/рабочий лист, если это имеет значение, но опять же, код иногда выполняется, пока он был этого типа.
Sub CombineExcel()
Dim PriceWb As Workbook
Dim PriceWs As Worksheet
Dim PriceString As String
'Error checking for a good file
'Global is a global string that holds the path to an excel file
PriceString = GlobalPriceList
Debug.Print "Price String: " & PriceString
On Error Resume Next
Set PriceWb = Workbooks.Open(PriceString)
On Error GoTo 0
If PriceWb Is Nothing Then
MsgBox "Error: The file is not a valid Excel file or it could not be opened.", vbCritical
Exit Sub
End If
' Initialize Excel
Set excelApp = CreateObject("Excel.Application")
Dim excelWorkbook As Object
Dim excelWorksheet As Object
Set excelApp = New Excel.Application
excelApp.Visible = True ' Optional, set to True if you want Excel to be visible
Set excelWorkbook = excelApp.Workbooks.Add
Set excelWorksheet = excelWorkbook.Sheets(1)
' Loop through each sheet in the source workbook
For Each PriceWs In PriceWb.Sheets
On Error Resume Next
PriceWs.Copy After:=excelWorkbook.Sheets(excelWorkbook.Sheets.count)
If Err.Number <> 0 Then
Debug.Print "Type Name is: " & TypeName(PriceWs)
MsgBox "Error copying sheet '" & PriceWs.Name & "': " & Err.Description, vbCritical
End If
On Error GoTo 0
Next PriceWs
Debug.Print GlobalPriceList
' Delete the Sheet1 without prompting for confirmation
'Application.DisplayAlerts = False ' Suppress the alert asking for confirmation
'excelWorkbook.Sheets("Sheet1").Delete
'Application.DisplayAlerts = True ' Restore the display alerts setting
' Release object references
Set excelWorksheet = Nothing
Set excelWorkbook = Nothing
Set excelApp = Nothing
Set PriceWs = Nothing
End Sub
PS: если это поможет, это код, который я использую для получения пути к файлу от конечного пользователя, поскольку я не могу использовать GetOpenFilename в vba Visio:
Dim wShell As Object, sPath As String, oExec As Variant
' Create an instance of the WScript.Shell object
Set wShell = CreateObject("WScript.Shell")
' Execute a command line using mshta.exe with an HTML script as an argument
' The HTML script dynamically generates an HTML page with a file input element and JavaScript code to interact with it
Set oExec = wShell.Exec("mshta.exe ""about:<input type=file id=FILE accept=.xls,.xlsx><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""")
' Read the file path from the standard output of the executed command
sPath = oExec.StdOut.ReadLine
Да, я запускаю этот код в Visio. Насколько я понимаю, в Visio Vba нет одинаковых методов. Например: SecondWorkbookPath = Application.GetOpenFilename("Файлы Excel (*.xls; *.xlsx), *.xls; *.xlsx", , "Выберите инв. книгу"). GetOpenFilename можно использовать в Excel VBA, но я не могу запустить его в Visio VBA.


Пожалуйста, проверьте описание метода Worksheet.Copy
Копирует лист в другое место текущей книги или новой книги.
Об ошибке 1004
Источник и место назначения должны находиться в одном экземпляре Excel.Application, иначе возникнет ошибка времени выполнения «1004»: такой интерфейс не поддерживается, если использовалось что-то вроде
Sheet1.Copy objWb.Sheets(1), или ошибка времени выполнения «1004»: метод копирования класса Worksheet не выполнен. , если использовалось что-то вродеThisWorkbook.Worksheets("Sheet1").Copy objWb.Sheets(1).
Я обнаружил, что Метод Worksheet.Move (Excel) может перемещать рабочие листы между разными книгами! Я модифицирую ваш код и запускаю Excel!
Примечание. Не создавайте новый сеанс приложения Excel, чтобы избежать ошибки!
Sub CombineExcel()
Dim PriceWb As Workbook
Dim PriceWs As Worksheet
Dim PriceString As String
'Error checking for a good file
'Global is a global string that holds the path to an excel file
PriceString = "C:\адЪ\ЛВС.xls" ' my local workbook for tests path
Debug.Print "Price String: " & PriceString
On Error Resume Next
Set PriceWb = Workbooks.Open(PriceString)
On Error GoTo 0
If PriceWb Is Nothing Then
MsgBox "Error: The file is not a valid Excel file or it could not be opened.", vbCritical
Exit Sub
End If
' Initialize Excel
Dim excelApp As Object
Dim excelWorkbook As Object
Dim excelWorksheet As Object
' Set excelApp = New Excel.Application
Set excelApp = Application ' !!! DONT CREATE NEW EXCEL's session !!!
excelApp.Visible = True ' Optional, set to True if you want Excel to be visible
Set excelWorkbook = excelApp.Workbooks.Add
Set excelWorksheet = excelWorkbook.Sheets(1)
' Loop through each sheet in the source workbook
For Each PriceWs In PriceWb.Sheets
On Error Resume Next
PriceWs.Copy After:=excelWorkbook.Sheets(excelWorkbook.Sheets.Count)
If Err.Number <> 0 Then
Debug.Print "Type Name is: " & TypeName(PriceWs)
MsgBox "Error copying sheet '" & PriceWs.Name & "': " & Err.Description, vbCritical
End If
On Error GoTo 0
Next PriceWs
Debug.Print GlobalPriceList
' Delete the Sheet1 without prompting for confirmation
'Application.DisplayAlerts = False ' Suppress the alert asking for confirmation
'excelWorkbook.Sheets("Sheet1").Delete
'Application.DisplayAlerts = True ' Restore the display alerts setting
' Release object references
Set excelWorksheet = Nothing
Set excelWorkbook = Nothing
Set excelApp = Nothing
Set PriceWs = Nothing
End Sub
PS А как насчет MS Visio?
PPS Я портировал код в документ Visio, там можно найти строки для поздней или ранней привязки
В Visio нет встроенных файловых диалогов, в которых можно выбирать открытые документы.
Подробнее читайте в этих темах:
Откройте файлDialog в visio vba
Добавьте диалог открытия файла в VBA
Спасибо за ваш ответ. Я сделал это в Excel, теперь хочу перенести в Visio. приведенный ниже код написан в Excel VBA, который я скопировал и вставил в Visio, и он не работает так же. в исходной книге Для каждого sourceWs In sourceWb.Worksheets ' Копируем лист в новую книгу sourceWs.Copy After:=newWB.Sheets(newWB.Sheets.Count) Next sourceWs
Сейчас у меня там нет Visio. я попробую позже
Спасибо за ваше время. В конце концов, моя цель такова: открыть исходную книгу Excel, затем создать новую книгу Excel и, наконец, скопировать исходные листы Excel в новую книгу Excel через VBA Visio. Кроме того, запуск приведенного выше кода в Visio дает мне ошибку времени выполнения 438, объект не поддерживает это свойство или метод. В этой строке: Установите excelWorkbook = excelApp.Workbooks.Add.
Пожалуйста, проверьте гиперссылку в моем ответе (PPS). Со своей стороны я тестировал ранние и поздние привязки, у меня это работает!
Не знаете, как это связано с Visio? Вы запускаете этот код в Visio или в Excel? В Visio нет глобального объекта «Рабочие книги»? Я имею в виду, что Visio — это отдельное приложение, как Excel, но другое. Вопрос как-то связан с этим?