2017-02-10 3 views
1

Это первый раз, когда я пишу макрос самостоятельно, и я столкнулся с двумя небольшими проблемами.Ошибка VBA Runtime 1004 «Определенная пользователем или объектная ошибка» с диапазоном

Задача Макро: Скопируйте информацию одного документа в другой документ в определенном столбце, если столбец пуст, в этом случае он должен использовать следующий столбец.

Это код до сих пор:

Sub CopyData() 

    Dim i As Long 
    Dim wbA As Workbook 
    Dim wbN As Workbook 
    Dim Filepath As String 

    i = 7 
    Set wbA = ThisWorkbook 

    Filepath = "C:\Users\sebastian\Desktop\assessment answers" 

    Do 
     If IsEmpty(wbA.Sheets("Answers").Cells(1, i)) Then 

      Set wbN = Workbooks.Open(Filepath) 

      If Cells(37, 3).Value = 31 Then 

       wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _ 
       Destination:=wbA.Sheets("Answers").Range(Cells(36, i), Cells(45, i)) 

      ElseIf Cells(37, 3).Value = 41 Then 

       wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _ 
       Destination:=wbA.Sheets("Answers").Range(Cells(46, i), Cells(55, i)) 

      ElseIf Cells(37, 3).Value = 51 Then 

       wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _ 
       Destination:=wbA.Sheets("Answers").Range(Cells(56, i), Cells(65, i)) 

      Else 

       MsgBox "There could be a problem with the data, please check if the candidate has selected a topic." 
       Exit Sub 

      End If 

      wbN.Sheets("Answers").Range(Cells(2, 4), Cells(3, 4)).Copy _ 
      Destination:=wbA.Sheets("Answers").Range(Cells(1, i), Cells(2, i)) 

      wbN.Sheets("Answers").Range(Cells(7, 4), Cells(36, 4)).Copy _ 
      Destination:=wbA.Sheets("Answers").Range(Cells(6, i), Cells(35, i)) 

      wbN.Close 

      Exit Sub 

     Else 

      i = i + 1 

     End If 

    Loop 

End Sub 

1. Проблема (VBA Runtime Ошибка 1004) здесь происходит после того, как: Если клетки (37, 3) .Value = 31 Тогда

Если я использую .Range("D37:D46") и диапазоны для других ячеек, он работает, но я хотел бы увеличить столбец с помощью цикла, когда уже заполнены данные. У вас есть идея решить эту проблему?

2. Есть ли способ изменить путь к файлу, чтобы тот, кто когда-либо использовал его, будет направлен на рабочий стол, где должен находиться файл?

Filepath = "C:\Users\sebastian\Desktop\assessment answers" 

Спасибо за ваши идеи,

Sebastian

+1

Re 1 эта проблема во многих вопросах здесь. Вы должны также квалифицировать вызовы «Ячейки» с листом: 'wbN.Sheets (« Ответы »). Диапазон (wbN.Sheets (« Ответы »). Ячейки (37, 4), wbN.Sheets (« Ответы ») .Целты (46, 4)). Использование переменной для листа или оператора With приведет к ее убою. – Rory

+0

Вам нужно идентифицировать «Ячейки (37,3). Значение, из которого написана книга и какой лист. Я думаю, это может решить сообщение об ошибке. Когда я проверяю ваш код, он не показывает мне ошибки. –

+0

В ответ на проблему 1: https://support.microsoft.com/en-us/help/210684/copying-worksheet-programmatically-causes-run-time-error-1004-in-excel В отношении проблемы 2: вы можете эталонный рабочий стол вроде этого: Environ $ («USERPROFILE») и «\ Desktop», но я не уверен, насколько он надежный, лучше использовать thisworkbook.path, если файл на рабочем столе в любом случае – User632716

ответ

0

Для других, которые могут быть заинтересованы, я отправляю мои решения здесь:

Проблема 1:

После предложений по Рори и Naing Win Хтуна я включил путь в передней части клетки. Очевидно, я мог бы это сделать и с С.

wbN.Sheets("Answers").Range(wbN.Sheets("Answers").Cells(37, 4), wbN.Sheets("Answers").Cells(46, 4)).Copy _ 
Destination:=wbA.Sheets("Answers").Range(wbA.Sheets("Answers").Cells(36, i), wbA.Sheets("Answers").Cells(45, i)) 

Задача 2:

Теперь пользователь может ввести путь и имя файла вручную, что, очевидно, является гораздо лучшим решением. Об этом также говорил Наинг Вин Хтун.

Благодарим всех вас за помощь.

0

Номер ошибки 1004 обычно означает "я не могу найти то, что вы ищете".

Для этого конкретного примера вы видите эту ошибку, потому что вы недостаточно четко указываете свою кодировку. Лучше пойти OTT, если что-нибудь.

Таким образом, вместо

If Cells(37, 3).Value = 31 Then 

Использование:

If wbA.Sheets("Sheet Name Here").Cells(37, 3).Value = 31 Then 

Еще лучше включать 'с' заявление в своем коде. Обобщенный пример ниже:

Sub Example() 

    Dim wb As Workbook 
    Dim sht As Worksheet 

    Set wb = ActiveWorkbook 
    Set sht = wb.ActiveSheet 

    With sht 
     .Name = "New Name" 
     .Visible = xlSheetVisible 
     .Protect 
    End With 

End Sub 

Это экономит много нажатий клавиш и позволяет сделать несколько вещей одного объекта в один удар.

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