Compare duas células do Excel e sintetize as diferenças

0

Estou comparando alguns dados sobre tipos de diferenças: adições e exclusões. Eu usei algum código de um thread anterior para comparar duas strings e encontrar diferença; e simplesmente trocou os argumentos WORDDIF de acordo.

= WORDDIF (A1, B1)
Código:

Function WORDDIF(rngA As Range, rngB As Range) As String

Dim WordsA As Variant, WordsB As Variant
Dim ndxA As Long, ndxB As Long, strTemp As String

WordsA = Split(rngA.Text, " ")
WordsB = Split(rngB.Text, " ")

For ndxB = LBound(WordsB) To UBound(WordsB)
For ndxA = LBound(WordsA) To UBound(WordsA)
If StrComp(WordsA(ndxA), WordsB(ndxB), vbTextCompare) = 0 Then
WordsA(ndxA) = vbNullString
Exit For
End If
Next ndxA
Next ndxB

For ndxA = LBound(WordsA) To UBound(WordsA)
If WordsA(ndxA) <> vbNullString Then strTemp = strTemp & WordsA(ndxA) & " "
Next ndxA

WORDDIF = Trim(strTemp)

End Function

No entanto, cheguei a alguns obstáculos.

  1. Às vezes, a célula de adição e exclusão imprime o mesmo nome.
  2. Desejo excluir os números com parênteses "(1)" e "AC"

Código atualizado

Código:

Function WORDDIF(rngA As Range, rngB As Range) As String

'Remove linefeed characters and exclude parentheticals

Dim WordsA As Variant, WordsB As Variant
Dim ndxA As Long, ndxB As Long, strTemp As String

WordsA = Split(Replace(rngA.Text, vbLf, " "), " ") 'remove linefeed
WordsB = Split(Replace(rngB.Text, vbLf, " "), " ") 'remove linefeed

For ndxB = LBound(WordsB) To UBound(WordsB)
For ndxA = LBound(WordsA) To UBound(WordsA)
If StrComp(WordsA(ndxA), WordsB(ndxB), vbTextCompare) = 0 Then
WordsA(ndxA) = vbNullString
Exit For
End If
Next ndxA
Next ndxB

For ndxA = LBound(WordsA) To UBound(WordsA)
'Exclude parentheticals
If Not WordsA(ndxA) Like "(*)" Then strTemp = strTemp & WordsA(ndxA) & " "
Next ndxA

WORDDIF = Application.Trim(strTemp)

End Function

O código parece ótimo. Eu tenho algumas alterações que gostaria de fazer:

  1. Por fim, seria interessante imprimir uma nova coluna com: adições (em itálico) e exclusões (passagem). Em vez de ter uma coluna de exclusões ou adições (o que é ótimo ver visualmente), eu queria saber se há um código que sintetiza as informações, de modo que a saída é: todos os nomes de escola, com exclusões (greve), adições (em itálico) ), e repete (sem alteração = normal).

  2. Cada escola é separada (para a coluna adições / exclusões). Eu acho que eles vêm apenas como uma lista sem qualquer técnica de separação. Então, cada um tem sua própria linha dentro da célula ou separada por uma coluna. Talvez uma vírgula pudesse substituir o duplo entre parênteses.

Exemplos para acompanhar os itens acima:

  1. Informação sintetizada:

B6 = * (os blocos representam células do Excel)

Med Col of Georgia (1) (AC) Morehouse (1) (AC)

D6 =

Med Col of Georgia (1) (AC) Meharry (1) (AC)

Deletions
G6 = WORDDIF (D6, B6)

Meharry

Adições
H6 = WORDDIF (B6, D6)

Morehouse

I6 = {novo código ou algo assim}

Med Col of Georgia, Morehouse, Meharry*

* Nota: não consegui descobrir como atacar Meharry, então sublinhei. Observe também que há vírgulas separando as escolas na lista final. Talvez isso possa ser feito com a substituição do conjunto de parênteses por vírgulas.

  1. Escolas separadas

B91 =

Columbia (1) (AC) Northwestern (1) (AC) Southern Calif (1) (AC) U Chicago-Pritzker (1) (AC) U Michigan (1) (AC) Wash U St Louis (1) (AC)

D91 =

Northwestern (1) (AC) Southern Calif (1) (AC) U Chicago-Pritzker (1) (AC) U Michigan (1) (AC)

H91 == WORDDIF (B91, D91)

Columbia Wash U St Louis

{versão melhorada}

H91 == WORDDIF (B91, D91)

Columbia Wash U St Louis

OR

Columbia, Wash U St Louis

Observe os espaços no primeiro exemplo e a vírgula no segundo.

Felicidades por toda a sua ajuda.

Além disso, eu fiz um pouco de codificação de volta no dia. Enquanto eu estou um pouco enferrujado, seria bom aprender a codificar para o Excel. Se você tiver quaisquer ponteiros ou recursos, isso seria útil.

    
por DJD 24.02.2016 / 18:22

0 respostas