2016-06-01 4 views
-1

Я все еще довольно новичок в VBA (обучение работе, исходя из фона JS), и мне нужно немного помочь в этом. Моя цель: прокручивать каждый лист (кроме листа «Сводка», хотя я не уверен, как исключить это из цикла) в книге и копировать A2 на каждом листе, а также последнюю ячейку, содержащую значение в колонку L каждого листа и вставлять их рядом друг с другом в столбцы A и B в «Сводный лист» соответственно. Я не специалист по синтаксису VBA любыми способами, поэтому, если кто-то имеет какой-либо способ реорганизовать это (я знаю, что мне не нужны все методы .select), я был бы признателен. Сейчас я получаю ошибку «неверная или неквалифицированная ссылка» в строке 28. Моя цель - учиться, поэтому, если у вас есть какой-либо вклад, я бы с удовольствием объяснил логику. Благодарю.Простая ошибка скрипта VBA

  Sub Macro7() 
      ' 
      ' Macro7 Macro 
      ' 
      ' Keyboard Shortcut: Ctrl+c 


      Dim ws As Worksheet 
      Dim lastRow As Integer 
      Dim summaryRow As Integer 

       summaryRow = 1 

      For Each ws In ActiveWorkbook.Worksheets 

      'Copy item number and paste on Summary Page' 

       Range("A2").Select 
       Selection.Copy 
       Sheets("Summary").Select 
       Range("A" & summaryRow).Select 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
        :=False, Transpose:=False 

      'Copy corresponding BOM item # and paste on Summary Page' 

       ws.Select 
       lastRow = .Cells(.Rows.Count, "L").End(xlUp).Row 
       Range("L" & lastRow).Select 
       Application.CutCopyMode = False 
       Selection.Copy 
       Sheets("Summary").Select 
       Range("B" & summaryRow).Select 
       Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
        :=False, Transpose:=False 

       summaryRow = summaryRow + 1 

        Next ws 
      End Sub 
+3

Вы предируете '.Cells (...' и '.Rows ...' с периодом (например, '.' или * полная остановка *). Этот способ привязки ячеек предназначен для использования в [ С ... End With statement] (https://msdn.microsoft.com/en-us/library/wc500chb.aspx). Начните с изменения периода или добавления с помощью ... End With. – Jeeped

+0

@ Поблагодарили, который заставил его работать без каких-либо ошибок, однако он дал некоторые неясные результаты: он вставил значения в столбец B, но ничего в столбце A (в сводке). Кроме того, он пропустил некоторые случайные строки здесь и там; «FWIW, в этом смешном отчете есть более 300 листов. –

ответ

2

Вы можете избежать использования .Select¹ путем построения With ... End With statement, который проходит ссылку листа родителя вместе с клетками и ссылки диапазона. Прямая передача стоимости является более целесообразной и более эффективной, чем копирование и вставка. Кроме того, он избегает вовлечения в буфер обмена вообще.

Sub Macro7() 
    Dim ws As Worksheet 
    Dim lastRow As Long 
    Dim summaryRow As Long 

    summaryRow = 1 

    For Each ws In ActiveWorkbook.Worksheets 
     With ws 
      If LCase(.Name) <> "summary" Then 
       Worksheets("Summary").Range("A" & summaryRow).Resize(1, 2) = _ 
        Array(.Range("A2").Value, .Cells(Rows.Count, "L").End(xlUp).Value) 
       summaryRow = summaryRow + 1 
      End If 
     End With 
    Next ws 

End Sub 

См How to avoid using Select in Excel VBA macros для более методов на получение от полагаться на выбор и активировать для достижения ваших целей.

+0

спасибо за вашу помощь, ваше объяснение имеет смысл. Я пытался выяснить цель With..EndWith .. и это имеет смысл, что придает эту родительскую ссылку для детей. Мне удалось заставить его работать, добавив ws.Select над первым блоком цикла, но я буду работать над рефакторингом, чтобы заставить его работать быстрее и выглядеть более профессионально. Благодаря! –

1

Ваш код отлично выглядит отдельно от '.' - отметил Джапид.

Я просто аккумулировал ваш код здесь, используя .select - немного грязный и длинный (если вы строите большие макросы, он может добавить ненужную работу и замедлить ее).

Вы можете просто сделать команды прямо из ссылки диапазона, как показано ниже:

 Sub Macro7() 

     Dim ws As Worksheet 
     Dim lastRow As Integer 
     Dim summaryRow As Integer 

      summaryRow = 1 

     For Each ws In ActiveWorkbook.Worksheets 

     'Copy item number and paste on Summary Page' 

      Range("A2").Copy 
      Sheets("Summary").Range("A" & summaryRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
       :=False, Transpose:=False 

     'Copy corresponding BOM item # and paste on Summary Page' 

      lastRow = ws.Cells(Rows.Count, "L").End(xlUp).Row 
      Application.CutCopyMode = False 
      ws.Range("L" & lastRow).copy 
      Sheets("Summary").Range("B" & summaryRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
       :=False, Transpose:=False 

      summaryRow = summaryRow + 1 

       Next ws 
     End Sub 

Я обычно код из рабочих листов («») («) действие каждый раз, если я не делаю много диап.». работы на 1 листе, чтобы я мог легко видеть, что происходит, когда я заглядываю, но вы найдете свое собственное предпочтение работе (не забывайте, что вы можете пройти через свой код с помощью F8, чтобы посмотреть, что он делает каждый шаг пути)

Надеюсь, это поможет вам начать путешествие по VBA!

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