19 setembro 2008

Conversão número em texto em número - VBA Excel

Tive um problema com o VBA numa macro que estou desenvolvendo para uso no Excel. Ela se consistia em formatar alguns dados de um outro arquivo (O qual os dados eram gerados por uma exportação do SAP) e importá-los para a planilha (arquivo) atual e fazer diversas coisas com ele, que não vem ao caso.

Eis o trecho importante – no caso – do código:

Workbooks.Open ("Z:\Intranet\controlling\restrito2\INSERT.XLS")
Windows("INSERT.XLS").Activate
'Ajeitando a tabela de dados
Rows("1:13").Select
Selection.Delete Shift:=xlUp
Range("A:A,F:F").Select
Selection.Delete Shift:=xlToLeft

'Substituindo valores para data
Columns("D:D").Select
Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

' Convertendo numeros em texto em números
Range("BQ3").Select
ActiveCell.FormulaR1C1 = "1"
Range("BQ3").Select
Selection.Copy
Range("M1:BO1").Select
Range("BO1").Activate
Range(Selection, Selection.End(xlDown)).Select

Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False

Range("BQ4").Select
Application.CutCopyMode = False
Range("BQ3").Select
Selection.ClearContents

'Copiando tabela
Range("A1:BN1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

'Colando dados da tabela INSERT na KE
Windows("KE30_200809.xls").Activate
Range("A2").Select
ActiveSheet.Paste
Range("H2").Select
Application.CutCopyMode = False
Workbooks("INSERT.XLS").Close SaveChanges:=False



Bem, se eu abrir a pasta INSERT.XLS manualmente – sem que seja pela macro – deixando a janela aberta e executar o código: Tudo bem. Funciona perfeitamente. Contudo, quando era a macro que abriria o arquivo, ocorria um erro. Muitos dos dados que eram números eram importados como texto. Verifiquei que isso ocorria devido a abertura não manual do arquivo. Pois quando era feito, automaticamente os números como texto eram convertidos para número. Por alguma razão misteriosa, quando a macro abria o arquivo, o mesmo não acontecia, não eram convertidos.

Então resolvi desenvolver no código da macro um trecho para resolver o problema, para converter tais números em texto, segundo uma referência, seleção, particular da minha pasta. Depois de muito quebrar a cabeça, pesquisar por vários códigos, resolvi usar o método fornecido pelo “Ajuda” da Microsoft. O processo era o seguinte:

Insira o valor 1 numa célula a parte, e copie tal célula. Depois, selecione a referência (onde contém os números em formato texto). Então mande “Colar Especial”, selecione o modo “Multiplicação” e OK.

Bem, quando fiz isso manualmente, ocorreu perfeitamente, todos os valores foram convertidos para número; como se tais fossem multiplicados por 1, isso forçava o Excel considerá-los números; sem alterar o seu valor. Aliás, A x 1, é a multiplicação de A pelo elemento neutro da multiplicação, portanto, o resultado seria A, sem modificar sue valor.

Ok. Quando fiz isso na macro, ocorria um simples problema: “Os números não eram convertidos.” No código acima, destaco um trecho em vermelho, responsável pelo “Colar Especial”. E simplesmente era como se aquilo não fosse executado, os parâmetros fossem definidos, mas talvez, faltasse algo que equivaleria a execução dessa colagem. E pesquisei bastante na Internet sobre isso, nuns fóruns, e o que encontrei, foram várias pessoas com o mesmo problema. E muitas deram algumas soluções, contudo, o modo, não eram compatível com o modo como era feito a seleção da referência no meu código.

Então, depois de umas 5 horas pesquisando; peguei um livro com meu gestor “Crie Planilhas Inteligentes com o Microsoft Office – Excel 2003 – Avançado”, de Renato Haddad & Paulo Haddad. Bem, não sou nenhum especialista em Visual Basic, mas tenho uma boa noção e base de programação e já uma certa familiaridade com o código; mas ainda desconheço muitas propriedades de tal, principalmente se for interagir com os aplicativos, no caso o Excel.

Depois de dar uma geral na sintaxe do Excel, e ver algumas propriedades de alguns comandos, em especial o Range (); e simplesmente um exemplo, no qual era possível fazer um range numa seleção variável, se desse um nome a tal. Então me veio uma luz.

Ao fazer a seleção (a qual muda conforme a tabela é atualizada pela exportação do SAP) simplesmente ínsiro um “NOME” a ele. Depois dou um Range(“NOME”), buscando por seus valores, e aplicando a tais, o seu valor vezes 1.

Ou seja, faria o mesmo que o método da “Ajuda” indicava, multiplicando-o por um. Mas faria isso de forma mais manual ao invés de usar o Colar Especial. Então, por fim, isso se resumiu ao código:

‘ Com a referencia selecionada
Selection.Name:="selecao"
Range("selecao").Value = Value * 1

Bem, se querer fazer essa conversão de formatação de uma célula que contenha um número como texto em número. Recomendo essas simples linhas de código. Principalmente, para quando se têm uma referência variada. Contudo, esse código ainda apresenta algumas falhas, pois ele funciona de lua, tem hora que sim, tem hora que não; e ainda não descobri o por quê.

Isso, foi usado no Excel 2003. Não sei se na versão 2007, já não há os problemas mencionados: 1. Os números em texto não são automaticamente convertidos quando a pasta é aberta pela macro. 2. A função Colar Especial não ocorre quando feita pela macro.

1 comentários:

Israel disse...

Eu sei que o post é antigo, mas encontrei uma solução diferente na ajuda online da Microsoft, no endereço "http://support.microsoft.com/kb/181298/pt", no "método 5". Basicamente é o seguinte;
Depois de selecionar (Range(Selection, Selection.End(xlDown)).Select) entrar com o seguinte código:
For Each xCell In Selection
xCell.Value = xCell.Value
Next xCell


Bem, é isso. Abraços!