Макрос запускается только один раз в Excel vba до ошибки 462 времени выполнения: удаленный сервер не существует или недоступен - PullRequest
0 голосов
/ 23 ноября 2018

Так что у меня есть этот код в VBA, который экспортирует данные из Excel для доступа.Это работает нормально при первом и последующем запуске во второй раз. Появляется ошибка 462: удаленный сервер не существует или недоступен.снова хорошо в первый раз.Я пробовал поиск в Google, однако большинство из них говорят, что для любых объектов задано Nothing и пустые переменные, и это все еще не работает.

Sub AccImport()
Dim acc As New Access.Application
Dim myValue As Variant
myValue = InputBox("Enter table name for access export")
acc.OpenCurrentDatabase "C:\Users\User 1\Documents\Database21.accdb"
acc.DoCmd.TransferSpreadsheet _
        TransferType:=acImport, _
        SpreadSheetType:=acSpreadsheetTypeExcel12Xml, _
        TableName:=myValue, _
        Filename:=Application.ActiveWorkbook.FullName, _
        HasFieldNames:=True, _
        Range:="Sheet2$A1:AL104"
        CurrentDb.TableDefs(myValue).Fields("F4").Properties!ColumnWidth = 2500
        CurrentDb.TableDefs(myValue).Fields("F7").Properties!ColumnWidth = 2500

acc.CloseCurrentDatabase
acc.Quit
Set acc = Nothing
myValue = Empty
MsgBox " The data has been exported"

Application.DisplayAlerts = False
Sheets("Sheet2").Select
ActiveWindow.SelectedSheets.Delete
Range("A1").Select
Application.DisplayAlerts = True
End Sub

Ниже приведен фрагмент кода, где эта ошибка, кажется, появляется при выполнении второго раунда.Любая помощь приветствуется.Спасибо

CurrentDb.TableDefs(myValue).Fields("F4").Properties!ColumnWidth = 2500

1 Ответ

0 голосов
/ 23 ноября 2018

Я выбрал подход к исправлению кода, который должен решить проблему.Проверка каждого из объектов, из строки разрыва кода, в Immediate Window также может помочь (например, что возвращает «? Currentdb.Name»)

1) VBA поддерживает New как часть объявления объекта, но... (лучше всего исследовать этот бит. Из памяти он всегда медленнее, потому что vba должен перепроверить, был ли создан экземпляр объекта.)

Dim acc As Access.Application: Set acc = New Access.Application

2a) Квалифицировать ваши вызовы CurrentDb

acc.CurrentDb.TableDefs(myValue).Fields("F4").Properties!ColumnWidth = 2500
acc.CurrentDb.TableDefs(myValue).Fields("F7").Properties!ColumnWidth = 2500

2b) Еще лучше, явно ссылаться на каждый из объектов в дереве [это поможет с попрошайничеством]

' add Reference to "Microsoft DAO 3.6 Object Library"
Dim db As DAO.Database
Dim tdf As DAO.TableDef

Set db = acc.CurrentDb
db.TableDefs.Refresh    ' CurrentDb should do this, but can't hurt
Set tdf = db.TableDefs(myValue)
With tdf
    .Fields("F4").Properties!ColumnWidth = 2500
    .Fields("F7").Properties!ColumnWidth = 2500
End With

Set tdf = Nothing
Set db = Nothing

Надеюсь, это поможет, GraemeR

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...