2014-01-10 3 views
1

Я пытаюсь сделать макрос, где VBA ищет определенное слово в столбце и когда он находит слова, он копирует всю строку из одной книги в другую. Он может найти слово более одного раза, поэтому я пытаюсь сделать его петлей, хотя он только петли ONCE в цикле for и затем останавливается.Только для циклов цикла и сбоев

Вот для.

Application.Workbooks.Open ("C:\Documents and Settings\1848052\Mis documentos\Portafolios\Vistas\Portafolio.xlsm") 
i = 9 

For j = 8 To 1000 
    celda = Workbooks("Portafolio.xlsm").Sheets("FemCo").Range("B" & j).Value 

    If celda = area Then 
     Workbooks("Portafolio.xlsm").Sheets("FemCo").Range("B" & j).Select 
     fila = ActiveCell.Row 

     Windows("Portafolio.xlsm").Activate   ' Copiar row 
     Range("A" & fila & ":" & "V" & fila).Select 
     Selection.Copy 

     Windows("Vista RPAs.xlsm").Activate  'Pegar row 
     Range("B" & i & ":W" & i).Select 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
     Application.CutCopyMode = False 

     i = i + 1 
    End If 
Next 

Как я уже говорил раньше, это только петли один раз, а затем это:

Workbooks("Portafolio.xlsm").Sheets("FemCo").Range("B" & j).Select 

является та часть, которая выходит из строя, и я получаю «Ошибка 1004». Как вы думаете, я могу исправить эту ошибку?

Заранее спасибо.

+1

пожалуйста, не используйте 'select' заявление! Наиболее вероятная проблема заключается в том, что вы пытаетесь выбрать диапазон в неактивной книге. Попробуйте добавить 'Windows (« Portafolio.xlsm »). Активировать' перед строкой 'Workbooks (« Portafolio.xlsm »). Листы (« FemCo »). Диапазон (« B »& j). Выберите« –

+0

»Спасибо большое , он сделал трюк! Как бы вы предложили мне найти номер строки ячейки без использования оператора select? – robti

+0

попробуйте следующее: 'fila = Workbooks (« Portafolio.xlsm »). Листы (« FemCo »). Диапазон (« B »& j) .Row' или просто' fila = j', потому что 'Range (« B »& j) 'находится в строке № j :) –

ответ

1

Вместо этого вы можете использовать этот код. Он избегает использования оператора For j=8 to 1000 (вместо этого он использует метод Find - это намного лучше, если у вас много строк).

Sub test() 
    Application.ScreenUpdating = False 
    Workbooks.Open ("C:\Documents and Settings\1848052\Mis documentos\Portafolios\Vistas\Portafolio.xlsm") 
    i = 9 

    With Workbooks("Portafolio.xlsm").Sheets("FemCo") 
     Set c = .Range("B8:B1000").Find(area, LookIn:=xlValues) 
     If Not c Is Nothing Then 
      firstAddress = c.Address 
      Do 
       Workbooks("Vista RPAs.xlsm").ActiveSheet.Range("B" & i & ":W" & i).Value = _ 
       .Range("A" & c.Row & ":" & "V" & c.Row).Value 
       i = i + 1 
       Set c = .Range("B8:B1000").FindNext(c) 
      Loop While Not c Is Nothing And c.Address <> firstAddress 
     End If 
    End With 
    Workbooks("Portafolio.xlsm").Close 
    Application.ScreenUpdating = True 
End Sub 

Обратите внимание, что лучше изменить Workbooks("Vista RPAs.xlsm").ActiveSheet к Workbooks("Vista RPAs.xlsm").Sheets("SomeSheetName")

+0

Это сделало вещи намного быстрее! Спасибо. – robti

+0

Последний вопрос, могу ли я сделать эту процедуру, не открывая файл «Portafolio.xlsm»? Или совершенно необходимо открыть его? – robti

+0

Вы должны открыть его. Я думаю, что если вы ищете, вы можете найти способ не открывать его, но это будет сложно. Вы можете просто вызвать 'Application.ScreenUpdating = False' в самом начале вашего functoin и' Application.ScreenUpdating = True' в конце функции, и пользователь не заметит, что вы открыли книгу. См. Мой обновленный ответ –

1

Simoco получил это в первый раз, выбрав в неактивной книге. (только если блок)

Workbooks("Portafolio.xlsm").Sheets("FemCo").Range("A" & fila & ":" & "V" & fila).Copy 

    Workbooks("Vista RPAs.xlsm").activesheet.Range("B" & i).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
    Application.CutCopyMode = False 

Кстати, прибрано с некоторыми действительными точками, но «лучше» способ сделать это было бы запустить петлю вокруг находят заявление, которое ищет соответствующий диапазон для HTE слово, которое вы хотите, и завершает работу, когда найденная найденная запись снова найдена или записи не найдены. Существует множество примеров этого.

+1

Попробуйте добавить 'Таблицы (« FemCo »)' после 'Windows (« Portafolio.xlsm »)' и 'ActiveSheet' после' Windows («Vista RPAs.xlsm») 'во второй и третьей строках (я думаю , без 'ActiveSheet' это не сработает) и измените' fila' на 'j', потому что они одинаковы –

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