2016-09-07 4 views
1

У меня есть код VBA, который должен экспортировать отфильтрованные данные запроса в Excel. Когда я активирую код через кнопку OnClick, я получаю ошибку: Method pastespecial of worksheet class failed.Доступ к VBA: метод pastespecial класса рабочего листа не прошел

Я бегу Access 2013 на Windows Server 2012 r2 машина.

УВА код:

Private Sub cbExport_Click() 

    On Error GoTo Command13_Click_Err 

    DoCmd.RunCommand acCmdSelectAllRecords 
    DoCmd.RunCommand acCmdCopy 

    Dim xlapp As Excel.Application 
    Set xlapp = CreateObject("Excel.Application") 

    With xlapp 
     .Workbooks.Add 
     .ActiveSheet.PasteSpecial Format:="Text", _ 
            Link:=False, _ 
            DisplayAsIcon:= False 

     .Cells.Select 
     .Cells.EntireColumn.AutoFit 
     .Visible = True 
     .Range("A1").Select 

    End With 

    Command13_Click_Exit: 
    Exit Sub 

    Command13_Click_Err: 
    MsgBox Error$ 
    Resume Command13_Click_Exit 

End Sub 

Изображение интерфейса:

Кто-нибудь есть идея?

+0

К сожалению, не может видеть изображение - " Этот сайт не может быть достигнут ». Ваши '.Cells.' и' .Range' ссылаются на приложение Excel, а не на рабочий лист, поэтому они вызовут ошибку. Не уверен в PasteSpecial - я привык видеть его в таком формате: 'Paste: = xlPasteValues, Operation: = xlNone, SkipBlanks: = False, Transpose: = False' –

+0

Я думаю, что это бит формата, а также диапазон, где возможно, я попытался с помощью 'ActiveSheet.Range (« a1 »). PasteSpecial xlPasteValues' и отлично, почему бы не использовать CopyFromRecordset вместо этого? –

ответ

1

Пара вещей неправильно:

  • Вы кажетесь использовали раннее связывание размерности переменной xlApp, но затем использовать позднее связывание для инициализации этой переменной.

  • Метод .PasteSpecial() должен использоваться для объекта диапазона, а не для объекта листа.

  • Похоже, что вы используете неправильные аргументы метода .PasteSpecial.

  • Метод паста должна быть числовое значение, часть xlPasteType перечисления


Попробуйте этот код вместо:

DoCmd.RunCommand acCmdSelectAllRecords 
DoCmd.RunCommand acCmdCopy 

Dim xlApp As Excel.Application 
Set xlApp = New Excel.Application 

xlApp.Workbooks.Add 
xlApp.Visible = True 

With xlApp.ActiveWorkbook.ActiveSheet 
    .Cells.PasteSpecial XlPasteType.xlPasteValues 
    .Cells.EntireColumn.AutoFit 
End With 
+0

Спасибо, что работал отлично, есть ли способ, который я могу исключить определенные поля и открыть фиксированный лист excel? – user1797935

+0

Вы можете сделать это наоборот, написав макрос в Excel, который использует ADO для запроса вашей базы данных, затем используйте метод '.CopyFromRecordset()', но он более продвинут, что это и невозможно для меня привести пример, не будучи рядом с вами на вашем компьютере! Я бы предложил исследовать это, хотя, если вы много работаете с БД, это сделает вашу жизнь в миллион раз легче. –

Смежные вопросы