Visual Basic para Aplicaciones - Reemplazo en VBA para Excel con condición

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

Reemplazo en VBA para Excel con condición

Publicado por Jorge (7 intervenciones) el 10/09/2021 15:23:56
Muy buenas tardes, espero puedan ayudarme con un reemplazo con el que no consigo aclararme:

Tengo una columna de EXCEL con 2 valores de texto los que hay que separar con "<<>>" , ejemplos:

PP:0211:14111020:35..36 (18D-07) <<>> PP:0101:1214359:51..52 (801-01)
PP:0101:1214369:137..138 (801-11) <<>> PP:0102:1214383:07..08 (802-07)

Todos muy similares, el caso es que hay algunas filas que tienen otro formato, sin los paréntesis:

PP:0101:1215081:31..32-----PP:0101:1215079:117..118
PP:0102:1214404:27..28--------PP:0101:1214361:99..100

Tengo la relación a la cual corresponde cada uno:

PP:0101:1214370 seria PP:0101:1214370 (801-12)
PP:0102:1215086 seria PP:0102:1215086 (102-10)

Hay que añadirle la "coletilla" del paréntesis

Seria posible una macro/función que adaptase estos últimos al formato de los primeros? Y claro, que salte los que ya están correctos y no me duplique texto como me pasa ahora.

Me sale de resultado

PP:0101:1214369:137..138 (801-11) (801-11) <<>> PP:0102:1214383:07..08 (802-07) (802-07)

Porque no me distingue los que tienen el paréntesis de los que no.

Espero haberme explicado, muchas gracias compañeros.

Jorge
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Reemplazo en VBA para Excel con condición

Publicado por Antoni Masana (498 intervenciones) el 10/09/2021 18:18:20
Es posible hacer una macro.

1º.- Sube un libro que tenga todas las casuísticas posibles.
2º.- Explica que es lo que se tiene que hacer en cada caso.

De la explicación de arriba no he entendido que es lo que se tiene que hacer en cada caso.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Reemplazo en VBA para Excel con condición

Publicado por Jorge (7 intervenciones) el 13/09/2021 07:26:15
Buenos días y gracias por responder, he subido un libro de ejemplo.
Como se puede ver hay líneas que tienen el (XXX-XX) y otras no, lo que quiero es añadir el (XXX-XX) Correspondiente a los que no la tengan.

Además de substituir el "----" (Que no siempre son el mismo número de guiones) que separa los dos grupos por "<<>>" .
Y que los que ya tengan el (XXX-XX) se los salte.

Cada PP:XXXX:XXXXXXX tiene una correspondencia, es decir por ejemplo el "PP:0101:1214367" equivale a "(801-09)", por lo que la finalidad es añadirle el (XXX-XX)

El ideal es este

PP:0101:1214366:143-144 (801-08)<<>> PP:0101:1214362:97..98 (801-04)

Y el "malo" es este :

PP:0102:1214405:97..98----PP:0101:1214367:.121..122------CP:0101:1215078:121..122----PP:0101:1215077:71..72

Espero haberme explicado xD.

Saludos y gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Reemplazo en VBA para Excel con condición

Publicado por Antoni Masana (498 intervenciones) el 13/09/2021 17:23:24
Esta es la macro.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub Separar_V2()
    Dim Tabla() As String, Fila As Long, Pun As String, _
        Ind As Integer, Texto As String, Ch As String, _
        Parentesis As Boolean
 
    Const SEPA = " <·<<·<>·>>·> · -·--·- ·<-·->·-<·->·<-·>-·--C"
 
    Fila = 1
    While Cells(Fila, "A") <> ""
        Texto = Cells(Fila, "A")
        ReDim Tabla(1)
        Pun = 1
        For Ind = 1 To Len(Texto) - 2
            Ch = Mid$(Texto, Ind, 2)
 
            If InStr(SEPA, Ch) > 0 Then
                If Len(Tabla(Pun)) > 0 Then
                    Pun = Pun + 1
                    ReDim Preserve Tabla(Pun)
                End If
            Else
                Tabla(Pun) = Tabla(Pun) + Left(Ch, 1)
            End If
 
            If Ch = "(" Then Parentesis = True
            If Ch = ")" Then Parentesis = False
        Next
        Tabla(Pun) = Tabla(Pun) + Right(Texto, 1)
        Texto = ""
' ---    Cells(Fila, 3) = Pun
        For Ind = 1 To Pun
' ---        Cells(Fila, 3 + Ind) = Trim(Tabla(Ind))
            Texto = Texto + Trim(Tabla(Ind)) + " <<>> "
        Next
        Cells(Fila, "B") = Left(Texto, Len(Texto) - 6)
        Fila = Fila + 1
    Wend
End Sub

Los datos de las Columnas C,D, E, F y G es para comprobar que separa bien los grupos.
En la macro estan comentadas las líneas que rellenan estas columna.

Adjunto libro con macro.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Reemplazo en VBA para Excel con condición

Publicado por Jorge (7 intervenciones) el 14/09/2021 07:31:15
Vale, según veo esta macro hace la parte de cambiar los separadores "----" por "<<>>" y separar los grupos de "PP:XXX:XXXXXXX" si no me equivoco, corrígeme xD es que hace muchos años que hice VBA y no lo recuerdo mucho

Necesitaría también que hiciese la otra parte, donde encuentre PP:XXX:XXXXXXX añada el (XXX-XX).

La traducción seria: (La parte izquierda es la nomenclatura antigua y la parte derecha es la nomenclatura nueva, tienen que estar las dos)
Además al final de la columna izquierda suelen haber 2 números separados por "..." que son los puertos, hay que mantenerlos.

Ejemplo práctico:

Si encontramos

PP:0208:14111000:55..56 --- PP:0208:14111001:12..13

deberia traducirse a

PP:0208:14111000:55..56 (16D-01) <<>> PP:0208:14111001:12..13 (16D-02)

Que serian los 2 primeros de esta lista de abajo.

PP:0208:14111000 (16D-01)
PP:0208:14111001 (16D-02)

PP:0208:14111002 (16D-03)
PP:0208:14111003 (16D-04)
PP:0208:14111004 (16D-05)
PP:0208:14111005 (16D-06)
PP:0208:14111006 (16D-07)
PP:0209:14111007 (17D-01)
PP:0209:14111008 (17D-02)
PP:0209:14111009 (17D-03)
PP:0209:14111010 (17D-04)
PP:0209:14111011 (17D-05)
PP:0209:14111012 (17D-06)
PP:0209:14111013 (17D-07)
PP:0211:14111014 (18D-01)
PP:0211:14111015 (18D-02)
PP:0211:14111016 (18D-03)
PP:0211:14111017 (18D-04)
PP:0211:14111018 (18D-05)
PP:0211:14111019 (18D-06)
PP:0211:14111020 (18D-07)
PP:0211:14111021 (18D-08)
PP:0212:1181697 (19D-01)
PP:0212:1181698 (19D-02)
PP:0212:1181699 (19D-03)
PP:0212:1181700 (19D-04)
PP:0212:1181701 (19D-05)
PP:0212:1181702 (19D-06)
PP:0212:1181703 (19D-07)
PP:0212:1181704 (19D-08)
PP:0108:14111022 (700-01)
PP:0108:14111023 (700-02)
PP:0108:14111024 (700-03)
PP:0108:14111025 (700-04)
PP:0108:14111026 (700-05)
PP:0108:14111027 (700-06)
PP:0108:14111028 (700-07)
PP:0108:14111029 (700-08)
PP:0107:14111030 (71D-01)
PP:0107:14111031 (71D-02)
PP:0107:14111032 (71D-03)
PP:0107:14111033 (71D-04)
PP:0107:14111034 (71D-05)
PP:0107:14111035 (71D-06)
PP:0107:14111036 (71D-07)
PP:0107:14111037 (71D-08)
PP:0105:14111038 (72D-01)
PP:0105:14111039 (72D-02)
PP:0105:14111040 (72D-03)
PP:0105:14111041 (72D-04)
PP:0105:14111042 (72D-05)
PP:0105:14111043 (72D-06)
PP:0105:14111044 (72D-07)
PP:0105:43300235 (72D-08)
PP:0104:1169812 (73D-01)
PP:0104:1159449 (73D-02)
PP:0104:1159451 (73D-03)
PP:0104:1159453 (73D-04)
PP:0104:1166161 (73D-05)
PP:0104:1166162 (73D-06)
PP:0104:1166163 (73D-07)
PP:0104:1166164 (73D-08)
PP:0101:1214359 (801-01)
PP:0101:1214360 (801-02)
PP:0101:1214361 (801-03)
PP:0101:1214362 (801-04)
PP:0101:1214363 (801-05)
PP:0101:1214364 (801-06)
PP:0101:1214365 (801-07)
PP:0101:1214366 (801-08)
PP:0101:1214367 (801-09)
PP:0101:1214368 (801-10)
PP:0101:1214369 (801-11)
PP:0101:1214370 (801-12)
PP:0102:1214377 (802-01)
PP:0102:1214378 (802-02)
PP:0102:1214379 (802-03)
PP:0102:1214380 (802-04)
PP:0102:1214381 (802-04)
PP:0102:1214382 (802-06)
PP:0102:1214383 (802-07)
PP:0102:1214384 (802-08)
PP:0102:1214402 (802-09)
PP:0102:1214403 (802-10)
PP:0102:1214404 (802-11)
PP:0102:1214405 (802-12)
PP:0101:1181705 (101-01)
PP:0101:1181706 (101-02)
PP:0101:1181707 (101-03)
PP:0101:1181708 (101-04)
PP:0101:1181709 (101-05)
PP:0101:1181710 (101-06)
PP:0101:1215073 (101-07)
PP:0101:1215077 (101-08)
CP:0101:1215078 (101-09)
PP:0101:1215079 (101-10)
PP:0101:1215081 (101-11)
PP:0101:1215082 (101-12)
PP:0102:1181726 (102-01)
PP:0102:1181727 (102-02)
PP:0102:1181728 (102-03)
PP:0102:1181729 (102-04)
PP:0102:1181730 (102-05)
PP:0102:1181731 (102-06)
PP:0102:1215083 (102-07)
PP:0102:1215084 (102-08)
PP:0102:1215085 (102-09)
PP:0102:1215086 (102-10)
PP:0102:1215087 (102-11)
PP:0102:1215088 (102-12)
PP:0103:1181719 (103-01)
PP:0103:1181720 (103-02)

Esta es la lista completa

Saludos y muchas gracias por tu tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Reemplazo en VBA para Excel con condición

Publicado por Antoni Masana (498 intervenciones) el 14/09/2021 14:05:44
La macro resuelve la primera parte del problema y es separar los diferentes segmentos.

Ahora la segunda parte es la que no entiendo. A partir de este texto:

1
PP:0208:14111000

Como deduzco este otro:

1
(16D-01)

Los paréntesis y el guion son fijos, pero ¿Que es la nomenclatura antigua? ¿Que es la nomenclatura nueva?

Me expando en la explicación:

Tomo este texto:

1
PP:0208:14111000:55..56 --- PP:0208:14111001:12..13

Separo las dos partes:

1
2
PP:0208:14111000:55..56
PP:0208:14111001:12..13

He de añadir el texto (aaa-bb) en cada parte

¿Que vale aaa?
¿Que vale bb?

Segun el ejemplo aaa vale 16D y bb vale 01 para el primero y 02 para el segundo. ¿De donde salen y por que?

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Reemplazo en VBA para Excel con condición

Publicado por Jorge (7 intervenciones) el 15/09/2021 07:10:30
1- Son traducciones, es decir PP:0208:14111000 es igual a (16D-01), de ahí la lista que te hice copia-pega tan extensa, son todas las posibilidades.

PP:0208:14111000 es la forma en que se llamaba ese concepto antes y (16D-01) es como se llama ese concepto ahora.
Es como si te digo que "13579" es igual a "(pelota)".


La otra parte:

Separo las dos partes:

1
2
PP:0208:14111000:55..56
PP:0208:14111001:12..13

He de añadir el texto (aaa-bb) en cada parte

¿Que vale aaa? aaa siempre vale el valor de la lista de antes .

PP:0208:14111000: es siempre (16D-01)
PP:0208:14111001: es siempre (16D-02)


¿Que vale bb?

Segun el ejemplo aaa vale 16D y bb vale 01 para el primero y 02 para el segundo. ¿De donde salen y por que?

Este problema viene de que son unos paneles de conectores de fibra óptica que antes se identificaban por una nomenclatura
PP:XXXX:XXXXXXXX y ahora impusieron otra nomenclatura, y en el log donde lo guardamos tienen que estar presentes las dos formas, solo cambian los puertos de estos paneles que es lo que hay al final:

Panel PP:0208:14111001:55..56
Es el panel 14111001 del armario 0208 y los puertos 55 y 56 y es equivalente a (16D-01) puertos 55 y 56.

El excel que uso tiene bastantes mas columnas, y solo habría que aplicarlo en una, que ese aspecto no te lo comenté.

Espero explicarme ahora xD

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Reemplazo en VBA para Excel con condición

Publicado por Antoni Masana (498 intervenciones) el 15/09/2021 19:06:14
Como no se si acabo de entender lo que quieres hacer no se si esta bien y es lo que quieres o no.

Te explico lo que hace la macro y lo que hay en pantalla.

- La macro toma lo datos de la columna A y separa los segmentos utilizando como separadores: <<>> <-> <> ---- , etc.
- Busca cada segmento en la hoja 2 que hay la tabla que me pasaste y busca alguna coincidencia y si la hay la reemplaza por la de la tebla.
- Monta en la columna B los segmentos usando como separador <<>> .

Columna A - Datos del origen
Columna B - Datos modificados
Columna C - Número de segmentos.

Columna D - Fila de la hoja2 donde se encontró la coincidencia
Columna E - Segmento de la columna A, el original.
Columna F - Segmento coincidente de la hoja2 con el de la columna E. Si encontró coincidencia esta VERDE y si no esta ROJO

Columna G - Igual que la D
Columna H - Igual que la E
Columna I - Igual que la F

Columna J - Igual que la D
Columna K - Igual que la E
Columna L - Igual que la F

Columna M - Igual que la D
Columna N - Igual que la E
Columna O - Igual que la F

El archivo adjunto incluye la macro.

También se puede hacer incluyendo la hoja 2 en la macro.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Reemplazo en VBA para Excel con condición

Publicado por Jorge (7 intervenciones) el 16/09/2021 06:30:33
Buenas de nuevo, si lo se, es un poco lioso.....

Tomando como base esta ultima macro:

Me voy al peor caso, linea 59.

PP:0102:1214405:97..98----PP:0101:1214367:.121..122------CP:0101:1215078:121..122----PP:0101:1215077:71..72


El objetivo es obtener la columna B

PP:0102:1214405 (802-12) <<>> PP:0101:1214367 (801-09) <<>> CP:0101:1215078 (101-09) <<>> PP:0101:1215077 (101-08)

pero añadiendo el 97...98 // 121..122 // 121..122 // 71..72 intercalado, a poder ser en el formato ":97...98" , con los ":" delante , es decir:

PP:0102:1214405:97...98 (802-12) <<>> PP:0101:1214367:121..122 (801-09) <<>> CP:0101:1215078 :121..122 (101-09) <<>> PP:0101:1215077 71..72:(101-08)

Añadir la hoja 2 no es problema, se pueden añadir y no molesta para nada.

Lo que yo quería es substituir cualquier cosa rara usada como separador por "<<>>" para que sean todos iguales.
Y añadirles a los que no lo tengan lo de la hoja 2 el (XXX-XX)

Es un Excel usado por varias personas y cada uno lo escribe como le da la gana, no se estandarizan, y la macro debería dejar todo igual.
Si no hay coincidencia, como los que salen en rojo tampoco es crítico, lo imprescindible es la separación con "<<>>" y los puertos intercalados.

PP:0102:1214405:97...98 (802-12) <<>> PP:0101:1214367:121..122 (801-09)

Muchas gracias de nuevo ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Reemplazo en VBA para Excel con condición

Publicado por Antoni Masana (498 intervenciones) el 16/09/2021 15:59:52
si esta bien la conversión te arreglo la macro para que solo escriba la columna B y acepte más filas en la hoja2.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Reemplazo en VBA para Excel con condición

Publicado por Jorge (7 intervenciones) el 17/09/2021 06:23:05
Si, parece que está bien, sobre todo que los puertos, que es lo que hay antes del (XXX-XX) aparezcan :)

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Reemplazo en VBA para Excel con condición

Publicado por Jorge (7 intervenciones) el 18/10/2021 15:42:07
Y ahora como puedo aplicarla a el libro de excel que ya tengo?
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar