Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Ирина7225
1 / 1 / 0
Регистрация: 13.02.2018
Сообщений: 19
1

Ошибка "429". Компоненту ActiveX не удалось создать объект - VBA на MacBook MS Office 2011

21.02.2018, 14:44. Просмотров 1279. Ответов 32
Метки нет (Все метки)

Добрый день,

есть макрос для объединения (копирования) книг, находящихся в одной папке, в одну книгу. Код не мой, готовое решение нашла на одном из форумов и оно очень мне подходит. На Windows работает без проблем. На Mac MS Office 2011 возникает ошибка "429". Компоненту ActiveX не удалось создать объект - VBA при выполнение строки:

Visual Basic
1
Set fso = CreateObject("scripting.filesystemobject").getfolder(ThisWorkbook.Path)
Полный код ниже. Может кто-то сталкивался с этим и знает альтернативу данной команды для Mac. Буду благодарна за помощь.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub Соединение_книг()
    Dim fso As Object, file As Object
    Dim wb As Workbook, w As Workbook, ws As Worksheet, sh As Worksheet
    Application.EnableEvents = 0
    Application.ScreenUpdating = 0
    Set w = ThisWorkbook
    For Each sh In w.Worksheets
        sh.UsedRange.Offset(1).Clear
    Next
    Set fso = CreateObject("scripting.filesystemobject").getfolder(ThisWorkbook.Path)
    On Error Resume Next
    For Each file In fso.Files
        If InStr(1, file.Name, w.Name) Then
        Else
            Set wb = Workbooks.Open(file.Path)
            For Each ws In wb.Worksheets
        Dim Name As String
        Dim LastRow As String
        Name = wb.Name
        LastRow = Cells(Rows.Count, 1).End(xlUp).Row 
        Worksheets("Таблица").Range("R2:R" & LastRow).Value = Name
                Set sh = w.Sheets(ws.Name)
                If Not sh Is Nothing Then
                    ws.UsedRange.Offset(1).Copy sh.Cells(Rows.Count, 1).End(xlUp).Offset(1)
                Else
                    ws.Copy After:=w.Sheets(w.Sheets.Count)
                End If
                Set sh = Nothing
            Next
            wb.Close 0
            Set wb = Nothing
        End If
    Next
     Set fso = Nothing
     Application.ScreenUpdating = -1
     Application.EnableEvents = -1
End Sub
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2018, 14:44
Ответы с готовыми решениями:

Ошибка выполнения "429". Компоненту ActiveX не удалось создать объект
Здравствуйте, при выполнении макроса возникает ошибка "Ошибка выполнения "429". Компоненту ActiveX...

System.Exception: "Не удалось создать компонент ActiveX."
Хочу попробовать поизучать Visual Basic в Visual Studio 2017 Пробую открыть в нем экселевский файл...

Runtime error 429 "ActiveX component can't create object" при загрузке формы
при загрузке формы выдает ошибку : runtime error 429 ActiveX component can't create object ...

Не удалось создать компонент ActiveX, после переустановки MS Office
Всё работало нормально пока не переустановил MS Office (слетела активация офиса) :( После...

Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "Microsoft.Office.Interop.Excel.Worksheet"
Доброго времени суток. Суть проблемы такова: написал программку добавил функцию сохранения в...

32
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
21.02.2018, 14:51 2
Цитата Сообщение от Ирина7225 Посмотреть сообщение
Set fso = CreateObject("scripting.filesystemobject").getfolder(ThisWorkbook.Path)
Ошибка здесь ?
0
Ирина7225
1 / 1 / 0
Регистрация: 13.02.2018
Сообщений: 19
21.02.2018, 14:54  [ТС] 3
Да, ошибка возникает здесь
0
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
21.02.2018, 15:02 4
В операционной системе Windows
используется встроенная библиотека Windows Scripting Host
для создания ссылки на класс используется "scripting.filesystemobject" (класс filesystemobject из библ. scripting)
как это в MAC вызывается еще не знаю, в гугле ищу

но есть и другие способы перечисления файлов в папке
0
21.02.2018, 15:02
Hugo121
6394 / 2462 / 439
Регистрация: 19.10.2012
Сообщений: 7,323
21.02.2018, 15:05 5
Думаю для Маков должен быть класс. Словарь ведь сделали!
0
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
21.02.2018, 15:18 6
Цитата Сообщение от Hugo121 Посмотреть сообщение
Словарь ведь сделали!
а как словарь вызывается в МАС не подскажешь ?

Добавлено через 7 минут
Нашел какой-то хакерский сайт, по твоей подсказке
похоже там есть такая: AppleScript называется...
0
Hugo121
6394 / 2462 / 439
Регистрация: 19.10.2012
Сообщений: 7,323
21.02.2018, 15:26 7
Для Мака сделан класс на коллекции, в котором просто стоит ветвление - если Вин, то стандартный словарь, если Мак - то работает класс.
Два человека отписались что работает.
Класс дома, сейчас в сети искать некогда, но не AppleScript точно. Где-то на github'е брал вроде...

Добавлено через 3 минуты
Точно там, искать "Drop-in replacement for Scripting.Dictionary on Mac"
1
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
21.02.2018, 16:26 8
Нашел еще кое что:
Выполнение файлов и папок Операции в Excel программным способом 2011 для Mac
https://msdn.microsoft.com/en-us/lib...ice.14%29.aspx



Похоже Ирина7225, бросила эту затею
но если желание устранить эту ошибку еще теплиться вот пример без использования "scripting.filesystemobject"
тоесть с использованием встроенной в excel функции dir

просмотр всех папок и файлов
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Files()
    '
    'просмотр всех папок и файлов в папке рабочей книги
    '
    Dim Tmp$, i&
    Tmp = Dir(ThisWorkbook.Path & "\*.*", vbDirectory)
    Do While Len(Tmp) > 0
        Tmp = Dir(): i = i + 1
        Debug.Print Tmp '--Вывод в окно Debug
        Cells(i, 1).Value = Tmp '--Вывод на активный лист
    Loop
End Sub
Добавлено через 5 минут
Тоесть для исправления этой ошибки переменную fso нужно будет использовать как коллекцию (или массив)
и уже затем делать над полученными именами необходимые операции
0
Hugo121
6394 / 2462 / 439
Регистрация: 19.10.2012
Сообщений: 7,323
21.02.2018, 16:42 9
C Dir придётся переписывать код ещё много где, например тут:
Visual Basic
1
2
3
4
For Each file In fso.Files
        If InStr(1, file.Name, w.Name) Then
        Else
            Set wb = Workbooks.Open(file.Path)
Добавлено через 58 секунд
А в том варианте с словарёим была только одна коррекция - объявление этого объекта.
0
Ирина7225
1 / 1 / 0
Регистрация: 13.02.2018
Сообщений: 19
21.02.2018, 16:47  [ТС] 10
Я здесь, не в коем случае не бросила. Я в другом часовом поясе, у меня поздний вечер, поэтому отлучилась, прошу прощение.
С макросами я только месяц знакома, знаний мало, поэтому все, что вы написали для меня сложновато. С утра завтра попробую разобраться, и попробую использовать этот код. Если будут вопросы(а скорее всего будут и возможно глупые), буду задавать.
Спасибо огромное за отклик и помощь!
0
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
21.02.2018, 17:01 11
Да это легко переделать
я даже спать не ушел, хотя тоже в далеком часовом поясе нахожусь
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Files()
    '
    Dim Tmp$, i&, v, w As Workbook, wb
    Dim fso As New Collection
    Tmp = Dir(ThisWorkbook.Path & "\*.xl*", vbDirectory)
    Do While Len(Tmp) > 0
        Tmp = Dir(): i = i + 1
        fso.Add Tmp
    Loop
    
    Set w = ThisWorkbook 'Например эта книга
    
    For Each v In fso
        If InStr(v, w.Name) Then
        ElseIf v <> "" Then
            Set wb = Workbooks.Open(v)
        End If
    Next
End Sub
Добавлено через 1 минуту
Цитата Сообщение от fever brain Посмотреть сообщение
"\*.xl*
будут открываться только расширения с этим префиксом
0
Hugo121
6394 / 2462 / 439
Регистрация: 19.10.2012
Сообщений: 7,323
21.02.2018, 17:28 12
Переделать то можно, но придётся писать два варианта кода - для винды свой, для мака свой... Ну или всё менять на некрасивый маковский
Я тоже поискал - нет похоже пока такого компонента. Есть возможность написать, даже за деньги - вон по ходу дела нашёл где продают альтернативный application.filesearch
0
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
21.02.2018, 18:30 13
В коде от Ирины нужны только имена файлов
открываются они средствами VBA и уже затем там чтото копируется и тп
тоесть никаких других методов в ее FSO не используется
так-что можно обойтись вариантом из примера #11 для любых OS лижбы там офис работал
0
Ирина7225
1 / 1 / 0
Регистрация: 13.02.2018
Сообщений: 19
22.02.2018, 07:00  [ТС] 14
Добрый день всем!

На этой строке выходит ошибка - устройство недоступно
Visual Basic
1
Tmp = Dir(ThisWorkbook.Path & "\*.xl*", vbDirectory)
Добавлено через 19 минут
Вот начало кода, посмотрите, пожалуйста, может я что-то не так совместила.Sub Соединение_книг()
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    Dim ws As Worksheet
    Dim Tmp$, i&, v, w As Workbook, wb
    Dim fso As New Collection
    Application.EnableEvents = 0
    Application.ScreenUpdating = 0
    Set w = ThisWorkbook
    For Each sh In w.Worksheets
        sh.UsedRange.Offset(1).Clear
    Next
   Tmp = Dir(ThisWorkbook.Path & "\*.xl*", vbDirectory)
    Do While Len(Tmp) > 0
        Tmp = Dir(): i = i + 1
        fso.Add Tmp
    Loop
    For Each v In fso
        If InStr(v, w.Name) Then
        ElseIf v <> "" Then
            Set wb = Workbooks.Open(v)
              For Each ws In wb.Worksheets
0
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
22.02.2018, 07:08 15
Выполни какойнибудь из макросов

TestFile или TestFolder
там где в коде <user name> вставь имя пользователя в системе MAC, а где YourFileName.xlsx - вставь имя документа
затем отпишись что получилось ..

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub TestFile()
'First argument, 1 = file and 2 = folder.
'Note: This macro uses the FileOrFolderExistsOnMac function.
    If FileOrFolderExistsOnMac(1, "Macintosh HD:Users:<user name>:Documents:YourFileName.xlsx") = True Then
        MsgBox "File exists."
    Else
        MsgBox "File does not exist."
    End If
End Sub
 
Sub TestFolder()
'First argument, 1 = file and 2 = folder.
'Note: This macro uses the FileOrFolderExistsOnMac function.
    If FileOrFolderExistsOnMac(2, "Macintosh HD:Users:<user name>:Documents") = True Then
        MsgBox "Folder exists."
    Else
        MsgBox "Folder does not exist."
    End If
End Sub
 
Function FileOrFolderExistsOnMac(FileOrFolder As Long, FileOrFolderstr As String) As Boolean
'By Ron de Bruin
'30-July-2012
'Function to test whether a file or folder exist on a Mac.
'Uses AppleScript to avoid the problem with long file names.
    Dim ScriptToCheckFileFolder As String
    ScriptToCheckFileFolder = "tell application " & Chr(34) & "Finder" & Chr(34) & Chr(13)
    If FileOrFolder = 1 Then
        ScriptToCheckFileFolder = ScriptToCheckFileFolder & "exists file " & _
        Chr(34) & FileOrFolderstr & Chr(34) & Chr(13)
    Else
        ScriptToCheckFileFolder = ScriptToCheckFileFolder & "exists folder " & _
        Chr(34) & FileOrFolderstr & Chr(34) & Chr(13)
    End If
    ScriptToCheckFileFolder = ScriptToCheckFileFolder & "end tell" & Chr(13)
    FileOrFolderExistsOnMac = MacScript(ScriptToCheckFileFolder)
End Function
Добавлено через 4 минуты
Я спрашиваю, потомучто в MAC файловая система по другому устроенна
и пусть тебя не удивляют мои вопросы, у меня нет MAC по твоим ответам буду ориентироваться (не только я,
но также все кто сможет разобраться)
0
Ирина7225
1 / 1 / 0
Регистрация: 13.02.2018
Сообщений: 19
22.02.2018, 07:12  [ТС] 16
Да вы что, я вообще не удивляюсь ничему и рада, что вы помогаете.
Оба макроса выдают - Folder does not exist.
0
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
22.02.2018, 07:17 17
Ну понятно, то что они чтото выдали уже хорошо (выдали что ничего не найденно)
вот мое имя пользователя VasyaPupkin
тогда вызывать макрос я буду так:

Visual Basic
1
2
3
4
5
    If FileOrFolderExistsOnMac(2, "Macintosh HD:Users:VasyaPupkin:Documents") = True Then
        MsgBox "Folder exists."
    Else
        MsgBox "Folder does not exist."
    End If
вы точно так-же сделали (тоесть свое имя юзера вставляли ?)
0
Ирина7225
1 / 1 / 0
Регистрация: 13.02.2018
Сообщений: 19
22.02.2018, 07:24  [ТС] 18
Да, так, только имя пользователя в кавычках было <>, но и без них тоже самое выдает.
0
fever brain
oh my god
1374 / 730 / 152
Регистрация: 05.01.2016
Сообщений: 2,213
Записей в блоге: 7
22.02.2018, 07:35 19
Имя пользователя можно еще так узнать... (тоже макросом)
Visual Basic
1
2
3
4
Sub UserName()
    MsgBox "Имя пользователя: " & Environ("UserName")
    Debug.Print Environ("UserName")
End Sub
0
Ирина7225
1 / 1 / 0
Регистрация: 13.02.2018
Сообщений: 19
22.02.2018, 07:38  [ТС] 20
Макрос имя пользователя не выдает. Выдает результат такой - Имя пользователя:
Но я единственный пользователь и имя у меня одно, там ошибки быть не должно.

Добавлено через 2 минуты
Цитата Сообщение от fever brain Посмотреть сообщение
Добавлено через 9 минут
Я уже нагуглил, и стал догадываться в чем FS мака отличается от FS винд.
если этот макрос выдаст какоето имя то решение почти найденно
Visual Basic
1
2
3
4
5
Sub TEST()
MsgBox Dir("Macintosh HD:Users:" & Environ("username") & "esktopr:")
End Sub
Выдает ошибку - устройство не найдено.
0
22.02.2018, 07:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2018, 07:38

Ошибка: "Не удалось привести типа объекта "System.Windows.Forms.TextBox" к типу "System.IConvertible".""
Программа выдает такой текст: &quot;System.InvalidCastException: &quot;Не удалось привести типа объекта...

Ошибка "не удалось создать имя ресурса"
При копировании проекта в другое место на жестком диске возникает ошибка в проекте. Как исправить?

При добавлении WindowsMediaPlayer на форму возникает ошибка "Не удалось создать компонент AxHost."
Добрый день При добавлении медиа плеера на форму , возникает ошибка. Изначально плеер работал и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru