2016-01-07 7 views
0

Я использую VBA для управления набором данных. У меня будут месячные данные в течение 50 месяцев, и я хочу классифицировать их на разные листы на основе ПЕРВОГО слова в ячейке. Вот что я сделал до сих пор;Ошибка копирования и вставки: '1004'

Я создал книгу с 2-мя листами,

  1. Лист1 (Служащий Inventory)
  2. Лист2 (PB)

и мой код записывается и сохраняется в этом учебном пособии.

Sub myCode() 
    Dim OldString As String 
    Dim NewString As String 
    Set i = Sheets("Employee Inventory") 
    Set PB = Sheets("PB") 
    Dim counterPB 
    counterPB = 2 
    Dim d 
    Dim j 
    d = 1 
    j = 2 
    Do Until IsEmpty(i.Range("D" & j)) 
     OldString = i.Range("D" & j) 
     NewString = Left(OldString, 2) 
     If NewString = "PB" Then 
      i.Rows(j).EntireRow.Copy 
      PB.Range("A" & counterPB).Select 
      PB.Paste 
      counterPB = counterPB + 1 
     End If 
     j = j + 1 
    Loop 
End Sub 

Извините за код, поскольку это выглядит странно. Этот код просматривает Sheet1 и сканирует столбец «D» и ищет первое слово, начинающееся с «PB». Как только он найдет его, он скопирует и вставляет всю строку в другой лист, называемый Sheet2 (PB).

Когда я нахожусь в окне Microsoft Visual Basic И у меня есть таблица Excel с открытой вкладкой Sheet1 (Employee Inventory), и когда я нажимаю Run Sub, я получаю следующую ошибку: Ошибка времени выполнения '1004': Application-defined или объектная ошибка. Когда я нажимаю на вкладку «PB», ничего не копируется и не вставляется туда.

ОДНАКО, когда я нажимаю на вкладку PB, а затем нажимаю Run Sub, коды выполняются, и любые строки, содержащие первое слово «PB», будут скопированы и вставлены на вкладку «PB».

Мой вопрос: почему он работает, только когда у меня открыт Sheet2, а не когда у меня открыт Sheet1?

ответ

2

при использовании range.select его родительский лист должен быть выбран, поэтому мы можем использовать PB.Activate или вообще не использовать .select.

Попробуйте заменить это:

i.Rows(j).EntireRow.Copy 
PB.Range("A" & counterPB).Select 
PB.Paste 

с этой линии:

i.Rows(j).Copy PB.Rows(counterPB) 
0

Почему вы не просто выбрать второй лист в начале кода?

Попробуйте следующее

ActiveWorkbook.Sheets("Sheet2").Activate 

Если это действительно работает, если выбран этот лист, то он должен работать с этим.

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