MAC VBA Попытка вырезать одну ячейку из каждого листа и вставить в другой лист в следующую пустую ячейку - PullRequest
2 голосов
/ 25 сентября 2019

Я пытаюсь просмотреть каждый рабочий лист в активной рабочей книге, в которой листы создаются как часть работающего макроса.Имена могут быть разными каждый раз, поэтому я не могу просто искать.Я хочу взять один фрагмент информации (одну и ту же ячейку на каждом листе) и вставить его в следующую пустую ячейку в столбце на другом листе.

В строке 6 я получаю нижний индекс ошибки вне диапазона ошибки 9. Я проверил наименование листа, на который я вставляю, и это правильно.Никаких лишних пробелов.

Это сводит меня с ума.Вы можете помочь?

ps Я работаю над этим, чтобы запустить на MAC, чего я обычно не делаю, поэтому, возможно, у меня немного неправильный код.

For Each sh In ThisWorkbook.Worksheets
DoEvents

    sh.Activate
    Range("K5").Select
    Selection.Copy
    Sheets("Payment Ref").Range("b2").Select
    If Range("b2") = "" Then
    Range("b2").PasteSpecial Paste:=xlPasteFormats
    Range("b2").PasteSpecial Paste:=xlPasteValues
     Else
    Range("b2").Offset(1, 0).PasteSpecial xlPasteFormats
    Range("b2").Offset(1, 0).PasteSpecial xlPasteValues
    End If


Next sh

В концеПри запуске таблицы Ref Ref Payment должен быть столбец, заполненный номерами счетов из листов счетов, созданных в предыдущем разделе макроса.Это отлично работает.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Вам следует избегать использования .Select в целом, как указано в комментариях.Скорее всего, это причина вашей ошибки.Кроме того, если вы выполняете этот код на более чем 1 или 2 листах (в зависимости от того, имеет ли B2 значение), процедура будет сохранять значения в ячейке B3.Я бы предложил следующие изменения:

For Each sh In ThisWorkbook.Worksheets
    sh.Range("K5").Copy
    Sheets("Payment Ref").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteFormats
    Sheets("Payment Ref").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
Next sh

Я думаю, что это должно сработать так же:

For Each sh In ThisWorkbook.Worksheets
    sh.Range("K5").Copy Sheets("Payment Ref").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0)
Next sh
0 голосов
/ 25 сентября 2019

Избегайте .Select и .Activate (см. Как избежать использования Select в Excel VBA ) и ссылки на лист для всех ваших диапазонов (например, используя With).

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

Cells(Rows.Count, "B").End(xlUp) 'last used cell in column B

Так что следующее должно работать для вас

Dim wsDestination As Worksheet
Set wsDestination = ThisWorkbook.Worksheets("Payment Ref")

For Each sh In ThisWorkbook.Worksheets    
    sh.Range("K5").Copy

    With wsDestination.Cells(wsDestination.Rows.Count, "B").End(xlUp).Offset(RowOffset:=1)
        .PasteSpecial Paste:=xlPasteFormats
        .PasteSpecial Paste:=xlPasteValues
    End With
Next sh
...