Reforzar Macro Teléfonos
Buen dia,
Tengo una Macro que me ayudaron a realizarla en esta página, necesito un par de cosas para mejorarlo.
Primero lo que hago es convertir todas las columnas en formato GENERAL, para eso le cambio el formato y le doy columna por columna la opción TEXTO EN COLUMNA, si pueden ayudarme a agregar esa pequeña macro antes de iniciar mi macro actual seria de mucha ayuda.
Ademas después de finalizar la actual macro necesito que elimine los teléfonos que comienzan con el numero 9 y tengan mas de 9 dígito o menos de 9 dígitos.
EJM. 95654874545 9865845 985478548756
También los teléfonos que no comiencen con 9 y tengan mas o de 8 dígitos o menos de 8 dígitos.
EJM 458122 456568968 1235568879 658785
Es decir los teléfonos que comienzan con 9 tienen que tener 9 dígitos, los demás teléfonos deben tener 8 dígitos.
DEJO LA MACRO QUE UTILIZO, si se necesita el archivo con teléfonos lo puedo enviar.
Public FiRefor As Integer
Sub Formateo_Telefonos_Lima()
Dim INTENTAR As Long, i, j, UCol, Total As Integer
Dim Contador1, Contador2, contador3 As Long
Dim Temporal As String
Dim columna1 As String, columna2 As String
'Estos son los datos que metemos en macro. Ojo, tienen que estar ordenados para que la busqueda funcione,
'sino falla. Si se añade alguno debes ponerlo donde corresponde y el departamento también.
'Añadire CERRO DE PASCO que no estaba con la misma clave que tiene PASCO
Dim Departamento(), Clave(), DepInexistente()
Dim Primero, Ultimo, Inicio, Fin, Medio, AuxiCla, DepInexistentes As Integer
Dim DepBus, AuxiDep As String
Dim Encontrado, YaOrdenado, InformeOrden, EncontradoInexistente, HayRepesFila As Boolean
Departamento = Array("AMAZONAS", "ANCASH", "APURIMAC", "AREQUIPA", "AYACUCHO", _
"CAJAMARCA", "CERRO DE PASCO", "CUSCO", "CUZCO", "HUANCAVELICA", _
"HUANUCO", "ICA", "JUNIN", "JUNÍN", "LA LIBERTAD", _
"LAMBAYEQUE", "LORETO", "MADRE DE DIOS", "MOQUEGUA", "PASCO", _
"PIURA", "PUNO", "SAN MARTIN", "TACNA", "TRUJILLO", _
"TUMBES", "UCAYALI")
', "probatina", "añadido", "Otro más") 'Algunos más para probar algoritmo ordenación
Clave = Array(41, 43, 83, 54, 66, _
76, 63, 84, 84, 67, _
62, 56, 64, 64, 44, _
74, 65, 82, 53, 63, _
73, 51, 42, 52, 44, _
72, 61)
', 20, 20, 20) 'Algunos más para probar algoritmo ordenación
Primero = LBound(Departamento)
Ultimo = UBound(Departamento)
DepInexistentes = 0
FiRefor = 0
ThisWorkbook.Worksheets("reformateos").Cells.Clear
'Bueno, decía que los departamentos debían estar ordenados para que funcionara la búsqueda binaria por división del intervalo.
'Mejor si los ordenamos por si acaso. Es preferible la ordenación hacia atrás porque si se añade el departamento nuevo
'al final con una sola operación en el indice i del método de la burbuja irá a su sitio.
'Además, me he dado cuenta depués que es obligatorio ordenar. Ya que estos estimados anglosajones no ponen en su sitio
'las eñes ni los acentos en la comparación de cadenas en VisualBasic y la lista debe tener el orden a su antojo.
InformeOrden = False
For i = Primero + 1 To Ultimo
YaOrdenado = True
For j = Ultimo To i Step -1
If UCase(Departamento(j)) < UCase(Departamento(j - 1)) Then
YaOrdenado = False
AuxiDep = Departamento(j): Departamento(j) = Departamento(j - 1): Departamento(j - 1) = AuxiDep
AuxiCla = Clave(j): Clave(j) = Clave(j - 1): Clave(j - 1) = AuxiCla
End If
Next
If YaOrdenado Then Exit For Else InformeOrden = True
Next
'Lo siguiente aparecesi hubo que cambiar el orden, lo mejor para no perder tiempo sería poner a mano en orden los departamentos y claves
If InformeOrden Then
AuxiDep = ""
For i = Primero To Ultimo
AuxiDep = AuxiDep & Left(Departamento(i) + "____________________", 20) & " " & Str(Clave(i)) & vbCrLf
Next
Respuesta = MsgBox(AuxiDep & vbCrLf & vbCrLf & "MEJOR QUE LOS ORDENE ASI EN LA MACRO", vbInformation + vbokonli, "Departamentos desordenados para ANSI")
End If
INTENTAR = 2 '1era fila a verificar
Contador1 = 0 'contando los # incorrectos
Contador2 = 0
'columna1 = InputBox$("Ingrese la columna de teléfonos fijos a formatear : ")
'columna2 = InputBox$("Ingrese la columna de Departamento a considerar : ")
columna2 = "B"
While Range("A" & INTENTAR).Value <> ""
UCol = Cells(INTENTAR, Columns.Count).End(xlToLeft).Column
For j = 3 To UCol
columna1 = Chr(64 + j)
'Esto que tienes no estaba bien porque para todo teléfono verificacbas todas las condiciones
'y no es necesario porque si lo borras no necesita comprobacaiones posteriores, y si es recortado
'a una longitud donde quedará estable no se necesitan más comprobaciones tampoco
'Y ya que se calcula el temporal será bueno usarlo cuanto se pueda.
'Conviene empezar con una condición que cumplan la mayoría de teléfonos y les haga inmunes. Yo
'veo por ejemplo que hay muchos con 9 cifras y a esos no se les hace casi nada, luego
'esa será la primera condición. Luego veo que hay muchos con tinen 8 cifras y empiezan por 1, esa
'será la segunda condición. Asi habrá muchos teléfonos que se ahooren muchas comprobaciones, aunque
'estos aun deberan pasar la prueba de tener 4 cifras iguales seguidas o tener 123456 o comenzar por 18
Temporal = Range(columna1 & INTENTAR)
If Temporal <> "" Then
If Len(Temporal) = 9 And Left(Temporal, 1) = "9" Then
If Left(Temporal, 1) = "1" Or Left(Temporal, 1) = "4" Then
'Si 9 cifras y empieza por 1 o 4 se borra
Call Reformateo(Temporal, 1)
Temporal = ""
Call Reformateo(Temporal, 2)
Range(columna1 & INTENTAR) = Temporal
Contador1 = Contador1 + 1
End If
ElseIf Len(Temporal) = 8 Then
If Left(Temporal, 1) = "9" Then
'Si es de 8 dígitos y 1er dígito es 9 se adiciona un 9
Contador1 = Contador1 + 1
Call Reformateo(Temporal, 1)
Temporal = "9" & Temporal
Call Reformateo(Temporal, 2)
Range(columna1 & INTENTAR) = Temporal
End If
ElseIf Len(Temporal) = 7 Then
If Left(Temporal, 1) <> 9 And Left(Temporal, 1) <> 1 Then
'Si es de 7 dígitos (1er dígito diferente a 1 y 9) se antepone 1
Contador1 = Contador1 + 1
Call Reformateo(Temporal, 1)
Temporal = "1" & Temporal
Call Reformateo(Temporal, 2)
Range(columna1 & INTENTAR) = Temporal
End If
ElseIf Len(Temporal) = 6 Then
If Left(Temporal, 1) <> "9" Then
'DEPARTAMENTOS
'Hacemos una búsqueda binaria del departamento que es más eficiente que la secuencial
DepBus = Trim(UCase(Range(columna2 & INTENTAR)))
Inicio = Primero
Fin = Ultimo
Encontrado = False
Do
Medio = (Inicio + Fin) \ 2
If Departamento(Medio) < DepBus...