Visual Basic para Aplicaciones - Error 1004 en línea de objeto RANGE

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 8
Ha aumentado su posición en 6 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error 1004 en línea de objeto RANGE

Publicado por Bastian (3 intervenciones) el 04/06/2018 09:03:48
Hola Estimados, mis conocimientos de programación son bastante limitados y necesito ayuda con este código:

1
2
3
4
Workbooks("Libro1.xlsm").Activate
Worksheets("Hoja1").Select
Range("A1:A" & Rec).Select
Selection.Delete Shift:=xlUp

Necesito eliminar cierto rango de filas. La macro está contenida en un módulo "módulo1" y necesito que trabaje en la "Hoja1" del libro que se encuentra abierto.

El error 1004 aparece en la línea de código Range("A1:A" & Rec).Select

Gracias desde ya.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Norberto
Val: 115
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error 1004 en línea de objeto RANGE

Publicado por Norberto (34 intervenciones) el 04/06/2018 11:00:51
Hola.

Evidentemente la variable Rec está vacía o contiene 0 o un valor no numérico.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 6 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error 1004 en línea de objeto RANGE

Publicado por Bastian (3 intervenciones) el 04/06/2018 19:55:35
Gracias por responder, la verdad indique solo esa parte del código, creo que tendré que subir el archivo y el código completo para ser mas específico con mi pregunta. Aqui les va, y gracias por la pronta respuesta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Sub leerArchivoTexto()
Dim archivo As String  'ruta y nombre del archivo
Dim texto As String    'línea de texto a leer
Dim fila As Integer    'fila en la hoja de trabajo y número de línea en el texto
 
'Abrir el archivo
archivo = "C:\Users\Juan Carlos Terrazas\Desktop\LPA\lin_pm19_a1_3.txt"
 
Open archivo For Input As #1  'leer un archivo de texto por el canal #1
 
fila = 0
 
'Leer y procesar el contenido del archivo
While Not EOF(1) 'la función EOF regresa verdadero al llegar al final del archivo
    Line Input #1, texto  'lee cada una de las líneas del archivo y las almacena en la variable texto
 
    fila = fila + 1
    Cells(fila, 1).Value = texto
 
'Reconocer ultima fila de nodo conectores
 
Dim Rec As Integer 'Variable que almacena fila de ultimo nodo conector
 
If InStr(Cells(fila, 1), "C") <> 0 And InStr(Cells(fila, 1), "(") <> 0 Then
If InStr(Cells(fila - 1, 1), "C") <> 0 And InStr(Cells(fila - 1, 1), "(") <> 0 Then
If InStr(Cells(fila + 1, 1), "C") = 0 And Cells(fila + 1, 1) <> Empty Then
Rec = fila
End If
End If
End If
 
Wend
 
'Cerrar el archivo de entrada
Close #1
 
'Eliminar Rango desde A1 hasta fila ultimo nodo conector
 
Workbooks("Libro1.xlsm").Activate
Worksheets("Hoja1").Select
Range("A1:A" & Rec).Select
Selection.Delete Shift:=xlUp
 
 
'Reconocer ultima fila con datos
Dim ult As Integer
ult = Cells(Rows.Count, 1).End(xlUp).Row
 
'Separar Texto de columna A en distintas columnas
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(6, 1), Array(12, 1), Array(18, 1), Array(28, 1), _
Array(38, 1), Array(48, 1), Array(58, 1)), TrailingMinusNumbers:=True
 
'Recorre desde la ultima fila con informacion hasta abajo y elimina filas que no corresponden a arcos
For i = ult To 1 Step -1
If Cells(i, 1) = Empty Or IsNumeric(Cells(i, 1)) = False Or Cells(i, 1) = 1 Then
Rows(i).Select
Selection.Delete Shift:=xlUp
End If
Next
 
'Cambia los puntos por comas
Cells.Select
Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto
Val: 115
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error 1004 en línea de objeto RANGE

Publicado por Norberto (34 intervenciones) el 06/06/2018 11:02:59
Hola de nuevo.

Como te decía en mi primera respuesta la variable Rec contiene 0 y la expresión "A1:A" & Rec devuelve "A1:A0" lo que genera un rango imposible. Eso es debido a que la líena Rec = fila no se ejecuta nunca ya que nunca se cumplen todas las condiciones que especificas. He puesto un punto de interrupción en dicha línea y no se para hasta el error.

Captura

Si el motivo es que no hay nodo conector y no hay nada que borrar, cambia el código tal que así:
1
2
3
4
5
6
If Rec > 0 Then
    Workbooks("Libro1.xlsm").Activate
    Worksheets("Hoja1").Select
    Range("A1:A" & Rec).Select
    Selection.Delete Shift:=xlUp
End If

Si sí que hay nodo conector y no se detecta en las condiciones, revísalas.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error 1004 en línea de objeto RANGE

Publicado por Antoni Masana (498 intervenciones) el 05/06/2018 10:43:10
Te copio un fracmento

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim Rec As Integer 'Variable que almacena fila de ultimo nodo conector
 
If InStr(Cells(fila, 1), "C") <> 0 And InStr(Cells(fila, 1), "(") <> 0 Then
    If InStr(Cells(fila - 1, 1), "C") <> 0 And InStr(Cells(fila - 1, 1), "(") <> 0 Then
        If InStr(Cells(fila + 1, 1), "C") = 0 And Cells(fila + 1, 1) <> Empty Then
            Rec = fila
        End If
    End If
End If
 
Wend
 
'Cerrar el archivo de entrada
Close #1
 
'Eliminar Rango desde A1 hasta fila ultimo nodo conector
 
If Rec > 0 Then
    Workbooks("Libro1.xlsm").Activate
    Worksheets("Hoja1").Select
    Range("A1:A" & Rec).Select
    Selection.Delete Shift:=xlUp
End If

Si las condiciones de los IF no se cumplen ¿Que quieres borrar?
Marco las modificaciones para que no de el error.
De todas formas habría que verlo es su conjunto y que se desea hacer, porque me da que hay varias cosas que están mal entre ellas el Dim dentro del While, aunque visual se lo traga no estoy seguro de que hace lo que se espera que haga.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error 1004 en línea de objeto RANGE

Publicado por Antoni Masana (498 intervenciones) el 05/06/2018 13:13:26
Olvida mi post anterior, no es lo correcto.

El problema está en el WHILE, escribes una línea y

- revisas la línea actual BIEN
- revisas la línea anterior si cumple la actual , BIEN , la primera no cumple y no da error
- revisas la linea siguiente si cumplen las anteriores y...

¿Que hay en la siguiente línea si aún no la has escrito?

La mejor solución es primero leer todo el archivo y despues buscar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
' ---&--- Leer y procesar el contenido del archivo
 
While Not EOF(1) 'la función EOF regresa verdadero al llegar al final del archivo
    Line Input #1, texto  'lee cada una de las líneas del archivo y las almacena en la variable texto
    fila = fila + 1
    Cells(fila, 1).Value = texto
Wend
 
For a = 2 To fila
    If InStr(Cells(a - 1, 1), "C") <> 0 And InStr(Cells(a - 1, 1), "(") <> 0     AND _
       InStr(Cells(a + 0, 1), "C") <> 0 And InStr(Cells(a + 0, 1), "(") <> 0     AND _
       InStr(Cells(a + 1, 1), "C") =  0 And       Cells(a + 1, 1)       <> Empty Then
        Rec = a
    End If
Next
 
' ---&---  Cerrar el archivo de entrada
 
Close #1

Y problema resuelto

Adjunto ejemplo.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 6 puestos en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Error 1004 en línea de objeto RANGE

Publicado por Bastian (3 intervenciones) el 08/06/2018 23:20:52
Muchas gracias! efectivamente este era el problema! sus respuestas me permitieron correr el archivo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar