2014-01-10 40 views
1

我正在嘗試執行一個宏,其中VBA在列中查找特定單詞,並且當它找到單詞時,它將整個行從一個工作簿複製到另一個工作簿。它可以多次找到這個單詞,所以我試圖讓它循環,儘管它只在循環中循環一次,然後停止。僅用於循環一次循環並崩潰

這裏是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」)。Activate'在行Workbooks(「Portafolio.xlsm」)。表(「FemCo」)。範圍(「B」&j)。選擇' –

+0

非常感謝,它做到了!你會如何建議我可以在不使用select語句的情況下找到單元格的行號? – robti

+0

試試這個:'fila = Workbooks(「Portafolio.xlsm」)。Sheets(「FemCo」)。Range(「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").ActiveSheetWorkbooks("Vista RPAs.xlsm").Sheets("SomeSheetName")

+0

它使事情變得更快!謝謝。 – robti

+0

最後一個問題,我可以在不必打開「Portafolio.xlsm」文件的情況下執行此過程嗎?還是完全有必要打開它? – robti

+0

你應該打開它。我想如果你搜索,你可以找到一種方法來打開它,但它會很複雜。你可以在函數開始時調用'Application.ScreenUpdating = False',在函數結束時調用'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 

順便說一句,整理了一些正確的觀點,但「好」的方式來做到這一點是奔波一個查找聲明,其搜索相關的範圍興田循環你想要的單詞,並在第一次找到記錄再次找到或沒有找到記錄時退出,這裏有很多例子。

+1

嘗試在第二行和第三行的Windows(「Vista RPAs.xlsm」)之後在Windows(「Portafolio.xlsm」)和「ActiveSheet」之後添加'Sheets(「FemCo」)' ,沒有'ActiveSheet'它不會工作)並將'fila'更改爲'j'因爲它們是相同的 –