Error en macro "No se encontró el método o el dato miembro"

Tengo la siguiente macro:

Sub Botón5_Haga_clic_en()
Dim h1 As Worksheet
Dim h2 As Worksheet
Dim a As Integer
Set h1 = Sheets("Facturacion")
Set h2 = Sheets("Pedidos Pendientes")
    a = h1.Range("F2").Value
    b = h1.txt_Cliente.Value
    If Not IsEmpty(h2.Range("A2")) Then
        x = h2.Range("A1").End(xlDown).Row + 1
            Else
        x = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
    End If
        With h2
            .Cells(x, 1).Value = a
            .Cells(x, 2).Value = b
        End With
End Sub

Al momento de declarar la variable "b", se despliega el mensaje de error, pero al remplazar el apartado b = h1.txt_Cliente.Value por b = Sheets("Facturacion").txt_Cliente.Value, mi intención es comprender el por que de esto.

1 respuesta

Respuesta
2

H o l a:

En este caso tienes que declarar el objeto h1 como object, la explicación, es que los objetos propios de la hoja como la celda, la columna, la fila, etc, pertenecen a la hoja, pero un control activeX como un textbox, no es un objeto propiamente de la hoja, es por eso que te aparece el mensaje de error: "No se encontró el método o el dato miembro", ya que ese textbox no es un método y tampoco es un miembro de la hoja.

Sub Botón5_Haga_clic_en()
    Dim h1 As Object
    Dim h2 As Object
    Dim a As Integer
    Set h1 = Sheets("Facturacion")
    Set h2 = Sheets("Pedidos Pendientes")
    a = h1.Range("F2")
    b = h1.txt_Cliente.Value
    If Not IsEmpty(h2.Range("A2")) Then
        x = h2.Range("A1").End(xlDown).Row + 1
    Else
        x = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
    End If
    With h2
        .Cells(x, 1).Value = a
        .Cells(x, 2).Value = b
    End With
End Sub

Comentarios sobre la declaración de variables.

1. En vba de excel no es necesario declarar variables, todas se declaran en automático como variant.

https://msdn.microsoft.com/en-us/library/office/gg251448.aspx 

2. Si se declaran las variables deberá realizarse de forma correcta, de lo contrario pueden ocurrir errores.

3. La declaración de las variables se utiliza cuando el programa es muy extenso y se requiere el control de las variables, de esa forma evitarías utilizar variables forma errónea. En este caso la macro es muy pequeña, no es necesario.

https://msdn.microsoft.com/es-mx/library/y9341s4f.aspx 

4. Y la razón más importante para el uso de variables, es para optimizar el uso de la memoria, ya que si no se declaran las variables, cada variable se declara en automático como variant y esto ocupa más cantidad de memoria.

http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=140:tipos-de-variables-en-visual-basic-integer-single-double-string-object-boolean-etc-ejemplos-cu00308a&catid=37:curso-aprender-a-programar-visual-basic-desde-cero&Itemid=61 


La macro te hubiera funcionado desde el principio si no declaras las variables:

Sub Botón5_Haga_clic_en()
    Set h1 = Sheets("Facturacion")
    Set h2 = Sheets("Pedidos Pendientes")
    a = h1.Range("F2")
    b = h1.txt_Cliente.Value
    If Not IsEmpty(h2.Range("A2")) Then
        x = h2.Range("A1").End(xlDown).Row + 1
    Else
        x = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
    End If
    With h2
        .Cells(x, 1).Value = a
        .Cells(x, 2).Value = b
    End With
End Sub

5. También se recomiendo declarar las variables cuando un proceso es muy largo y va a estar trabajando durante mucho tiempo, pero en este caso solamente estás asignando un dato a una variable.

De hecho, ni siquiera tienes que declarar las variables a y b, como ya estableciste que la hoja va a estar en el objeto h1 y h2, entonces puedes ocupar directamente la información sin necesidad de pasar por una variable:

Sub Botón5_Haga_clic_en()
    Set h1 = Sheets("Facturacion")
    Set h2 = Sheets("Pedidos Pendientes")
    If Not IsEmpty(h2.Range("A2")) Then
        x = h2.Range("A1").End(xlDown).Row + 1
    Else
        x = h2.Range("A" & Rows.Count).End(xlUp).Row + 1
    End If
    h2.Cells(x, 1) = h1.Range("F2")
    h2.Cells(x, 2) = h1.txt_Cliente
End Sub

Tan memorable como siempre tu trabajo, te agradezco te tomases el tiempo, respecto a lo que me comentas sobre las variables, lo tendré muy presente, trato de familiarizarme con el uso de las mismas, principalmente por el consumo de memoria, Hasta pronto, saludos y bendiciones.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas