Realmente nuevo en VBA aquí… he mirado alrededor y trató de juntar algo de código para satisfacer mi necesidad. Creo que es casi allí, pero me estoy poniendo de los errores que probablemente son fáciles de superar y, sin embargo, no sé cómo.

El código se ve en la hoja de trabajo actual (STOCK), y se lleva a un ‘target’ de texto el valor de la celda A2. Se busca en un rango con nombre en otra hoja de trabajo ‘Otros’. Si se determina que una de las celdas (‘by’) en Otro ser igual al valor de destino, a continuación, un valor de «True» se aplica a la columna G en la bolsa de valores de la hoja, en la misma fila de la meta original.

Esperemos que esto tiene sentido. He copiado el código que tal vez arrojar más luz sobre las cosas.

Dim destino Como Cadena 
Dim cand Como Cadena 
Dim currentrow Como Entero 

Sub search_named_range() 

'Esta gama está codificado; podemos intentar Una:si la versión del código que funciona" 
Para Cada objetivo En Hojas de cálculo("STOCK").Range("A2:A1000") 

'recuperar la fila de la actual gama, para su uso cuando la configuración de los valores de destino' 
currentrow = Rango(destino).Fila 

'Bucle for PARA la búsqueda de rango de números de parte en Mojave' 
Para Cada uno de los cand En Hojas de cálculo("Otros").Range("N9:N150") 
Si StrConv(cand.Valor, 2) = StrConv(objetivo, 2), a Continuación, 
Hojas de cálculo("STOCK").Range("G" + currentrow) = "True" 
GoTo Guardamanos 
End If 
El próximo cand 

"Si la parte no se encuentra, no hacer nada y volver a encontrar el próximo destino" 
Guardamanos: Próximo objetivo 

End Sub 

Actualmente estoy recibiendo el error ‘Para Cada variable de control debe ser Variante o del Objeto’, pero no puede encontrar en cualquier parte que explica por qué esto es. Estoy seguro de que es bastante obvio, pero de un novillo sería muy apreciada.

Gracias.

OriginalEl autor user2311821 | 2013-04-23

1 Comentario

  1. 11

    Usted no puede utilizar una variable de Cadena en una Para Cada uno. Estás usando tartget y cand como el control de variables Para Cada uno de los bucles, pero que ha definido como cadenas. Se necesita ser un objeto, y, específicamente, un objeto que contiene la colección de objetos que se está iterando. Usted está iterando sobre un intervalo, que es una colección de los rangos, por lo que su control de las variables deben ser de la Gama de objetos.

    Sub search_named_range()
    
        Dim rCell As Range
        Dim rCand As Range
    
        For Each rCell In Worksheets("STOCK").Range("A2:A1000").Cells
            For Each rCand In Worksheets("Other").Range("N9:N150").Cells
                If StrComp(rCand.Value, rCell.Value, vbTextCompare) = 0 Then
                    rCell.Offset(0, 6).Value = "True"
                    Exit For 'exits the rCand For, but no the rCell one
                End If
            Next rCand
        Next rCell
    
    End Sub

    Otros cambios que no estaban corrección de errores:

    No estoy seguro de por qué usted declara las variables fuera de la sub, pero me puso dentro de ellos.

    No es necesario definir .Cells al final de Cada línea, pero me gusta. Usted puede iterar sobre .Rows o .Columns o .Areas con un Rango (aunque .Cells es el valor predeterminado).

    No hay nada de malo con StrConvert, pero también se puede usar LCase() o, como yo, StrComp.

    Pues ya tengo una referencia a una celda en la fila actual (rCell), yo uso ese y Offset para rellenar una columna que desee.

    Esto es absolutamente perfecto, muchas gracias por tu ayuda! Ahora puedo ver que varias de las cosas que estaba tratando eran un poco rotonda (por ejemplo, obtener el número de la fila), y no me di cuenta de que no podía utilizar Cadenas Para Cada uno – realmente aprecio su explicación y sugerencias de métodos alternativos, el código ahora funciona tal y como lo había previsto originalmente. Saludos!

    OriginalEl autor Dick Kusleika

Dejar respuesta

Please enter your comment!
Please enter your name here