Saltar al contenido

AMBITO DE UNA MACRO EN VARIOS LIBROS


Recommended Posts

publicado

Saludos a todos. Muy brevemente me presento como una persona ya jubilada que me entretiene y distrae programar macros en VBA para Excel.

El problema que trato de consultar en este post  es el siguiente:

En una macro dentro de un formulario intento acceder a una tabla en una hoja de su correspondiente libro , y no tengo problema alguno. El problema aparece cuando ejecuto la misma macro pero el libro activo -que no contiene ninguna hoja con la tabla que se intenta accesar- es otro diferente. Entonces obtengo el error siguiente : "Error en el metodo 'Select' del objeto 'Worsheet'. Creo que se produce porque el libro activoal ser otro, y no ppoder encontrar la Hoja que contiene la Tabla, la el error indicado.

Pongo el codigo que estoy utilizando.

Private Sub CBX_Activo_Change()
    Dim HojaDatos As Worksheet
    Dim Tabla As ListObject
    Set HojaDatos = Workbooks("Cartera de Valores.xlsm").Sheets("Listas")
    Set Tabla = HojaDatos.ListObjects("TablaActivos")
    HojaDatos.Select
    Tabla.DataBodyRange.Columns(1).Find(What:=Me.CBX_Activo.Value, LookAt:=xlWhole).Activate
    LBL_Nombre_Activo = ActiveCell.Offset(0, 1).Value
End Sub

Caso de precisar alguna informacion adicional, no duden en pedirmela.

Agradecido de antemano.

Saludos,

José Miguel.

publicado

Has de evitar, en la medida de lo posible, el uso de Select y Activate, inténtalo así:

Private Sub CBX_Activo_Change()
    Dim HojaDatos As Worksheet
    Dim Tabla As ListObject
    Dim NombreActivo As Range
    Set HojaDatos = Workbooks("Cartera de Valores.xlsm").Sheets("Listas")
    Set Tabla = HojaDatos.ListObjects("TablaActivos")
    Set NombreActivo = Tabla.DataBodyRange.Columns(1).Find(What:=Me.CBX_Activo.Value, LookAt:=xlWhole)
    LBL_Nombre_Activo = NombreActivo.Offset(0, 1).Value
End Sub

Se da por supuesto, que el valor a buscar existe, de lo contrario dará error.

publicado

Hola Antoni. Gracias por tu ayuda. He probado el codigo y se detiene en la siguiente sentencia:

Set HojaDatos = Workbooks("Cartera de Valores.xlsm").Sheets("Listas")

Por lo que interpreto que no es capaz de asignar el Worksheet correctamente.

Respondiendo a tu ultimo comentario, te confirmo que si existe el valor seleccionado en el ComboBox, ya que previamente han sido cargado este desde la Tabla, todos los registros de la Columna 1, y simplemente se trata de localizarlo el valor que seleccionamos en el Combo, moviendose mediante el Offset una columna, y asi recoger en la Tabla el nombre completo del activo seleccionado desde el Combo.

Saludos y buenas noches.

José Miguel

publicado

A ver si es esto, porqué no acabo de entender el problema, sin ver el archivo es difícil.

Private Sub CBX_Activo_Change()
    Dim HojaDatos As Worksheet
    Dim Tabla As ListObject
    Dim NombreActivo As Range
    Set HojaDatos = ThisWorkbook.Sheets("Listas")
    Set Tabla = HojaDatos.ListObjects("TablaActivos")
    Set NombreActivo = Tabla.DataBodyRange.Columns(1).Find(What:=Me.CBX_Activo.Value, LookAt:=xlWhole)
    LBL_Nombre_Activo = NombreActivo.Offset(0, 1).Value
End Sub

 

publicado

Hola Antoni. Saludos de nuevo.

Desafortunadamente, continua sin funcionar. ¿Existe la posibilidad de que pueda enviarte el archivo por privado ? Gracias.

José Miguel.

publicado

Saludos de nuevo Antoni. No te preocupes .. no pasa nada. Intentare explicarte con mas detalle el origen del problema.

La rutina en cuestión se encarga de localizar un Tabla que buscará un registro coincidente y ademas existente, dentro de una Hoja alojada dentro de un Libro que a su vez contiene el codigo dentro de un objeto formulario. (Todo en una solo Libro, en este caso Libro1).

El problema no aparece -en mi rutina, pero si en la que tu me pasas-, si solo esta abierto el Libro 1 que es donde se aloja la Tabla a gestionar.

Si por el contrario existen mas libros abiertos y en concreto corro la macro, por ejemplo con el Libro3 activo, entonces se produce el error tanto en mi codigo como en el tuyo. Eso indica que no encuentra la Tabla porque no es el Libro adecuado(Libro 1).

En consecuencia y salvo mejor opinion tuya, no deberia de utilizarse el Objeto ThisWorkBook, salvo que solo existiera un libro o al menos el libro activo.

Yo utilizo las setenecias ...

    Dim HojaDatos As Worksheet
    Set HojaDatos = Workbooks("Cartera de Valores.xlsm").Sheets("Listas")

... que deberian ser suficientes para identifica el Libro y Hoja donde se ubica la Tabla en Libro1, pero no asi en cualquier otro Libro que este activo en ese momento. De ahi el metodo Select..

En cambio, si el libro activo es diferente a Libro1 y corro la macro, aparece el error en todas las rutinas. Creo que es, al menos en alguna de ellas, porque al utilizar el objeto "ThisWorkbook", laTabla no existe al ser un Libro dferente a Libro 1 y por eso no la encuentra.

La solucion creo que pasa por definir inequivcamente el Libro, Hoja y Tabla donde la rutina debe actuar, de tal manera que teniendo activo otro libro diferente al Libro1, se ejecute la macro sin incidencia alguna.

Espero y deseo haber explicado la problematica existente con el mayor detalle posible.

Recibe un cordial saludo y gracias por tu paciencia,

Saludos,

José Miguel.

 

 

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.