Cant pegar – Excel VBA

nuevo para VBA tratando de resolverlo. Trabajar en un código que intenta automatizar la copy desde varios files a files con fórmulas, calcular y luego volver de nuevo. Me he encontrado con un post 'Error en time de ejecución' 1004 ', el método pastespecial de class de range falló' cuando intenté pegar. El post aparece SÓLO cuando estoy usando variables para declarar la primera celda, para copyr un range de valores. Cuando estoy usando una descripción de celda directa todo funciona bien. También estoy usando una function personalizada para get la letra de la columna, de un nombre de campo dado.

Function ActiveColumnName(fieldname As String, fieldnames_line As Integer) As String Range("A" & fieldnames_line & ":AB" & fieldnames_line).NumberFormat = "@" Cells.find(What:=fieldname, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False).Activate ActiveColumnNumber = ActiveCell.Column Dim m As Integer Dim ActiveColumnName As String ActiveColumnName = "" Do While (ActiveColumnNumber > 0) m = (ActiveColumnNumber - 1) Mod 26 ActiveColumnName = Chr(65 + m) + ActiveColumnName ActiveColumnNumber = Int((ActiveColumnNumber - m) / 26) Loop End Function sub main () Dim firstrow_data_main As Integer Dim firstrow_fieldnames_main As Integer firstrow_data_main = 16 firstrow_fieldnames_main = 15 Range(ActiveColumnName("<FIELDNAME>", firstrow_fieldnames_main) & firstrow_data_main, Range(ActiveColumnName("ÄÅÔÅ", firstrow_fieldnames_main) & Rows.Count).End(xlUp).Offset(-1)).Select Application.CutCopyMode = False Selection.Copy Workbooks.Open help_file '"help_file" is any given .xls path with formulas Dim firstrow_data_help As Integer Dim firstrow_fieldnames_help As Integer firstrow_data_help = 7 firstrow_fieldnames_help = 4 'NOW WHEN I USE THIS, DOESNT WORK: -> Range(ActiveColumnName("<FIELDNAME>", firstrow_fieldnames_help) & firstrow_data_help).Select 'WHEN I USE THIS, WORKS FINE: -> Range("L7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False End Sub 

Cuando no funciona, abre los .xls y la celda deseable que está seleccionada, pero no el paté. Entiendo que tiene algo que ver con el portapapeles, pero no puedo entenderlo. ¿Alguna sugerencia?

  1. Elimine todo el Seleccionar y Activar al referirse a las celdas directamente, Vea AQUÍ para más información.
  2. Busca en Cells () en lugar de Range y evita toda la necesidad de convertir numbers de columna en letras, ya que Cells () usa numbers.
  3. Evite el Portapapeles cuando los valores son lo único que desea y simplemente asigne el valor a las nuevas celdas (Esto requerirá que ambos ranges sean del mismo tamaño, así que use Resize ())
  4. Siempre denote la hoja padre del range, networkingucirá los errores.

Código refactorizado

 Sub main() Dim firstrow_data_main As Integer Dim firstrow_fieldnames_main As Integer Dim rng As Range Dim tWb As Workbook Dim ws As Worksheet Dim tWs As Worksheet Dim firstrow_data_help As Integer Dim firstrow_fieldnames_help As Integer Set ws = ThisWorkbook.ActiveSheet Set tWb = Workbooks.Open(help_file) Set tWs = tWb.ActiveSheet firstrow_data_main = 16 firstrow_fieldnames_main = 15 firstrow_data_help = 7 firstrow_fieldnames_help = 4 With ws Set rng = .Range(.Cells(firstrow_data_main, firstrow_fieldnames_main), .Cells(.Rows.Count, firstrow_fieldnames_main).End(xlUp).Offset(-1)) tWs.Cells(firstrow_data_help, firstrow_fieldnames_help).Resize(rng.Rows.Count, rng.Columns.Count).Value = rng.Value End With End Sub 

Creo que el problema puede estar aquí:

 ActiveColumnName("<FIELDNAME>", firstrow_fieldnames_main) 

Esto implica que ActiveColumnName es una matriz con nx (1 to 2) dimensión. Si desea concatenar un nombre a una variable, debe usar (ejemplo):

 "YourStringHere" & YourVariableHere & "AnotherString" 

Que en tu caso sería:

 ActiveColumnName("<FIELDNAME>" & firstrow_fieldnames_main) 

Entonces, si entendí correctamente ( <FIELDNAME> es un poco oscuro), el command completo debería ser:

 Range(ActiveColumnName("<FIELDNAME>" & firstrow_fieldnames_help) & "," & firstrow_data_help).Select 

En primer lugar, debe comstackr su VBA antes de ejecutar. El comstackdor de VBA captó esto de la nada:
Dim ActiveColumnName As String
es innecesario porque asignó ActiveColumnName como cadena cuando definió la function en la línea 1.

Utiliza muchas references a celdas activas y selecciona celdas. Se sabe que esto causa errores de time de ejecución. Vea esta publicación: "Cómo evitar usar Select en Excel Vba Macros" .

Sospecho que el nombre de campo no está donde crees que debería estar en tu file de ayuda, es decir, no está en la fila 4. Esto significaría que el código no sabría dónde pegar los datos. En general, la mejor manera de depurar es dividir el código en la acción más pequeña posible para ver qué está causando el error (vea Estrategias de Guru en SpreadSheet ). ¿Puedes ejecutar el siguiente código para ver cuál es el resultado?

 Function ActiveColumnName(fieldname As String, fieldnames_line As Integer) As String Range("A" & fieldnames_line & ":AB" & fieldnames_line).NumberFormat = "@" Cells.Find(What:=fieldname, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False).Activate ActiveColumnNumber = ActiveCell.Column Dim m As Integer ActiveColumnName = "" Do While (ActiveColumnNumber > 0) m = (ActiveColumnNumber - 1) Mod 26 ActiveColumnName = Chr(65 + m) + ActiveColumnName ActiveColumnNumber = Int((ActiveColumnNumber - m) / 26) Loop End Function Sub main() Workbooks.Open "help_file" '"help_file" is any given .xls path with formulas Dim firstrow_data_help As Integer Dim firstrow_fieldnames_help As Integer firstrow_data_help = 7 firstrow_fieldnames_help = 4 MessageBox = ActiveColumnName("FIELDNAME", firstrow_fieldnames_help) & firstrow_data_help End Sub 

¡Gracias a todos por su respuesta! He intentado todas sus sugerencias una por una, pero encontré varios problemas en el path. Sin embargo, todas sus sugerencias me ayudaron a tener una perspectiva diferente sobre el tema. La solución que he encontrado, deriva de su sugerencia de descartar ".select" como una reference y usar variables "rng" y, por supuesto, deshacerse de la reference doble "ActiveColumnName". Sé que tengo una ¡Mucho path por recorrer pero por el momento esto funciona! ¡Gracias!

Sub principal()

 Dim firstrow_data_main As Integer Dim firstrow_fieldnames_main As Integer Dim firstrow_data_help As Integer Dim firstrow_fieldnames_help As Integer firstrow_data_main = 16 firstrow_fieldnames_main = 15 firstrow_data_help = 7 firstrow_fieldnames_help = 4 Dim rng1 As Range Dim rng2 As Range Set rng1 = Range(ActiveColumnName("<FIELDNAME>", firstrow_fieldnames_main) & firstrow_data_main, Range(ActiveColumnName("<FIELDNAME>", firstrow_fieldnames_main) & Rows.Count).End(xlUp).Offset(-1)) cells_selected = rng1.Rows.Count Workbooks.Open <help_file> Set rng2 = Range(ActiveColumnName("<FIELDNAME>", firstrow_fieldnames_help) & firstrow_data_help, Range(ActiveColumnName("<FIELDNAME>", firstrow_fieldnames_help) & cells_selected + firstrow_data_help - 1)) rng1.Copy rng2 

End Sub