vb.net - variable - refrescar hoja excel vba
Seleccionar el método de clase de rango fallido a través de VBA (3)
Este es el código con el que estoy trabajando actualmente, y estoy obteniendo este problema. Soy un novato en Excel y no puedo entender qué sucede.
Private Sub cmdRecord_Click()
Sheets("BxWsn Simulation").Range("Result").Select //This is the line with the problem, as excel told me.
Selection.Copy
Sheets("Reslt Record").Select
Sheets("Reslt Record").Range("A5000").End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Sheets("CuCon Simulator").Select
Application.CutCopyMode = False
Range("Improvement").Select
End Sub
El error es Seleccionar el método de la clase de rango falló a través de VBA, Error 1004. ¿Alguna idea?
Gracias.
Editar:
Así que acabo de cambiar el código a
Sheets("BxWsn Simulation").Select
Range("Result").Select
Creo que esto es a lo que te refieres al hacerlo activo? Sin embargo, sigo obteniendo el error del Método ''Rango'' del objeto ''_Worksheet'', error 1004
La respuesta correcta a estas preguntas en particular es "no seleccionar". A veces tienes que seleccionar o activar, pero el 99% de las veces no. Si tu código se ve como
Select something
Do something to the selection
Select something else
Do something to the selection
Probablemente necesites refactorizar y considerar no seleccionar.
El error, el "Rango" de método del objeto "_Worksheet" falló, el error 1004, que está obteniendo es porque la hoja con el botón no tiene un rango llamado "Resultado". La mayoría de las propiedades (tal vez todas) que devuelven un objeto tienen un objeto principal predeterminado. En este caso, está usando la propiedad Range para devolver un objeto Range. Como no califica la propiedad Range, Excel usa el valor predeterminado.
El objeto principal predeterminado puede ser diferente en función de las circunstancias. Si su código estaba en un módulo estándar, entonces el ActiveSheet sería el predeterminado Parent y Excel trataría de resolver ActiveSheet.Range ("Result"). Su código está en el módulo de clase de una hoja (la hoja con el botón). Cuando la referencia no calificada se usa allí, el padre por defecto es la hoja que se adjunta a ese módulo. En este caso, son iguales porque la hoja debe estar activa para hacer clic en el botón, pero ese no es siempre el caso.
Cuando Excel da el error que incluye texto como ''_Object'' (el tuyo dice ''_Worksheet'') siempre se está refiriendo al objeto Parent por defecto, el guión bajo lo delata. En general, la forma de corregir eso es calificar la referencia al ser explícito sobre el padre. Pero en el caso de seleccionar y activar cuando no es necesario, es mejor refactorizar el código.
Esta es una forma de escribir su código sin seleccionarlo ni activarlo.
Private Sub cmdRecord_Click()
Dim shSource As Worksheet
Dim shDest As Worksheet
Dim rNext As Range
''Me refers to the sheet whose class module you''re in
''Me.Parent refers to the workbook
Set shSource = Me.Parent.Worksheets("BxWsn Simulation")
Set shDest = Me.Parent.Worksheets("Reslt Record")
Set rNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0)
shSource.Range("Result").Copy
rNext.PasteSpecial xlPasteFormulasAndNumberFormats
Application.CutCopyMode = False
End Sub
Cuando estoy en un módulo de clase, como el módulo de clase de la hoja en el que estás trabajando, siempre trato de hacer las cosas en términos de esa clase. Entonces uso Me.Parent en lugar de ActiveWorkbook. Hace que el código sea más portátil y evita problemas inesperados cuando las cosas cambian.
Estoy seguro de que el código que tienes ahora se ejecuta en milisegundos, por lo que es posible que no te importe, pero evitar seleccionar definitivamente acelerará tu código y no tienes que configurar ScreenUpdating. Eso puede volverse importante a medida que su código crezca o en una situación diferente.
Esto funcionó para mí.
RowCounter = Sheets(3).UsedRange.Rows.Count + 1
Sheets(1).Rows(rowNum).EntireRow.Copy
Sheets(3).Activate
Sheets(3).Cells(RowCounter, 1).Select
Sheets(3).Paste
Sheets(1).Activate
Creo que tienes el mismo problema aquí.
La hoja debe estar activa antes de que pueda seleccionar un rango en ella.
Además, no omita el calificador del nombre de la hoja:
Sheets("BxWsn Simulation").Select
Sheets("BxWsn Simulation").Range("Result").Select
O,
With Sheets("BxWsn Simulation")
.Select
.Range("Result").Select
End WIth
que es lo mismo