Asignar variables a muchas celdas de una columna

Espero poder explicarme, necesito que de una lista de 500 celdas de la columna "M", (M1 a M500) en una macro yo pueda realizar el siguiente proceso

Dim crit1 As String
    crit1 = range("M1").Value
    If range("M1").Value = 0 Then
        ActiveCell.Offset(1, 0).Select
    Else
        ActiveCell.Offset(2, 0).Select
    End If

pero sin necesidad de escribir 500 veces el código.

1 Respuesta

Respuesta

1 - cuando selecciones la celda que harás en ella

2 - cual seria la idea

3 - porque saltar dos fila

Puede ponernos unA FOTO y así ver más o menos que que requieres

Y si todo se puedes

Dim crit1 As String
    crit1 = range("K1").Value
    If range("K1").Value = 0 Then
        ActiveCell.Offset(1, 0).Select
    Else
        range("A3:A5000").Select
        Selection.Find(What:=[crit1], After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
        Selection.FindNext(After:=ActiveCell).Activate
            ActiveCell.Offset(0, 2).Select
            range(ActiveCell.Offset(0, 0), ActiveCell.Offset(0, 1)).Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Selection.End(xlToLeft).Select
            ActiveCell.Offset(0, 1).Select
            ActiveCell.FormulaR1C1 = "0"
            ActiveCell.Offset(-1, 1).Select
            Selection.Copy
            ActiveCell.Offset(1, 0).Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
    End If

Básicamente si la celda asignada a la variable tiene cero, continua con el análisis de la segunda celda de lo contrario se desplaza a la columna "A" avanza hacia la izquierda e inserta una celda para poner un "cero" pero lo que me interesa es únicamente simplificar el no tener que declara 500 variables.

Detallando esto es lo que deseo hacer, tengo en la columna "M1" a la "M500" una lista de valores de los cuales los primeros valores son claves o códigos y después celdas con "0" y lo que hace este código anexado es valorar si la celda "M1" contiene un valor mayor a cero, si no es así, simplemente baja una celda y vuelve a realizar el análisis, si por el contrario es un valor mayor a "0" entonces se traslada a la columna "A" y la recorre de "A1" a "A500" esperando encontrar el valor que fue mayor a "0" guardado en la variable "Crit1", una ves encontrado, realiza lo indicado en "else", (recorrerse dos lineas a la izquierda, insertando una linea y copiando valores), lo que deseo es que este proceso no lo tenga que indicar 500 veces, simplemente declarar las 500 variables "Crit." de una forma práctica y de acuerdo al rango "K" y aparte realizar las validaciones de "If" otras 500 veces también de acuerdo al rango "K".

Dim crit1 As String
 crit1 = range("M1").Value
    If range("M1").Value = 0 Then
        ActiveCell.Offset(1, 0).Select
    Else
        range("A3:A5000").Select
        Selection.Find(What:=[crit1], After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
        Selection.FindNext(After:=ActiveCell).Activate
            ActiveCell.Offset(0, 2).Select
            range(ActiveCell.Offset(0, 0), ActiveCell.Offset(0, 1)).Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Selection.End(xlToLeft).Select
            ActiveCell.Offset(0, 1).Select
            ActiveCell.FormulaR1C1 = "0"
            ActiveCell.Offset(-1, 1).Select
            Selection.Copy
            ActiveCell.Offset(1, 0).Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
End If
Dim crit2 As String
 crit2 = range("M2").Value
    If range("M2").Value = 0 Then
        ActiveCell.Offset(1, 0).Select
    Else
        range("A3:A5000").Select
        Selection.Find(What:=[crit2], After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
        Selection.FindNext(After:=ActiveCell).Activate
            ActiveCell.Offset(0, 2).Select
            range(ActiveCell.Offset(0, 0), ActiveCell.Offset(0, 1)).Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Selection.End(xlToLeft).Select
            ActiveCell.Offset(0, 1).Select
            ActiveCell.FormulaR1C1 = "0"
            ActiveCell.Offset(-1, 1).Select
            Selection.Copy
            ActiveCell.Offset(1, 0).Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
End If

Ok

A ver si entendí y por lo que veo

1 - buscar el valor de la POR del rango M1:M500 en el range A

2 - si lo encuentra insertar una celda C y D

3 - en esa celda nueva copiar el valor buscado

4 - este valor a buscar puede aparecer varias veces osea si lo encuentra en una celda tiene que seguir con la búsqueda y si lo encuentra de Nuevo hacer la operación

Hay lgo que no entiendo en tu expl;icacion como vas inserta a la izquierda si esta en la columna A

Sorry quise decir a la derecha pero ese básicamente es el problema, no realizar este proceso de escritura 5400 veces

Estas dos soluciones a ver cual te gusta más

1 - primera solución

uso de for next

For i = 1 To 500
If Cells(i, "M") > 0 Then
If Cells(i, "M") = "" Then Exit Sub
    Set h = Sheets("Diaria")
    Set b = h.Columns("b").Find(Cells(i, "M"))
     b.Offset(0, 2) = b
End If
Next

esto intruciones dice que la I sera la variable crit que usaremos

For i = 2 To 500 declaramos las variables del la fila 1 hasta la 500 y la llamamos "I"

If Cells(i, "M") > 0 Then si la fila X es mayor a "0" entonces has estos que esta debajo

Set h = Sheets("Diaria") la hoja la llamaremos 'H' y diario es el nombre de tu hoja
Set b = h.Columns("A").Find(Cells(i, "M")) aqui creamos la busqueda en toda la columna A  y la llamamos B

aqui pones lo que quiere que haga si encuentra el valor a buscar

en mi ejemplo b.Offset(0, 2) = b le dije que dos columna a la derecha copie el valor buscado

End If cerramos el si

next para que repita el proceso hasta la fila 500

2 - segunda opcion

Do While

Range("m1").Select
Do While ActiveCell <> ""
If ActiveCell > "0" Then
    Set h = Sheets("Diaria")
    Set b = h.Columns("b").Find(ActiveCell)
    b.Offset(0, 2) = b
End If
ActiveCell.Offset(1, 0).Select
Loop

esta intriciones nos dice .......

Range("m1").Select selecionamos donde vamos a empesar
Do While ActiveCell <> ""   si la celda activa no esta vacia has lo siguiente
If ActiveCell > "0" Then si celda activa es mayor que 0 entonces has lo siguiente
    Set h = Sheets("Diaria") la hoja la llamaremos 'H' y diario es el nombre de tu hoja 
    Set b = h.Columns("b").Find(ActiveCell)  aqui creamos la busqueda en toda la columna A  y la llamamos B 

aqui pones lo que quiere que haga si encuentra el valor a buscar 

en mi ejemplo b.Offset(0, 2) = b le dije que dos columna a la derecha copie el valor buscado

End If cerramos el si

ActiveCell.Offset(1, 0).Select aqui le digo cambia la celda activa a la siguiente

loop para que vuelva al primer paso al if

Si te silve no olvides valora para cerrar la pregunta 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas