VBA – Função Split – Dividir uma Sequência de Caracteres de Texto em uma Matriz
In this Article
- Função Split do VBA
- Uso da Função Split com um Caractere Delimitador
- Uso de um Parâmetro de Limite em uma Função Split
- Uso do Parâmetro Compare em uma Função Split
- Uso de Caracteres Não Imprimíveis Como Caractere Delimitador
- Uso da Função Join para Reverter uma Split
- Como Usar a Função Split para Fazer uma Contagem de Palavras
- Divisão de um Endereço em Células da Planilha
- Dividir a string em Células da planilha
- Criação de uma Nova Função para Permitir a Divisão a Partir de um Determinado Ponto
Função Split do VBA
A função Split do VBA divide uma cadeia de texto em subcadeias com base em um caractere delimitador específico (por exemplo, uma vírgula, um espaço ou dois pontos). É mais fácil de usar do que escrever código para procurar os delimitadores na cadeia de caracteres e, em seguida, extrair os valores.
Pode ser usado se você estiver lendo uma linha de um arquivo CSV (Comma-Separated Value, Valor Separado por Vírgula) ou se tiver um endereço de correspondência que esteja todo em uma linha, mas quiser vê-lo como várias linhas.
A sintaxe é a seguinte:
Split expressão, delimitador[opcional], limite[opcional], comparar[opcional]
A função Split do VBA tem quatro parâmetros:
- Expressão – A cadeia de texto que você deseja dividir em partes diferentes.
- Delimitador (opcional)– cadeia de caracteres ou caractere não imprimível – Define o caractere delimitador que será usado para a divisão. Se nenhum caractere delimitador for fornecido, será usado o padrão de um espaço.
- Limite (opcional) – número – Define quantas divisões serão feitas. Se estiver em branco, todas as divisões disponíveis serão feitas na cadeia de caracteres. Se for definido como 1, nenhuma divisão será feita. Basicamente, permite que você separe um número específico de valores começando no início da cadeia de caracteres, por exemplo, quando a cadeia é muito longa e você só precisa das três primeiras divisões.
- Comparar (opcional) – Se o delimitador for um caractere de texto, será usado para alternar se o delimitador diferencia maiúsculas e minúsculas ou não. Os valores são vbBinaryCompare (diferencia maiúsculas de minúsculas) e vbTextCompare (não diferencia minúsculas de minúsculas).
A função split sempre retorna uma matriz.
Exemplo Simples da Função Split
Sub ExemploSplit()
'Definir variáveis
Dim MinhaArray() As String, MinhaString As String, I As Variant
'Exemplo de string com delimitadores de espaço
MinhaString = "Um Dois Três Quatro"
'Usar a função Split para dividir as partes componentes da string
MinhaArray = Split(MinhaString)
'iterar pela matriz criada para mostrar cada valor
For Each I In MinhaArray
MsgBox I
Next I
End Sub
Neste exemplo, nenhum delimitador é especificado porque todas as palavras têm um espaço entre elas, portanto, o delimitador padrão (espaço) pode ser usado.
A matriz não tem dimensões e é definida como uma string. A variável I, que é usada no loop For…Next, deve ser dimensionada como uma variante.
Quando esse código for executado, ele mostrará quatro caixas de mensagem, uma para cada uma das divisões, por exemplo, Um, Dois, Três e Quatro.
Observe que, se houver um espaço duplo entre as palavras da cadeia de caracteres, isso será avaliado como uma divisão, embora sem nada nela. Esse pode não ser o resultado que você deseja ver.
Você pode corrigir esse problema usando a função Replace para substituir qualquer espaço duplo por um espaço simples:
MinhaString = Replace(MinhaString, " ", " ")
Um espaço à direita ou à esquerda também pode causar problemas ao produzir uma divisão vazia. Esses espaços geralmente são muito difíceis de ver. Você pode remover esses espaços estranhos usando a função Trim:
MinhaString = Trim(MinhaString)
Uso da Função Split com um Caractere Delimitador
Podemos usar um delimitador de ponto e vírgula (;). Isso é frequentemente encontrado em cadeias de endereços de e-mail para separar os endereços. Talvez você tenha recebido um e-mail que foi compartilhado com vários colegas e queira ver na planilha uma lista dos destinatários. Você pode copiar facilmente os endereços de e-mail das caixas “Para” ou “Copiar” do e-mail para o seu código.
Sub ExemploSplitPorPontoEVirgula()
'Definir variáveis
Dim MinhaArray() As String, MinhaString As String, I As Variant, N As Integer
'Exemplo de string com delimitadores de ponto e vírgula
MinhaString = "john@myco.com;jane@myco.com;bill@myco.com;james@myco.com"
'Use a função Split para dividir as partes componentes da string
MinhaArray = Split(MinhaString, ";")
'Limpar a planilha
ActiveSheet.UsedRange.Clear
'iterar pela matriz
For N = 0 To UBound(MinhaArray)
'Colocar cada endereço de e-mail na primeira coluna da planilha
Range("A" & N + 1).Value = MinhaArray(N)
Next N
End Sub
Observe que um loop For…Next é usado para iterar pela matriz. O primeiro elemento da matriz sempre começa em zero, e a função Upper Bound é usada para obter o número máximo de elementos.
Depois de executar esse código, sua planilha terá a seguinte aparência:
Uso de um Parâmetro de Limite em uma Função Split
O parâmetro ‘limite’ permite que um número específico de divisões seja feito a partir do início da cadeia de caracteres. Infelizmente, você não pode fornecer uma posição inicial ou um intervalo de divisões a serem feitas, portanto, é bastante básico. Você pode desenvolver seu próprio código VBA para criar uma função para fazer isso, o que será explicado mais adiante neste artigo.
Sub ExemploSplitComLimite()
'Criar Variáveis
Dim MinhaArray() As String, MinhaString As String, I As Variant, N As Integer
'Exemplo de string com delimitadores de vírgula
MinhaString = "One,Two,Three,Four,Five,Six"
'Use a função Split para dividir as partes componentes da string
MinhaArray = Split(MinhaString, ",", 4)
'Limpar a planilha
ActiveSheet.UsedRange.Clear
'Iterar pela matriz
For N = 0 To UBound(MinhaArray)
'Colocar cada divisão na primeira coluna da planilha
Range("A" & N + 1).Value = MinhaArray(N)
Next N
End Sub
Depois de executar esse código, sua planilha terá a seguinte aparência:
Somente os três primeiros valores divididos são mostrados separadamente. Os três últimos valores são mostrados como uma cadeia longa e não são divididos.
Se você escolher um valor limite maior que o número de delimitadores em uma cadeia de caracteres, isso não produzirá um erro. A cadeia de caracteres será dividida em todas as suas partes componentes como se o valor limite não tivesse sido fornecido.
Uso do Parâmetro Compare em uma Função Split
O parâmetro Compare determina se o delimitador faz distinção entre maiúsculas e minúsculas ou não. Isso não se aplica se os delimitadores forem vírgulas, ponto e vírgula ou dois pontos.
Observação: Em vez disso, você sempre pode colocar a opção Compare Text na parte superior do módulo para eliminar a distinção entre maiúsculas e minúsculas em todo o módulo.
Sub ExemploSplitComCompare()
'Criar Variáveis
Dim MinhaArray() As String, MinhaString As String, I As Variant, N As Integer
'Amostra de string com delimitadores X
MinhaString = "OneXTwoXThreexFourXFivexSix"
'Usar a função Split para dividir as partes componentes da string
MinhaArray = Split(MinhaString, "X", , vbBinaryCompare)
'Limpar a planilha
ActiveSheet.UsedRange.Clear
'iterar pela matriz
For N = 0 To UBound(MinhaArray)
'Colocar cada divisão na primeira coluna da planilha
Range("A" & N + 1).Value = MinhaArray(N)
Next N
End Sub
Neste exemplo, a cadeia de caracteres a ser dividida usa o caractere ‘X’ como delimitador. Entretanto, nessa cadeia, há uma mistura de caracteres ‘X’ maiúsculos e minúsculos. O parâmetro Compare na função Split usa um caractere ‘X’ maiúsculo.
Se o parâmetro Compare for definido como vbBinaryCompare, os caracteres ‘x’ minúsculos serão ignorados e sua planilha terá a seguinte aparência:
Se o parâmetro Compare for definido como vbTextCompare, os caracteres “x” minúsculos serão usados na divisão e sua planilha terá a seguinte aparência:
Observe que o valor na célula A6 está truncado porque contém um caractere “x” minúsculo. Como a divisão não diferencia maiúsculas de minúsculas, qualquer delimitador que faça parte de uma subcadeia de caracteres causará uma divisão.
Esse é um ponto importante a ser considerado ao usar um delimitador de texto e o vbTextCompare. Você pode facilmente acabar com o resultado errado.
Uso de Caracteres Não Imprimíveis Como Caractere Delimitador
Você pode usar caracteres não imprimíveis como delimitador, como um retorno de carro (uma quebra de linha).
Aqui usamos o vbCr para especificar um retorno de carro.
Sub ExemploSplitPorNaoImprimivel()
'Criar variáves
Dim MinhaArray() As String, MinhaString As String, I As Variant, N As Integer
'Exemplo de string com delimitadores de retorno de carro
MinhaString = "One" & vbCr & "Two" & vbCr & "Three" & vbCr & "Four" & vbCr & "Five" & vbCr & "Six"
'Use a função Split para dividir as partes componentes da string
MinhaArray = Split(MinhaString, vbCr, , vbTextCompare)
'Limpar a planilha
ActiveSheet.UsedRange.Clear
'Iterar pela matriz
For N = 0 To UBound(MinhaArray)
'Colocar cada divisão na primeira coluna da planilha
Range("A" & N + 1).Value = MinhaArray(N)
Next N
End Sub
Neste exemplo, uma cadeia de caracteres é criada usando vbCr (caractere de retorno de carro) como delimitador.
Quando esse código for executado, sua planilha terá a seguinte aparência:
Uso da Função Join para Reverter uma Split
A função Join unirá novamente todos os elementos de uma matriz, mas usando um delimitador especificado. Se nenhum caractere delimitador for especificado, será usado um espaço.
Sub ExemploJoin()
'Criar Variáveis
Dim MinhaArray() As String, MinhaString As String, I As Variant, N As Integer
Dim Meta As String
'Exemplo de string com delimitadores de vírgula
MinhaString = "One,Two,Three,Four,Five,Six"
'Colocar MinhaString na célula A1
Range("A1").Value = MinhaString
'Use a função Split para dividir as partes componentes da string
MinhaArray = Split(MinhaString, ",")
'Usar a função Join para recriar a string original usando um delimitador de ponto e vírgula
Meta = Join(MinhaArray,";")
'Colocar a string de resultado na célula A2
Range("A2").Value = Meta
End Sub
Esse código divide uma string com delimitadores de vírgula em uma matriz e a junta novamente usando delimitadores de ponto e vírgula.
Depois de executar esse código, sua planilha terá a seguinte aparência:
A célula A1 tem a string original com delimitadores de vírgula e a célula A2 tem a nova string unida com delimitadores de ponto e vírgula.
Como Usar a Função Split para Fazer uma Contagem de Palavras
Levando em conta que uma variável de cadeia de caracteres no Excel VBA pode ter até 2 Gb de comprimento, você pode usar a função Split para fazer a contagem de palavras em um trecho de texto. Obviamente, o Microsoft Word faz isso automaticamente, mas isso pode ser útil para um arquivo de texto simples ou texto copiado de outro aplicativo.
Sub ExemploNumeroDePalavras()
'Criar Variaveis
Dim MinhaArray() As String, MinhaString As String
'Amostra de string com delimitadores de espaço
MinhaString = "One Two Three Four Five Six"
'Remover espaços duplos
MinhaString = Replace(MinhaString, " ", " ")
'Remova todos os espaços à esquerda ou à direita
MinhaString = Trim(MinhaString)
'Usar a função Split para dividir as partes componentes da string
MinhaArray = Split(MinhaString)
'Mostrar o número de palavras usando a função UBound
MsgBox "Número de Palavras " & UBound(MinhaArray) + 1
End Sub
Um dos perigos desse código de contagem de palavras é que ele será acionado por espaços duplos e espaços à esquerda e à direita. Se esses espaços estiverem presentes, serão contados como palavras extras, e a contagem de palavras acabará sendo imprecisa.
O código usa as funções Replace e Trim para remover esses espaços extras.
A linha de código final exibe o número de palavras encontradas usando a função UBound para obter o número máximo de elementos da matriz e, em seguida, incrementando-o em 1. Isso ocorre porque o primeiro elemento da matriz começa em zero.
Divisão de um Endereço em Células da Planilha
Os endereços de e-mail geralmente são longas sequências de texto com delimitadores de vírgula. É possível que você queira dividir cada parte do endereço em uma célula separada.
Sub ExemploEndereco()
'Criar variáveis
Dim MinhaArray() As String, MinhaString As String, N As Integer
'Configurar string com o endereço da Microsoft Corporation
MinhaString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA"
'Usar a função split para dividir a cadeia de caracteres usando um delimitador de vírgula
MinhaArray = Split(MinhaString, ",")
'Limpar a Planilha
ActiveSheet.UsedRange.Clear
'iterar pela matriz
For N = 0 To UBound(MinhaArray)
'Coloque cada divisão na primeira coluna da planilha
Range("A" & N + 1).Value = MinhaArray(N)
Next N
End Sub
A execução desse código usará o delimitador de vírgula para colocar cada linha do endereço em uma célula separada:
Se você quisesse retornar apenas o CEP (último elemento da matriz), poderia usar o código:
Sub ExemploEnderecoCEP()
'Criar variáveis
Dim MinhaArray() As String, MinhaString As String, N As Integer, Temp As String
'Configurar string com o endereço da Microsoft Corporation
MinhaString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA"
'Use a função split para dividir a cadeia de caracteres usando um delimitador de vírgula
MinhaArray = Split(MinhaString, ",")
'Limpar a planilha
ActiveSheet.UsedRange.Clear
'Coloque o CEP na célula A1
Range("A1").Value = MinhaArray(UBound(MinhaArray))
End Sub
Isso usará apenas o último elemento da matriz, que é encontrado usando a função UBound.
Por outro lado, talvez você queira ver todas as linhas em uma célula para que elas possam ser impressas em uma etiqueta de endereço:
Sub ExemploEndereco()
'Criar variáveis
Dim MinhaArray() As String, MinhaString As String, N As Integer, Temp As String
'Configurar string com o endereço da Microsoft Corporation
MinhaString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA"
'Use a função split para dividir a cadeia de caracteres usando um delimitador de vírgula
MinhaArray = Split(MinhaString, ",")
'Limpar a planilha
ActiveSheet.UsedRange.Clear
'iterar pela matriz
For N = 0 To UBound(MinhaArray)
'colocar cada elemento da matriz mais um caractere de avanço de linha em uma string
Temp = Temp & MinhaArray(N) & vbLf
Next N
'Coloque a string na planilha
Range("A1") = Temp
End Sub
Esse exemplo funciona da mesma forma que o anterior, exceto pelo fato de criar uma cadeia temporária de todos os elementos da matriz, mas inserindo um caractere de avanço de linha após cada elemento.
A planilha terá a seguinte aparência depois que o código for executado:
Dividir a string em Células da planilha
Você pode copiar a matriz Split para as células da planilha com apenas um comando:
Sub CopiarParaIntervalo()
'Criar variáveis
Dim MinhaArray() As String, MinhaString As String
'Amostra de string com delimitadores de espaço
MinhaString = "One,Two,Three,Four,Five,Six"
'Use a função Split para dividir as partes componentes da string
MinhaArray = Split(MinhaString, ",")
'Copie a matriz para a planilha
Range("A1:A" & UBound(MinhaArray) + 1).Value = WorksheetFunction.Transpose(MinhaArray)
End Sub
Quando esse código tiver sido executado, sua planilha terá a seguinte aparência:
Criação de uma Nova Função para Permitir a Divisão a Partir de um Determinado Ponto
O parâmetro Limite na função Split só permite que você especifique um limite superior onde deseja que a divisão seja interrompida. Ela sempre começa a partir do início da cadeia de caracteres.
Seria muito útil ter uma função semelhante em que você pudesse especificar o ponto inicial da divisão dentro da cadeia de caracteres e o número de divisões que deseja ver a partir desse ponto. Ela também extrairá apenas as divisões que você especificou na matriz, em vez de ter um valor enorme de cadeia de caracteres como o último elemento da matriz.
Você mesmo pode criar facilmente uma função (chamada CortadorSplit) no VBA para fazer isso:
Function CortadorSplit(Target As String, Del As String, Start As Integer, N As Integer)
'Criar a variável array
Dim MinhaArray() As String
'Capturar a divisão usando a variável de início usando o caractere delimitador
MinhaArray = Split(Target, Del, Start)
'Verificar se o parâmetro de início é maior do que o número de divisões - isso pode causar problemas
If Start > UBound(MinhaArray) + 1 Then
'Exibir erro e sair da função
MsgBox "O parâmetro de início é maior do que o número de divisões disponíveis"
CortadorSplit = MinhaArray
Exit Function
End If
'Colocar o último elemento do array na string
Target = MinhaArray(UBound(MinhaArray))
'Dividir a string usando N como limite
MinhaArray = Split(Target, Del, N)
'Verificar se o limite superior é maior que zero, pois o código remove o último elemento
If UBound(MinhaArray) > 0 Then
'Use ReDim para remover o elemento final da matriz
ReDim Preserve MinhaArray(UBound(MinhaArray) - 1)
End If
'Retorna a nova matriz
CortadorSplit = MinhaArray
End Function
Essa função é criada com quatro parâmetros:
- Target – string – é a string de entrada que você deseja dividir
- Del – string ou caractere não imprimível – este é o caractere delimitador que você usa, por exemplo, vírgula, dois pontos
- Start – número – é a divisão inicial da fatia
- N – número – este é o número de divisões que você deseja fazer em sua fatia
Nenhum desses parâmetros é opcional ou tem valores padrão, mas você pode incluí-los no código da função se quiser ampliá-la ainda mais.
A função usa a função Split para criar uma matriz usando o parâmetro Start como o Limite. Isso significa que os elementos da matriz manterão as divisões até o parâmetro start, mas o restante da cadeia de caracteres será o último elemento e não será dividido.
O último elemento da matriz é transferido de volta para uma cadeia de caracteres usando a função UBound para determinar qual é esse elemento.
Em seguida, a string é dividida novamente na matriz, usando N como variável limite. Isso significa que as divisões serão feitas para a cadeia de caracteres até a posição N, após a qual o restante da cadeia de caracteres formará o último elemento da matriz.
A instrução ReDim é usada para remover o último elemento, pois queremos que apenas os elementos específicos permaneçam na matriz. Observe que o parâmetro Preserve é usado, caso contrário, todos os dados da matriz serão perdidos.
A nova matriz é então retornada ao código a partir do qual foi chamada.
Observe que o código é “à prova de erros”. Os usuários geralmente fazem coisas estranhas que você não considerou. Por exemplo, se eles tentarem usar a função com o parâmetro Start ou N maior do que o número disponível de divisões na cadeia de caracteres, isso provavelmente fará com que a função falhe.
O código está incluído para verificar o valor Start e também para garantir que haja um elemento que possa ser removido quando a instrução ReDim for usada na matriz.
Aqui está o código para testar a função:
Sub TestarCortadorSplit()
'Criar Variáveis
Dim MinhaArray() As String, MinhaString As String
'Definir string de amostra com delimitadores de vírgula
MinhaString = "One,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten"
'Use a função CortadorSplit para definir uma nova matriz
MinhaArray = CortadorSplit(MinhaString, ",", 4, 3)
'limpar a planilha ativa
ActiveSheet.UsedRange.Clear
'Copiar a matriz para a planilha
Range("A1:A" & UBound(MinhaArray) + 1).Value = WorksheetFunction.Transpose(MinhaArray)
End Sub
Execute esse código e sua planilha terá a seguinte aparência: