2015-04-17 7 views
0

Хорошо, поэтому я относительно не знаком с Excel VBA. Я пытаюсь сделать что-то, что кажется мне очень простым, и есть много, много примеров того, как это сделать, которые я прочитал исчерпывающе, но я не могу пройти мимо этого так ... вот и все.Копирование диапазона ячеек из одной книги в другую дает ошибку 400

Я пытаюсь вставить диапазон ячеек из одного листа в другой в Excel Microsoft Office Professional Plus 2010. Я думаю, что я уменьшил проблему до абсолютной простейшей формы, чтобы проиллюстрировать проблему. Это всего лишь фрагмент. Переменные VictimResults и TempWorksheet устанавливаются выше. Я не включил код, потому что думал, что это может смутить артикуляцию проблемы.

Dim SourceWorksheet As Worksheet 
Dim TargetWorksheet As Worksheet 
Dim SourceRange As Range 
Dim TargetRange As Range  

Set SourceWorksheet = VictimResults 
Set TargetWorksheet = TempWorksheet 
Set SourceRange = Cells(1, 1) 
Set TargetRange = Cells(1, 1)  

TargetWorksheet.Range (TargetRange) = SourceWorksheet.Range (SourceRange) Я поместил переменные SourceWorksheet, TargetWorksheet, SourceRange и TargetRange в часах и установить точку останова в последней строке, и все они действительны объекты (не нуль). Когда я перехожу через точку останова, я получаю диалоговое окно, которое просто говорит «400».

Любая помощь очень ценится.

--- edit --- Я создал этот полный файл VBA, который реплицирует проблему. Мысль, которая может помочь кому-то ответить.

Option Explicit 

Sub Main() 
    GetFirstWorksheetContainsName("Sheet1").Range(Cells(1, 1)).Value = GetFirstWorksheetContainsName("Sheet2").Range(Cells(1, 1)).Value 
End Sub 

Function GetFirstWorksheetContainsName(worksheetNameContains) As Worksheet 
    Dim m As Long 
    Dim result As Worksheet 

    m = 1 

    Do 
     If InStr(1, Sheets(m).Name, worksheetNameContains) Then 
      Set result = Sheets(m) 
      Exit Do 
     End If 

     m = m + 1 
    Loop Until m > ThisWorkbook.Worksheets.Count 

    Set GetFirstWorksheetContainsName = result 
End Function 

Вот что-то еще, что я пробовал, что дает что-то более подробное.

Option Explicit 

Sub Main() 
    Sheets("Sheet1").Select 
    Range(Cells(1, 1)).Select 
    Selection.Copy 
    Sheets("Sheet2").Select 
    Range(Cells(1, 1)).Select 
    ActiveSheet.Paste 
End Sub 

Это дает мне "метод 'Диапазон' объекта '_global' не удалось" ошибка при выполнении первого диапазона (Cells (1, 1)). Выберите строку.

+0

Почему вы используете пользовательский UDF? Вы просто хотите установить диапазон листа 2 на те же значения, что и тот же диапазон в Sheet1? (или два листа, как определено вами?) – BruceWayne

+0

Я использую пользовательскую функцию, определенную пользователем, потому что я работаю над большим проектом и пытаюсь повторно использовать код там, где это возможно, но это не то место, где он терпит неудачу. Мой пользовательский UDF работает нормально. – rsnell

+0

Вы получаете сообщение об ошибке в более подробном, потому что ваш Range имеет только одну ячейку.AFAIK у вас должно быть два, поэтому попробуйте использовать 'Range (ячейки (1,1), ячейки (1,1))' – BruceWayne

ответ

0

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

+0

Я пробовал это, и я добавлю код в вопрос, редактируя выше. – rsnell

0

Я не уверен, откуда берутся 400, но исключение, которое выбрасывается, такое же, что и в вашем подробном примере (1004 - «Диапазон методов» объекта «_Решет» сработал », и его выбрасывают по той же причине.

проблема заключается в том, как вы адресация диапазона. Cells(1, 1) неявно устанавливается в активного листа, а не то, что диапазон вы передаете его в качестве параметра. так как вам нужно только одну ячейку, может просто использовать .Cells собственность вместо:

Sub Main() 

    GetFirstWorksheetContainsName("Sheet1").Cells(1, 1).Value = _ 
     GetFirstWorksheetContainsName("Sheet2").Cells(1, 1).Value 

End Sub 

Если вам нужно скопировать более одной ячейки, вы должны либо захватить материалы ссылку на рабочие листы вместо встраивания вызовы GetFirstWorksheetContainsName, если вы используете динамические диапазоны:

Sub Main() 

    Dim source As Worksheet 
    Dim data As Range 

    Set source = GetFirstWorksheetContainsName("Sheet2") 
    Set data = source.Range("A1:B2") 

    GetFirstWorksheetContainsName("Sheet1").Range(data.Address).Value = data.Value 

End Sub 

Или жесткий код это:

Sub Main() 

    GetFirstWorksheetContainsName("Sheet1").Range("A1:B2").Value = _ 
     GetFirstWorksheetContainsName("Sheet2").Range("A1:B2").Value 

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