Asignar valores a un campo Excel VBA

Tengo dos campos: (ver figura adjunta)

Sala: que contiene el número de veces que está ocupada esa sala (Son de la 1 a la 16 como máximo, aunque alguna puede quedar vacía y podría no aparecer). De esta manera, si la Sala 1 está ocupada por 5 veces, aparecen 5 "1". Si la Sala 2 está ocupada por 6 veces, aparecen 6 "2", etc

Turno: de momento está vacía. Y aquí es donde necesito ayuda.

Necesito que me enumere del 1 al 5 (en el caso de la Sala 1 porque está repetida 5 veces); del 1 al 6 (en el caso de la Sala 2, porque está repetida 6 veces) y las otras del 1 al que sea en función de cuantas veces se repitan.

El número mínimo de ocupación de Sala que voy a tener es de 5 y el máximo de 8.

Muchas gracias y un saludo

1 respuesta

Respuesta
1

.16.05.17

Buenos días,

Si te hubiese interpretado correctamente, la siguiente función hará lo que solicitas, así como lo haz planteado.

Ingresa en la celda E2, la siguiente fórmula

=CONTAR.SI(D$2:D2;D2)

[Considera si usas comas o punto y coma para separar argumentos de las funciones. Yo usé ";"]
Asígnale el formato deseado, luego copia esta celda y pégale en las restantes de esta misma columna.

Nota el uso del signo $ para dejar fija la primera fila del rango a contar y que ese rango finaliza en la misma fila donde está la fórmula.

Así, la siguiente en fila 3, será como esta:

=CONTAR.SI(D$2:D3;D3)

Y así sucesivamente.

Luego podrás copiar esa columna y pegarla como valor si desdea que los números queden fijos, como tales.

.

No es esto lo que busco.

Necesito un código en VBA.

Pero gracias por tomarte interés en responder mi pregunta

.

Ok, en tal caso puedes usar el siguiente código.

Accede al Editor de VBA (Atajo: Alt + F11), allí inserta un módulo (Insertar-Módulo) y pega el siguiente código:

Sub rellenar()
'---- Variables modificables ----
'=== LADYSERENITY, modifica estos datos de acuerdo a tu proyecto:
CelRef = "D2" 'celda donde inician las Salas
'---- fin Variables
'
' VBA coding by FeJoAl
'
'---- inicio de rutina:
'  
cont = 1
Do While Not IsEmpty(Range(CelRef).Offset(LaLinea))
    Sala = Range(CelRef).Offset(LaLinea).Value
    If Sala = Range(CelRef).Offset(LaLinea - 1).Value Then
        cont = cont + 1
        Range(CelRef).Offset(LaLinea, 1).Value = cont
    Else
        Range(CelRef).Offset(LaLinea, 1).Value = 1
        cont = 1
    End If
    LaLinea = LaLinea + 1
Loop
End Sub

Notarás al principio del código una variable que podrás modificar en caso de que necesitaras cambiar la celda donde comienzan las salas.

Espero que sea lo que esperabas.

Saludos

Fer

.

...

Pero, ¿probaste la rutina antes de calificar?

Saludos

Fer

.

Lo siento, te evalué la primera respuesta

Deja que pruebe ahora con el código y te modifico la valoración, ok?

.

Ok, me parecía, porque la rutina hace exactamente lo que solicitaste.

Si no, vuelve a consultarme con toda confianza.

Saludos

Fer

.

Ok. No se mucho de VBA, por no decir nada :-(

Ayúdame con la definición de variables.

No sé que es LaLinea.

Quiero que en función de lo que ponga en la columna D, me rellene la columna E. En que momento le estoy diciendo al código que me rellene el turno ¿?

Gracias

.

Hola, de nuevo

La variable LaLinea es de uso interno, para saber en que linea está operando. No tienes que modificar nada.

Sólo CelRef es la variable que te dejé para modificar. Ahora tiene el valor D2, que debería servirte como está para que inicie en ella el control y coloque a su derecha la numeración que solicitabas.

Pruébala como está y debería funcionar OK a menos que la primera sala estuviera en otra fila (en tu imagen no se vé la fila donde empieza el listado).

Me avisas cómo te fue con esto.

Saludos

Fer

.

Si cambio celref por D2. Porque es en la línea 2 donde empieza todo.. Me da error de compilación y me marca la palabra offset y luego sub rellenar

Perdona que te moleste de nuevo

¿En qué parte de ese código le digo que me rellene la columna E?

Gracias

Vale.. He conseguido que me funcione pero no del todo bien

La sala 1 me la enumera bien del 1 al que sea.

Pero a partir de aquí asigna el 1 al primero de cada sala y los siguientes continúan la numeración del ultimo valor asignado de la anterior sala

A ver.. Si la sala 1 acaba en 5. El primero de la sala 2 es 1 y el segundo es 6 (5+1), el tercero, 7, etc

Y así con todos

Uffff, me vas a matar

Todo ok.

Siento muchísimo las molestias

.

Buenos días

Si como verás en esta imagen, la celda donde está el primer número de sala es la D2, no debes cambiar nada en la rutina como te la envié:

El uso de la variable sólo para dar la posibilidad de cambiar la referencia a la macro por si hubieses colocado tu cuadro en otra parte de la hoja.

Sólo en ese caso deberías colocar la referencia a la celda recordando que va entre comillas dobles. Ej:

CelRef = "Z45" 'celda donde inician las Salas

Finalmente, sobre tu pregunta acerca de donde se indica que es la columna "E" donde dejar el turno, eso se logra con la función OFFSET. En realidad, no le indico qué letra de columna es, sino simplemente la columna que está al lado de la actual.

Range(CelRef). Offset(LaLinea, 1)

OFFSET toma como referencia la celda "D2", y se ubica la cantidad de líneas más abajo de ella que se indica en "LaLinea" -que vá incrementandose de auno en el ciclo- y tantas columnas a la derecha como se indica luego de la coma. En este caso ves un 1 porque es la columna siguiente.

Como ves en la imagen, la rutina funcionó correctamente.

Pega nuevamente la rutina como te la envié y ejecutala. Debería funcionar.

Pero si no lo hace, consúltame de nuevo. Tengo mucha paciencia y quiero que tengas resuelto el problema.

Saludos

Fer

.

¡Gracias!

Ya veo que tienes paciencia.. Muchísimas gracias Fer.. Me funciona correctamente. Muy atento con tus explicaciones.

Un saludo

.

Un placer ayudarte

Saludos

Fer

.

¡Gracias!

Una duda más, si me lo permites.

¿En qué parte del código se establece que al cambiar el numero de la sala reinicie el turno?

.

Hola

En el ciclo Do While hay una estructura condicional como esta:

'Evalua si la sala de la celda en cuestión es igual a la de la celda superior
    If Sala = Range(CelRef).Offset(LaLinea - 1).Value Then
'en caso afirmativo incrementa el contador en una unidad y
'luego lo deja en la celda a la derecha de ella
        cont = cont + 1
        Range(CelRef).Offset(LaLinea, 1).Value = cont
    Else
'en caso de que NO fuese la misma sala coloca un 1 en la celda de Turnos
'y luego vuelve el contador a 1
        Range(CelRef).Offset(LaLinea, 1).Value = 1
        cont = 1
    End If

Dentro verás las explicaciones de ese bloque If-end If

Saludos

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas