viernes, 22 de diciembre de 2017

martes, 5 de diciembre de 2017

Ciudades elegidas

Puede descargar el archivo ciudadesElegidas.xlsm

Hoja1

Disponemos de una lista de ciudades, son en total 735 ciudades, y deseamos elegir aleatoriamente unas cuantas de ellas. La elección se realizará por dos métodos, ambos con la posibilidad de que salgan ciudades repetidas. Si obtenemos ciudades repetidas las detectaremos con Formato condicional.

Los métodos empleados son los siguientes.
  • Método 1: con la función INDICE
  • Método 2: con la función DESREF



Hoja2

Disponemos de una lista de ciudades en la columna A y de ellas deseamos elegir aleatoriamente y sin repetición un cierto número de ellas. Vamos a resolver este caso con la ayuda de una macro de Excel.


 Sub EligeNombresAleatorios()  
 Borra  
 Dim numElegidas As Integer  
 Dim numNombres As Long  
 Dim numAlea As Integer  
 Dim Nombres() As String  
 Dim i As Byte, j As Byte  
 Dim Fila As Long  
 Dim Repe As Boolean 'para ver si está repetida la ciudad seleccionada  
 numElegidas = Range("C3").Value  
 Fila = 6  
 ReDim Nombres(1 To numElegidas)  
 numNombres = Application.CountA(Range("A:A")) - 1  
 For i = 1 To numElegidas  
   Do  
     Repe = False 'inicialmente supondremos que no está repetida la ciudad  
     numAlea = Application.RandBetween(1, numNombres)  
     'veamos si la ciudad seleccionada ya ha sido elegida  
     For j = LBound(Nombres) To UBound(Nombres)  
       If Nombres(j) = Cells(numAlea + 1, 1).Value Then Repe = True: Exit For  
     Next j  
   Loop While Repe  
   Nombres(i) = Cells(numAlea + 1, 1).Value ' Assign random name to the array  
 Next i  
 'Escribe las ciudades elegidas  
 For j = LBound(Nombres) To UBound(Nombres)  
   Cells(Fila, 3) = Nombres(j)  
   Fila = Fila + 1  
 Next j  
 End Sub  
   
 Sub Borra()  
 Range("C6").Select  
 Range(Selection, Selection.End(xlDown)).ClearContents  
 Range("C3").Select  
 End Sub  


Y en la Hoja2 tenemos el siguiente código.

 Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Address = "$C$3" Then  
     Call EligeNombresAleatorios  
   End If  
 End Sub