Necesita copyr una fila de una spreadsheet "A" a "" B "según el valor de celda en" A "y pegarla en una fila específica en" B "

Quiero copyr la fila 5 de la Hoja (" Logg ") en la spreadsheet " Work Order Test.xlsm " a otra spreadsheet " Logg_test.xlsx ".

Quiero pasarlo en la columna A y el número de fila depende de si es un nuevo logging o uno existente.

Así que, básicamente, encontraré el número de fila basado en el valor de la celda "B12" en la spreadsheet " Work Order Test.xlsm " y en la hoja " order de trabajo ". ¿Qué estoy haciendo mal?

Sub copypaste() Dim rngSearch As Range, rngFound As Range Dim lastRow As Integer Workbooks.Open Filename:="C:\Users\toreh\Documents\Logg_test.xlsx", _ UpdateLinks:=0 Windows("Work Order Test.xlsm").Activate Range("B12").Select Windows("Work Order Test.xlsm").Activate Sheets("Logg").Select Rows("5:5").Select Selection.Copy Windows("Logg_test.xlsx").Activate Set rngSearch = Range("B:B") Set rngFound = rngSearch.Find(Range("B12"), LookIn:=xlValues, LookAt:=xlPart) If rngFound Is Nothing Then lastRow = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row + 1 Else lastRow = rngFound.Row End If ActiveWindow.WindowState = xlNormal Range("A" & lastRow).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False ActiveWorkbook.Save Windows("Work Order Test.xlsm").Activate Sheets("Work Order").Select Range("A1:B1").Select End Sub 

Parece que hay dos problemas: el primero es que tiene Filas ("5: 5") en lugar de Rango ("5: 5") en su código; el segundo es su valor de búsqueda. Es el que está en la celda "B12" en la hoja activa del libro "Logg_test.xlsx", no la celda "B12" en la hoja originalmente activa en el libro "Work Order Test.xlsm".

Si usa Range por sí solo, esto se traduce en

 Application.ActiveWorkbook.ActiveSheet.Range 

Desde que activó el libro de trabajo "Logg_test.xlsx", Range ("B12") ya no hace reference a la misma celda.

En realidad, nada de lo que pretendas hacer hace que sea necesario seleccionar algo y es una buena práctica no hacerlo. Esto ayuda a evitar errores como su valor de búsqueda defectuoso.

Podrías transformar tu código en algo como lo siguiente.

 Sub copypaste() Dim logg_wkb As Workbook Dim order_test_wkb As Workbook Dim test_sheet As Worksheet Dim logg_sheet As Worksheet Dim target_sheet As Worksheet Dim lookup_value As String Dim copy_rng As Range Dim paste_rng As Range Dim rngSearch As Range Dim rngFound As Range Dim pasteRow As Integer Set logg_wkb = Workbooks.Open(Filename:="C:\Users\toreh\Documents\Logg_test.xlsx", UpdateLinks:=0) Set order_test_wkb = Workbooks("Work Order Test.xlsm") Set test_sheet = order_test_wkb.ActiveSheet Set logg_sheet = order_test_wkb.Worksheets("Logg") Set target_sheet = logg_wkb.ActiveSheet Set copy_rng = logg_sheet.Range("5:5") lookup_value = test_sheet.Range("B12") Set rngSearch = target_sheet.Range("B:B") Set rngFound = rngSearch.Find(lookup_value, LookIn:=xlValues, LookAt:=xlPart) If IsMatch(rngFound) Then pasteRow = rngFound.Row Else pasteRow = Application.Intersect(rngSearch, target_sheet.UsedRange).Rows.Count + 1 End If Set paste_rng = target_sheet.Range("A" & pasteRow) copy_rng.Copy paste_rng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False logg_wkb.Save order_test_wkb.Activate order_test_wkb.Sheets("Work Order").Select Range("A1:B1").Select End Sub Private Function IsMatch(MatchRng As Range) As Boolean IsMatch = Not (MatchRng Is Nothing) End Function 

Esto funciona en el mismo order que su código, pero solo usa seleccionar en la limpieza de la selección al final, que todavía es necesaria dado que Copy mueve la selección.

Esta versión aún no es óptima y las diversas partes del Sub se deben reorganizar y extraer en subs diferentes y funciones para que sea más fácil de entender. En particular, sería una buena idea extraer la lógica para determinar el range de pegado en una function separada.