2008-11-04 8 views
7

He hecho algunas búsquedas en Google, y no puedo encontrar nada, aunque tal vez estoy buscando en los lugares equivocados. Tampoco soy muy experto en VBA, pero estoy seguro de que puedo resolverlo con los punteros correctos :)Manipulación de cadenas con Excel: ¿cómo eliminar parte de una cadena si hay otra parte?

Tengo una cadena que estoy creando que es una concatenación de varias celdas, en función de varias condiciones. Golpeé estos en orden.

=IF(A405<>A404,G405,G405&H404) 

Lo que quiero hacer es volver a través de mi lista concatenada, la eliminación de un valor superada si el superseder está en la lista.

Por ejemplo, ver la siguiente lista:

A, D, G, Y, Z 

Quiero eliminar Dsi y únicasiY está presente.

¿Cómo podría hacerlo? (VBA o dentro de la celda, aunque preferiría en la celda)

Respuesta

0

I Acabo de recibir esto como una posible solución por correo electrónico:

=IF(A15<>A14,G15,IF(OR(AND(G15="CR247, ",ISNUMBER(FIND("CR247, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR215, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR180, ",H14))),AND(G15="CR180, ",ISNUMBER(FIND("CR215, ",H14))),G15="CR113, "),H14,G15&H14)) 

(esto tiene los valores "reales" con reglas de precedencia)

Parece relativamente similar a la respuesta de @Joseph.

¿Existe una solución mejor?

+0

fwiw: esta es la respuesta que terminé usando, ¡gracias por las otras sugerencias! – warren

0

Probablemente sea más fácil comenzar desde el final, hacer sus adiciones al principio de la cadena y solo agregar D si Y no está presente.

2

En primer lugar, ¿por qué no mantener una matriz de cadenas en su lugar a medida que avanza por todas las celdas, y luego concatenar todo al final?

De lo contrario, usted va a utilizar las funciones de cadena como INSTR y MID a hacer algo como:

start1 = instr(myLongString,"Y, ") 
if start1 > 0 Then 
    start2 = instr(myLongString,"D, ") 
    if start2 > 0 then 
     newLongString = left(myLongString, start2 - 1) & _ 
         mid(myLongString, start2 + 3) 
    end if 
end if 

Pero, como ya he dicho, me gustaría mantener una matriz que es fácil de recorrer, a continuación, una vez que se tenga todos los valores que usted SABE que usará, simplemente concatenelos al final.

0

supongo D podría aparecer en cualquier lugar, así que ¿qué:

If InStr(strString, "Y") > 0 Then 
    strString = Replace(strString, "d", "") 
    strString = Replace(strString, " ", "") 
    strString = Replace(strString, " ,", "") 
    strString = Replace(strString, ",,", ",") 
End If 
5

Probar:

=IF(ISERROR(FIND("Y",A1)),A1,SUBSTITUTE(A1,"D, ","")) 

Pero eso asume que siempre tenga la coma y el espacio después de la D.

+0

Necesita utilizar ISERROR o ISNUMBER en la instrucción FIND, en caso de que no encuentre lo que está buscando (y por lo tanto tendrá que cambiar las dos cajas). –

0

Si no hay demasiadas combinaciones que quiera eliminar, puede usar = IF (FIND ("D"; A2)> 0; REPLACE (A2; 1; 3; ""); A2) .

1

VBA: Siempre puede usar el objeto regexp. Creo que eso le da la capacidad de probar cualquier cosa en su secuencia de comandos siempre que construya correctamente la expresión regular.

Salida: http://msdn.microsoft.com/en-us/library/yab2dx62(VS.85).aspx (para referencia de expresiones regulares)
y una herramienta simple para probar sus expresiones regulares: http://www.codehouse.com/webmaster_tools/regex/

Dentro de la célula: usted podría hacerlo de una manera más amigable sobresalir:
suponen el columna A: A tienes los valores.
Puede agregar una nueva columna donde realice la verificación
if(indirect("A"&row()) <> indirect("A"&row()-1), indirect("G"&row()), indirect("G"&row())& indirect("H"&row()))
o cualquiera que sean los valores. Sin embargo, supongo que en una rama de la declaración if el valor debe estar en blanco. Después de eso, concatena solo los valores de la columna B: B (omitiendo espacios en blanco si es necesario).

Espero que esto ayude.

Cuestiones relacionadas