Код Visio VBA для копирования и вставки листов Excel из одного в другой

У меня есть макрос 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 или в Excel? В Visio нет глобального объекта «Рабочие книги»? Я имею в виду, что Visio — это отдельное приложение, как Excel, но другое. Вопрос как-то связан с этим?

Nikolay 24.05.2024 00:16

Да, я запускаю этот код в Visio. Насколько я понимаю, в Visio Vba нет одинаковых методов. Например: SecondWorkbookPath = Application.GetOpenFilename("Файлы Excel (*.xls; *.xlsx), *.xls; *.xlsx", , "Выберите инв. книгу"). GetOpenFilename можно использовать в Excel VBA, но я не могу запустить его в Visio VBA.

Lepookie 24.05.2024 15:12
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
2
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пожалуйста, проверьте описание метода 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

Lepookie 24.05.2024 15:28

Сейчас у меня там нет Visio. я попробую позже

Surrogate 24.05.2024 15:52

Спасибо за ваше время. В конце концов, моя цель такова: открыть исходную книгу Excel, затем создать новую книгу Excel и, наконец, скопировать исходные листы Excel в новую книгу Excel через VBA Visio. Кроме того, запуск приведенного выше кода в Visio дает мне ошибку времени выполнения 438, объект не поддерживает это свойство или метод. В этой строке: Установите excelWorkbook = excelApp.Workbooks.Add.

Lepookie 24.05.2024 16:08

Пожалуйста, проверьте гиперссылку в моем ответе (PPS). Со своей стороны я тестировал ранние и поздние привязки, у меня это работает!

Surrogate 25.05.2024 00:09

Другие вопросы по теме