Você está na página 1de 25

Dicas

Se voce j conhece o Excel, ento colecione e utilize as DICAS, sempre renovadas, incluidas neste
Portal, que esperamos lhe acrescentaro valiosos conhecimentos. E se voce suspeitava que o EXCEL
era incapaz de executar certas tarefas ento esta uma boa oportunidade para testar as solues
encontradas e refazer seu trabalho aplicando as novidades que garimpou.
A titulo de exerccio, pratique cada uma das questes colocadas. Depois de algum tempo praticando
voce se sentir bem mais confortvel em termos de dominar o Excel/Vba.
As questes abaixo inauguram a seo Dicas On Line relativamente ao EXCEL e o (V) isual (B) asic for
(A) pplications.
Recados Importantes aos Senhores Usurios
Consulte na guia SUPORTE os Pargrafos :
Recomendaes aos Senhores Consulentes e
Detalhes Importantes
Seleo de Dicas
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.

Um Problema Prtico de Arredondamento Comercial


Somando Seletivamente
Preenchendo com Zeros as clulas vazias
Como realizar uma Impresso seletiva
Como operar quando o divisor comum
Diversas funes de arredondamento
Comando para esconder o objeto "CommandButton"
Como redefinir o nome de meu range
Esclarecendo a questo das datas bsicas
Procurando por determinada planilha

55.
56.
57.
58.
59.
60.
40.
41.
42.
43.

Um caso de formatao
Trabalhando no diretrio que contem a procedure
Como Interromper a execuo da procedure
Usando o "Notepad" (Windows98)
Como achar o endereo de colunas
Como fazer para escrever a 45 graus
Transcrevendo dados em Multiplas Colunas
Eliminando Lanamentos em Duplicidade
Como Referi-se ao texto de uma TextBox
Permitindo o Usurio selecionar arquivos aps FileOpen

44.
31.
32.
33.
34.
35.
36.
37.
38.
39.

Lendo numeros por extenso


Construindo uma ListBox e Recuperando o dado escolhido
Definindo-se o ultimo elemento da srie
Diferena entre as funes IsNumber e IsNumeric
Somando-se valores em DataBases
Encontrando-se o valor Mximo
Solucionando duvidas do Usurio
Usando o VBA para atribuir nomes aos Ranges
Resolvendo um problema de Classificao
Selecionando um range desconhecendo-se o ltimo elemento

24.
25.
26.
27.
28.
29.
30.
18.
19.
20.

Identificando Numricos, Alfanumricos e Frmulas


Usando o Teclado para acionar Rotinas
Construindo ListBoxes
Selecionando Dados num Range e Formatando
Resolvendo uma questo com Edit Replace
Partindo de uma Lista, informar o numero de elementos diferentes
Usando a Estrutura Select Case para acionar Rotinas
Selecionando clulas especiais
Criando Menus via VBA que acionam Rotinas
Como ler uma frmula sem abrir o Arquivo ?

21.
22.
23.
11.
12.
13.
14.
15.
16.
17.

Como identificar via VBA as clulas que contem Comentrios ?


Como fazer um Sort e voltar atrs.
Como gerar um grfico "experto"
Identificando a linha que contem uma CheckBox
Obtendo Subtotais
Obtendo o Diretrio em A1
Apontando um rro no uso da funo Sum
As vrias formas de obter-se um mesmo dado
Contornando problemas em arquivos corrompidos
Usando a funo DCount

1. Acrescentando um valor hora atual


2. Incluir um som avisando que a rotina chegou ao fim
3. Acrescentando worksheets aps a ltima
4. Operando com vrios arquivos de forma sequencial
5. Trabalhando com Datas
6. Acesso a Constante declarada em outro Arquivo
7. Somando e impondo condies
8. Eliminando Textos mas mantendo o resto
9. Operando com ranges variveis
10.Selecionando Worksheets a partir de certo ponto

Questo 45 (310100Q45)
A Central de Help contribuiu com Gerentes que estavam em apuros com questes de Arredondamento.
Voces j devem ter observado, pois trata-se de um caso muito comum em magazines de
departamentos : Usar-se nos preos de certos produtos da categoria YY o valor 0,99 nas casas
decimais ( a casa dos centavos. Por exemplo fixar para determinado produto um preo de 5,99 ao
invs de 5,00 ou 6,00 ). E a pergunta que se faz : Ser que o critrio usado para fixar estes valores
tem sido uniforme? Assim um produto hipottico pertencendo a essa categoria YY com custo de 12,56
e margem de 30% apontaria para um preo final de venda de 16,33 (=12,56*1,30). Ao ser no entanto
colocado nas prateleiras, como pertence a categoria YY, seria alterado para 15,99 ou 16,99. O
problema estabelecer para tal categoria de produtos YY, um critrio nico e uniforme, que fornea
como resultado final valores com decimais 0,99.

Soluo 45 (310100S1Q45)
Sendo C o custo e m a margem, a funo abaixo fornece o resultado pretendido
=roundup(C*(1+m);0)-0,01

Questo 46 (310100Q46)
Seria possivel fazer com que o Excel somasse seletivamente os valores de uma couna ? Exemplificando
: Numa coluna (b26:b31) com os valores 100, 30,10,110,500,300 quero somar todos os valores
abaixo de 50 com os valores acima de 200.

Soluo 46 (310100S1Q46)
A expresso a seguir resolve seu problema :
=Sum(Sumif(b26:b31;{"<50"; ">200"}))
O Excel aceita mais de dois "critrios".
Se voce tivesse valores tais como : 5, 7, 55, 30, 12, 110, 500 e 300
poderia usar a expresso :
=Sum(Sumif(b24:b31;{"<10"; ">10"; "<50"})) e obteria 1073
Vide Exerccio 7 que trata questo semelhante

Questo 47 (310100Q47)
Numa extensa coluna temos valores numricos assim como clulas em branco. Quero substituir por
zeros todas as vezes que houver uma clula em branco.

Soluo 47 (310100S1Q47)
No h necessidade de macros para solucionar esta questo.
Proceda como se segue :
Selecione a coluna, acione F5, Selecione Special,
Selecione o option button Blanks e responda OK para fechar a janela,
No retorno planilha Digite 0(Zero), Acione as teclas Control Enter

Questo 48 (310100Q48)
Meu trabalho compreende vrias Sheets. Mas nem todas sero necessrias na fase de impresso.
Como selecionar apenas e to somente as que necessito imprimir ? Acrescento que todas as sheets a
serem impressas tem nome com prefixo especial (Imp....)

Soluo 48 (310100S1Q48)
Sub ImprimeSeleo( )
Dim ws as Worksheet
' Selecionando as Sheets com o prefixo "Imp" no Nome
For each ws in Activeworkbook.Worksheets
if left(ws.nome, 3) = "Imp" then
ws.Select False
end if
Next
ActiveWindow.SelectedSheets.PrintOut
End Sub

Questo 49 (310100S1Q49)
Queremos dividir os valores de uma extensa coluna de numricos por um certo valor.H como faze-lo
automticamente ?

Soluo 49 (310100S1Q49)
Selecione uma clula vazia na planilha que contem a tal lista de numricos
Suponhamos que o divisor comum seja 50. Escreva numa clula vazia =50, e acione Enter, Acione Edit
Copy, Selecione a regio que contem os valores a serem divididos, Acione Edit Paste Special e
selecione o Option Button Divide, e todos os valores sero divididos por 50

Questo 50 (310100Q50)
Como que o VBA se comporta diante de questes de arredondamento ?

Soluo 50 (310100S1Q50)
Int(n) retorna o inteiro mais prximo menor que n
Ex: Int(4,7) retona 4
Int(-2,1) retorna -3
Round(ValorNumrico,CasasDecimais)
Floor e Ceiling agem em sentido contrrio
Ex: Floor(3,45;1) retorna 3 enquanto que Ceiling(3,45; 1) retorna 4
n1 retorna n arredondado para o inteiro mais prximo
Exemplos:
4,61 retorna 5
4,51 retorna 4
3,51 retorna 4
2,61 retorna 3
2,51 retorna 2
Converte o numrico n em texto
FIXED(1234,567; 1) retorna "1234,6"
FIXED(1234,567; -1) retorna "1230"
FIXED(-1234,567; -1) retorna "-1230"

FIXED(44,332) equals "44,33"


Trunc funo que trunca o numrico respeitando a parte inteira
TRUNC(8,9) retorna 8
TRUNC(-8,9) retorna -8
TRUNC(PI( )) retorna 3

A proc abaixo faz os testes :

Sub Teste( )
Dim n
n = InputBox("Entre com um numrico")
MsgBox "Int ( ) retornar : " & Int(n)
MsgBox "n1 retornar : " & n1
End Sub

Questo 51 (310100Q51)
Inclu um boto(CommandButton1) na minha Sheet mas quero esconde-lo por ora. O comando abaixo
no faz o que eu preciso. Como corrigir meu erro ?
ActiveSheet.Shapes("CommandButton1"). Select
Selection.Hide

Soluo 51 (310100S1Q51)
Use ActiveSheets.Shape("CommandButton1").Visible = False

Questo 52 (310100Q52)
Atribui ao range A1:A10 o nome "Despesas". Ocorre que preciso incluir mais dados. Ocuparei ento a
clula a11. Em consequencia, o nome "Despesas" passa a no ter mais sentido. Como reaproveitar o
antigo nome ("Despesas") para indicar o novo range A1:A11

Soluo 52 (310100S1Q52)
Sub AdicionandoNovaCelulaAoRange( )
''''Despesas o nome inicial do Range
Range("A1:A10").Name = "Despesas"
''''Acrescentamos dados na celula A11 e renomeamos o novo range com o nome antigo.
Union(Range("Despesas"),Range("A11")).Name = "Despesas"
End Sub

Questo 53 (310100Q53)
Agradecemos esclarecer-nos com mais detalhes dos problemas que envolvem as datas bsicas
adotadas pela Microsoft.

Soluo 53 (310100S1Q53)
Excel
Os usurios de PCs sabem que o Excel usa a data base : 01 de Janeiro de 1900 e determina para esta
data o valor serial (DateValue) igual a 1.
No caso dos usurios do MacIntosh a data base diferente : 02 de Janeiro de 1904 cujo valor serial
1. Mas neste caso considera tambem que a data 01 de Janeiro de 1904 tem o valor serial igual a
Zero.
Caberia a pergunta : Porque a M$ usa o ano de 1900 como ano base? E a resposta : Para manter
compatibilidade com o Lotus 123 (a M$ entendeu que manter o rro seria menos prejudicial que tentar

conserta-lo). Mas da decorrem outros problemas. Assume vlida a data calendrio 29 de Fevereiro de
1900 e devolve para esta data o valor serial 60 (=DateValue ("29/2/1900")).
Desta forma obteremos resultados com rros se calculamos por exemplo o nmero de dias entre 15 de
maro de 1900 e 15 de janeiro de 1900. Se tentamos calcular os dias decorridos entre 2 de dezembro
de 1898 e 7 de dezembro de 1999 tambem obtemos rro tendo em vista que a data 2 de dezembro de
1898 anterior a data base (1900). E datas anteriores a data base no Excel so tratadas como texto,
e no podemos realizar a subtrao envolvendo simultneamente datas e
texto.
Finalmente, se um usurio de PCs (ano base 1900) abrir seus arquivos Excel(*.xls) num MacIntosh
(ano base 1904), os mesmos sero abertos com a data base do MacIntosh (1904). A recproca
verdadeira. Nesses casos em alguns clculos, dependendo das datas consideradas, constataremos
diferenas de 4 anos e um dia. .
Access

Da mesma forma o Access usa a data base 31 de dezembro de 1899 para compatibilizar-se com o
Lotus 123
Funes Financeiras
ACCRINT, COUPDAYBS, COUPDAYS, COUPDAYSNC, COUPPCD, COUPNCD, DURATION, MDURATION,
ODDFPRICE, ODDFYIELD, PRICE,and YELD
As funes financeiras acima, fazem parte do pacote "Analysis ToolPack" da Microsoft e se encontram
na biblioteca de funes do EXCEL.
Se estivermos diante de um negcio onde a data 29 de Fevereiro de 2000 a data do primeiro
pagamento de juros, (fato difcil de ocorrer, mas no impossvel) ento o uso destas funes
acarretaro um rro que espera-se seja corrigido nas prximas verses.

Questo 54 (14022000Q54)
O trabalho que eu estou desenvolvendo cria (conforme a situao) novas planilhas e posteriormente
usa essas tais planilhas criadas via programa. Como encontrar ou saber se determinada planilha se
encontra entre as demais ?

Soluo 54 (14022000S1Q54)
Suponhamos que voce esteja procurando pela planilha denominada "Asterix" criada pelo programa. As
instrues abaixo resolvem seu problema
Sub ProcurandoFantasmas( )
On error GoTo Ignoro
Worksheets("Asterix").Select
Exit Sub
Ignoro:
MsgBox "Essa planilha no existe"
End Sub

Questo 55 (14022000Q55)
Como introduzir nas clulas valores tais como "00001" , "00002" , "00003" etc...
Minhas tentativas tem sido frustradas pois o Excel coloca "1" , 2" , "3" sem os zeros que para o meu
caso so importantes.

Soluo 55 (14022000S1Q55)
Tente a instruo :
Range("MeuRange").Value = Format(Array(x,y) ; "@")

Questo 56 (14022000Q56)
Como posso alterar o diretrio de C:Documents para o diretrio que na verdade contem a minha
aplicao ?

Soluo 56 (14022000Q56)
A instruo CHDir ir alterar o diretrio mas o drive que estiver ativo permanece inalterado
A instruo CHDrive ir alterar o drive que estiver ativo
A instruo ThisWorkbook.Path lhe devolve o path do workbook que contem a macro ou procedure.
A instruo ActiveWorkbook.Path lhe devolve o path do workbook que estiver aberto. Havendo vrios
workbooks abertos lhe devolver o path do workbook aberto que encabear a lista.

Questo 57 (14022000Q57)
A partir de determinada instruo, desejo interromper a execuo da minha procedure. Como faze-lo ?

Soluo 57 (14022000S1Q57)
A instruo STOP coloca um "freio" (break) na sua procedure. As instrues que se seguem a essa
instruo ficam portanto em suspenso
A instruo END coloca um ponto final na sua procedure. Mas preciso cuidado. Se voce declarou
variveis globais as mesmas sero resetadas quando o ponteiro do programa passar pela instruo
END.
Para no haver dvida declare suas variveis como Static (neste caso no haver modificao de
valores quer voce use Stop ou End
Para interromper uma Procedure recomendamos usar o modelo abaixo
Sub ProcedureModelo( )
Faa algo : declare Variveis e insira instrues
MsgBox ("Pare Agora ou clique OK para continuar", vbOkCancel, "Alerta")
Continue seu trabalho : Mais instrues
End Sub

Questo 58 (14022000Q58)
Escrev um texto explicativo para o usurio do meu programa. Para tanto, usei o Notepad
(Windows98).
Salvei o referido texto (arquivo) como "Texto Explicativo.txt" . Como posso abrir o referido arquivo a
partir do Excel permitindo que o usurio tenha livre acesso as minhas informaes ?

Soluo 58 (14022000S1Q58)
Antes de entrarmos no mrito da procedure, devo alerta-lo para alterar o nome do seu arquivo. Use
"Explica.txt" que tem apenas 7 caracteres. Supondo que este seu arquivo texto est no diretrio
C:Documentos, a procedure abaixo resolve a questo.
Sub Exibindo_O_Notepad( )
Dim f as string
f = "c:Documentos.txt"
Shell "Notepad " & f, vbNormalFocus
End Sub

Questo 40 (080299Q40)
Numa Planilha Excel tenho anotado regularmente Nomes, SobreNomes e Telefones de amigos e
Clientes(sobretudo Clientes). Usei a Coluna B para fazer estas anotaes. Se uma pessoa tem mais de
um telefone, eu repito o seu nome na linha de baixo com o respectivo telefone.
Ocorre que quando h uma alterao qualquer (quando um Cliente altera seu Sobrenome por exemplo
ou quando h alteraes no nmero do telefone, ou quando um Cliente falece, se ausenta ou muda de
Estado) sou obrigado a fazer um trabalho extra para colocar em dia essa minha coluna B, o que ocorre
com frequncia. Como essa lista j est muito longa, pergunto se o VBA me faria a fineza de colocar
em colunas diferentes a minha lista de Nomes SobreNomes e Telefones. Desde j agradeo por
antecipao vossa atenao.

Soluo 40 (080299S1Q40)
Observao: Os leitores que acompanham essa seo devem observar que na maioria das vezes
simplificamos a descrio do problema. A questo acima poderia ser resumida na frase : "Como
colocar em colunas diferentes Nomes, SobreNomes e Telefones dispostos inicialmente numa nica
coluna ?" Contudo, decidimos apresenta-la na ntegra para mostrar a ntima relao do VBA com os
problemas do dia a dia.
Selecione a sua lista(coluna B) e acione a Macro abaixo e voce ter separado em colunas diferentes
Nomes, SobreNomes e Telefones(Obs: A Macro funcionar desde que at mesmo para os amigos
ntimos voce tenha anotados Nome e SobreNome)
Sub ReformulaListaDeNomes( )
For Each Celula In Selection
Celula.TextToColumns Destination:=Celula, OtherChar:="-"
Next
End Sub

Questo 41 (080299Q41)
Aps recebermos uma solicitao por telefone, codificamos o pedido lanando um cdigo na coluna
A(Excel/97). Numa segunda oportunidade o Cliente confirma o pedido e informa-se quanto dever
pagar, inclusive impostos e frete. Se quem o atende no momento da confirmao for o mesmo
vendedor que o atendeu da primeira vez, provavelmente nada ocorrer de errado. Porem muitas
vezes, quem o atende no o mesmo vendedor. Em consequencia, possivel que na nossa relao
haja lanamentos (codigos) em duplicidade, fato que nos leva a ter prejuizo. Como a relao de
pedidos (codigos) extensa, consultamos essa Central de Help sobre a possibilidade de eliminarmos
da nossa relao, via Macro, os cdigos lanados em duplicidade. Ficamos gratos pelo Help

Soluo 41 (080299S1Q41)
Observao: Os leitores que acompanham essa seo devem observar que na maioria das vezes
simplificamos a descrio do problema. A Questo acima poderia ser resumida na frase : "Como
eliminar numa mesma coluna os dados repetidos". Contudo, decidimos apresenta-la na ntegra para
mostrar a ntima relao do VBA com os problemas correntes do dia a dia.
Sub EliminaDuplicidades( )
Set rfonte = Application.InputBox("Informe Qual o Range?", _
Title:="Range(ColunaA)", Type:=8)
rfonte.Select
Selection.Copy
Sheets("Sheet2").Select
Range("a1").Select
ActiveSheet.Paste
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
For Each c In Selection.Cells
If c.Value = c.Offset(1, 0).Value Then
c.Offset(1, 0).Delete Shift:=xlUp
End If
Next
End Sub

Questo 42 (080299Q42)
Quero aplicar em Sheet1(que eu chamei "Minha Planilha") uma TextBox (vou nomea-la MeuTeste) e
me referir a um texto ("Estou me Apresentando") no interior do objeto criado. Pergunto como faze-lo ?

Soluo 42 (080299S1Q42)
1.Na planilha Minha Planilha, ative ToolBar Control ToolBox,entre em DesignMode e aplique o objeto
TextBox
2.Em Properties troque Name TextBox1 por Name MeuTeste.

3.Encerre DesignMode e ative o VBE Project Explorer


4.Clique duplo em Sheet1(Minha Planilha)
5.Escreva a macro abaixo e acione F5
Sub UsandoTextBoxes( )
Sheets("Minha Planilha").MeuTeste.Text = _
"Estou me Apresentando"
End Sub

Questo 43 (080299Q43)
possivel escrever-se uma Macro que abra no Drive A: a janela "File Open" para que o Usurio
escolha um dentre os arquivos do tipo .xls disponveis ? E se o Usurio desistir da tarefa teclando
Cancel ? Como proceder ?

Soluo 43 (080299S1Q43)
Sub CapturandoFileName( )
ChDir "A:" <file:///A:/>
FileToOpen = _
Application.GetOpenFilename(filefilter:="Excel Files(*.xls),", _
MultiSelect:=True)
z = TypeName(FileToOpen)
MsgBox z
Select Case z
Case "Boolean"
MsgBox "Voce Teclou Cancel"
Case "Variant( )"
MsgBox "Voce Fez uma Seleo Simples"
End Select
End Sub

Questo 44(110299Q44)
Usando-se o Excel / VBA seria possvel escrever-se uma funo que aps ler um numero na forma
tradicional, o converta para forma "por extenso" ? Essa funo em outras palavras, dever ser capaz
de ler um valor qualquer inteiro (ex: 4215) e escreve-lo por extenso (ex:"Quatro Mil Duzentos e
Quinze"). Isso possvel ? Ficamos gratos pelo Help.

Soluo 44 (110299S1Q44)
Function Escr(n)
Unid = Array("", "Um", "Dois", "Trs", "Quatro", "Cinco", _
"Seis", "Sete", "Oito", "Nove", "Dez", "Onze", "Doze", _
"Treze", "Quatorze", "Quinze", "Dezesseis", "Dezessete", _
"Dezoito", "Dezenove", "Vinte")
Dezen = Array("", "Dez", "Vinte", "Trinta", "Quarenta", _
"Cinquenta", "Sessenta", "Setenta", "Oitenta", "Noventa")
Centen = Array("", "Cento", "Duzentos", "Trezentos", _
"Quatrocentos", "Quinhentos", "Seiscentos", _
"Setecentos", "Oitocentos", "Novecentos", "Mil")
Num = n
Escr = ""
If n = 0 Then
Escr = "Zero"
End If
If (n \ 1000) > 0 And n \ 1000 < 10 Then
Escr = Unid(n \ 1000) & " Mil "
End If
n = n - (n \ 1000) * 1000
If n > 100 Then
Escr = Escr & Centen(n \ 100)
End If

If n = 100 Then
Escr = Escr & " Cem"
GoTo Prossiga
End If
n = n - (n \ 100) * 100
If n >= 20 And n < 100 Then
Escr = Escr & " " & Dezen(n \ 10)
End If
If n > 0 And n < 20 Then
Escr = Escr & " " & Unid(n)
GoTo Prossiga
End If
n = n - (n \ 10) * 10
If n > 0 Then
Escr = Escr & " " & Unid(n)
End If
Prossiga:
If Num Mod 10 <> 0 Then
If InStr(1, Escr, "Vinte", 1) = 0 Then
If InStr(1, Escr, "Trinta", 1) = 0 Then
If InStr(1, Escr, "enta", 1) > 0 Then
Escr = Application.Substitute(Escr, "enta", "enta e ")
End If
End If
End If
End If
If Num Mod 10 <> 0 Then
If InStr(1, Escr, "Vinte", 1) > 0 Then
If InStr(1, Escr, "Trinta", 1) = 0 Then
If InStr(1, Escr, "enta", 1) = 0 Then
Escr = Application.Substitute(Escr, "Vinte", "Vinte e ")
End If
End If
End If
End If
If Num Mod 10 <> 0 Then
If InStr(1, Escr, "Vinte", 1) = 0 Then
If InStr(1, Escr, "Trinta", 1) > 0 Then
If InStr(1, Escr, "enta", 1) = 0 Then
Escr = Application.Substitute(Escr, "Trinta", "Trinta e ")
End If
End If
End If
End If
If Num Mod 100 <> 0 Then
If InStr(1, Escr, "ento", 1) > 0 Then
Escr = Application.Substitute(Escr, "Cento", "Cento e ")
End If
End If
If Num Mod 100 <> 0 Then
If InStr(1, Escr, "entos", 1) > 0 Then
Escr = Application.Substitute(Escr, "entos", "entos e ")
End If
End If
If Num Mod 1000 <> 0 Then
If (Num - (Num \ 1000) * 1000) <= 100 Then
If InStr(1, Escr, "Mil", 1) > 0 Then
Escr = Application.Substitute(Escr, "Mil", "Mil e ")
End If
End If
End If
End Function

Questo 31(010299Q31)
Preciso construir uma ListBox com 4 Times (Flamengo, Botafogo, Fluminense e Vasco). Isto posto, ao
selecionar manualmente quaisquer dos 4 times quero exibir uma mensagem com o Time escolhido.
Como proceder ?

Soluo 31 (010299S1Q31)
Sub ExibindoOTimeEscolhido( )
'MS Office95/97
Dim LB As ListBox
Dim ListBoxDialog As DialogSheet
Set ListBoxDialog = ThisWorkbook.DialogSheets("ListBoxDialog")
Set LB = ListBoxDialog.ListBoxes("LB")
LB.RemoveAllItems
Worksheets(1).Select
With LB
.AddItem Index:=1, Text:="Flamengo"
.AddItem Index:=2, Text:="Botafogo"
.AddItem Index:=3, Text:="Fluminense"
.AddItem Index:=4, Text:="Vasco"
End With
ListBoxOK = DialogSheets("ListBoxDialog").Show
If Not ListBoxOK Then Exit Sub
x = LB.ListIndex
MsgBox "Voce Selecionou o Item: " & LB.ListIndex
MsgBox "Voce Selecionou o Time: " & LB.List(x)
End Sub

Questo 32 (010299Q32)
Com muita frequncia preciso calcular a mdia e o desvio padro de sries. Aps o ltimo dado,
costumo saltar duas linhas, escrever 2 labels : "Media : ", e na linha de baixo "Desvio: ". Quanto aos
valores numricos da Mdia e do Desvio, escrevo-os na coluna B obedecendo evidentemente a direo
dos Labels mencionados. Ocorre que minhas sries tem um numero varivel de elementos, de modo
que sem saber onde cair o ultimo elemento da srie, tambem no posso indicar onde ficaro os
referidos Labels. H como contornar o problema ?

Soluo 32 (010299S1Q32)
Seu problema gira em torno do ltimo elemento da srie. Ento temos que defini-lo. Vamos supor que
sua srie esteja na coluna A, a partir de a4 e que no haja "brancos".
Sub ExibindoOSumrio( )
Dim ultElemento As Long
ultElemento = Range("a4").End(xlDown).Row
'Inserindo os Labels:
Range("A" & ultElemento + 2).Value = "Media: "
Range("A" & ultElemento + 3).Value = "Desvio: "
'Colocando as Formulas:
Range("B" & ultElemento + 2).Formula = _
"=Average(A4:A" & ultElemento & ")"
Range("B" & ultElemento + 3).Formula = _
"=StDev(A4:A" & ultElemento & ")"
End Sub

Questo 33 (010299Q33)
Seria possivel explicar-me a diferena entre as funes IsNumber e IsNumeric ?

Soluo 33 (010299S1Q33)
IsNumeric uma funo que opera somente no ambiente VBA.
J IsNumber uma funo que se encontra na biblioteca do Excel.
Ambas fazem no entanto o mesmo servio :
Indicam True ou False caso se trate ou no de um numrico

Questo 34 (010299Q34)
Tenho uma coluna de valores numricos. No h "vazios". Numa coluna diferente somo esses valores
usando =Sum(.....) obtendo uma resposta R = Sum(...). Agora fao uma filtragem usando AutoFilter.
Ocorre que o valor R no recalculado para refletir a soma dos elementos que foram selecionados.
Como proceder para termos sempre renovado o valor da soma dos elementos, antes ou depois da
filtragem ?

Soluo 34 (010299S1Q34)
No seu caso particular, abandone a funo Sum e passe a usar a funo =Subtotal( 9; Ax:Ay) onde x e
y correspondem ao incio e fim da srie antes da filtragem.
Supondo sua srie de valores no range A5:A20 e no range A4 o Label da Srie, sua frmula ser :
=Subtotal( 9;A5:A20)

Questo 35 (010299Q35)
Tenho duas colunas A e B de valores numricos. Quero escrever um programa que me calcule na
coluna C adjacente(que est vazia) e nas linhas correspondentes aos valores dados, o valor do
Mximo.
Exemplificando :
Se meus nicos valores nas colunas A e B forem 12 e 45 respectivamente, quero escrever um
programa que coloque o valor 45 na coluna C.

Soluo 35 (010299S1Q35)
Escrevendo um programa que identifique
em c1, o mximo entre dois valores a1 e b1.
Sub ExibeValorMaximo( )
Cells(1, 3).Formula = _
Application.Max(Range(Cells(1, 1), Cells(1, 2)))
End Sub
Se voce tem vrios valores nas colunas A e B, o programa abaixo preencher a coluna C com os
valores mximos encontrados.
Sub ExibeValorMaximo( )
Cells(1, 1).CurrentRegion.Select
For linha = 1 To Selection.Rows.Count
Cells(linha, 3).Formula = _
Application.Max(Range(Cells(linha, 1), Cells(linha, 2)))
Next
End Sub

Questo 36 (010299Q36)
Tenho valores numericos no range c5:c10.
Em c11 tenho um valor X que no exatamente a soma (c5:c10).
Se a diferena entre o valor exato (sum(c5:c10)) e X for menor que 1, no h nada a fazer, caso
contrrio, quero que a rotina escreva em d7 a palavra "ERRO"
Para chegar a Soluo desse problema, que no apresenta dificuldades maiores, usei a expresso :
"=If(sum(c5:c10)-c11<1, "", "ERRO")"
Ocorre que a frmula acima contem erros, razo pela qual o programa no roda.
Agradeo Central de Help em Excel / VBA a ajuda.

Soluo 36 (010299S1Q36)
O problema da sua frmula reside na utilizao das aspas simples.
Portanto substitua na sua frmula as aspas simples por aspas duplas :
"=If(sum(c5:c10)-c11<1, """", ""ERRO"")"

Questo 37 (010299Q37)
Quero atribuir nomes a dois ranges. Como proceder usando-se o VBA ?

Soluo 37 (010299S1Q37)
Suponhamos que seus ranges sejam repectivamente b4:c4 e b5:c5
Sub AtribuindoNomesAosRanges( )
Worksheets(1).Range(Cells(4, 2), Cells(4, 3)).Select
set Selecao1 = Selection
ActiveWorkbook.Names.Add Name:="MeuRange1", _
RefersTo:=Selecao1
Worksheets(1).Range(Cells(5, 2), Cells(5, 3)).Select
set Selecao2 = Selection
ActiveWorkbook.Names.Add Name:="MeuRange2", _
RefersTo:=Selecao2
End Sub

Questo 38 (010299Q38)
Trabalhando em alguns colegios, perco muito tempo ao ter que classiicar as notas dos meus alunos.
Cada uma das minhas classes tem cerca de 30 a 40 alunos, e as notas, exigencia da direo, devem
ser fracionarias com uma casa decimal.
Preciso ento comparar cada nota com as demais estabelecendo a classificao ( claro que notas
repetidas tem a mesma classificao).
A titulo de exemplo, transcrevo abaixo, as notas e sua classificao final.
Notas: 2,3; 3,4; 0,0; 5,6; 6,1; 2,5; 2,5; 3,5; 3,7
Classificao: 8; 5; 9; 2; 1; 7; 7; 4; 3
Observando-se as duas linhas ao mesmo tempo, indiquei que quem tirou 6,1 ficou no primeiro lugar,
quem tirou 5,6 ficou em segundo lugar, quem tirou 2,5 ficou em stimo lugar, etc...
Quando a lista de notas grande, a classificao fica penosa,difcil, sujeita a erros.
J recorri a outras fontes sem resultados.
Teria a Central de Help em Excel / VBA como solucionar este caso ?

Soluo 38 (010299S1Q38)
Tudo o que se indicar abaixo, a ttulo de exemplo, se aplica integralmente a qualquer range de dados.
(Soluo interativa)
1.Escreva suas 9 notas no range b6:b14
2.Escreva em c6 a frmula : {=sum(if(b6>=$b$6:$b$14;1))} e arraste-a at c14
3.Em c3 escreva =Min($c$6:$c$14)
4.Em d6 escreva a frmula =b6-Min($c$6:$c$14) e arraste at d14
5.Em e6 escreva a formula {=sum(if(d6<=$d$6:$d$14;1))} e arraste at e14
Os valores no range e6:e14 correspondero classificao sem o perigo de erros.
Obs : No se esquea do Ctrl Shift Enter
Caso V.Sa queira fazer um programa, leve em conta as seguintes observaes :
1.O range b6:bn tem as caractersticas de um range dinmico, capaz de espichar
ou de encolher dependendo do numero de notas lanadas. O numero de notas
lanadas por sua vez tambem no igual ao de alunos de mesma classe, pois pode ocorrer faltas aos
exames.
2.Para resolver o problema do range dinmico :
1)em sheet1 selecione os dados na coluna b (b6:bn)
2)<Insert <Name <Define
Name: RangeDinamico
Refers to: =Offset(Sheet1!$b$6;0;0;CountA(Sheet1!$B:$B);1))
<Add <OK
3.Em module1 escreva a rotina :

Sub ClassificandoNotas( )
Worksheets(1).Select
RangeDinamico.Select
....Neste ponto escreva o que for necessrio.
End

Questo 39 (010299Q39)
Na coluna B a partir de b5, tenho valores numricos, textos e vazios(clulas que no foram
preenchidas) se alternando. Quero selecionar nessa coluna B tudo que estiver entre b5 e a ltima
clula preenchida, sobre a qual no tenho detalhes. Isto possvel? Se positivo, peo a Central de Help
em Excel / VBA que me instrua a respeito. Desde j fico grato pela colaborao.

Soluo 39 (010299S1Q39)
Sub SelecionandoNaCol( )
...........iniciando seu programa
Range("b5", Cells(Cells.SpecialCells(xlLastCell).Row, 2)).Select
.............
End

Questo 24 (190199Q24)
Na minha Folha de Dados, quero identificar se determinado elemento numrico ou alfanumrico.
Como proceder ?
Como saber tambem se deteminada clula contem uma frmula ?

Soluo 24 (190199S1Q24)
Respondendo a primeira pergunta, introduza o segmento abaixo em seu programa
Cells(x,y).Select
If IsNumeric(ActiveCell) = True Then
MsgBox "Celula contendo Numerico"
Else
MsgBox "Celula contendo Dado no Numrico"
End If

Soluo 24 (190199S2Q24)
Respondendo a segunda pergunta, introduza o segmento abaixo no seu programa

Cells(x,y).Select
If Instr(ActiveCell, "=") <> 0 Then
MsgBox "Esta Celula contem uma Frmula"
MsgBox ActiveCell.Address 'Localizando a Frmula
End If

Questo 25 (190199Q25)
Quero acionar uma Rotina em VBA usando as teclas Alt + a.
Isso possvel ?

Soluo 25 (190199S1Q25)
Sim, possvel. Na rotina Trap( ) voce deve indicar que combinao de teclas usar para acionar
"ExecutoARotinaOK"
Transcreva as rotinas abaixo e na Planilha (Sheet1) por exemplo acione Alt + a (Mantendo a tecla Alt
calcada, acione a tecla a)
Sub Trap( )
Worksheets(1).Select
Application.OnKey "%a", "ExecutoARotinaOK"
End Sub
Sub ExecutoARotinaOK( )

MsgBox "OK"
End Sub

Questo 26 (190199Q26)
Quero construir uma ListBox contendo os nomes dos estados do Brasil.
Como Proceder ?

Soluo 26 (190199S1Q26)
Escreva os nomes dos Estados numa nica coluna (exemplo "a3:a26" ),
em seguida faa :

<View; <Toolbars; <Forms; <ListBoxes ><Format Control ;


<Input Range: a3:a26
<Cell Link : "A1" (escolha A1 para Cell Link)
Notas :
< (este sinal indica que voce est acionando o boto esquerdo do mouse)
> (este sinal indica que voce est acionando o boto direito do mouse)
Na caixa de dilogo Input Range escreva a2:a25
Na caixa de dilogo Cell Link escreva A1

Questo 27 (190199Q27)
A minha Planilha contem valores numricos no range a5:a300. Quero testar algumas rotinas tomando
por base os valores iguais ou acima de 500
Primeiro : Quero que esses valores especiais mudem de cor e sejam formatados com duas casas
decimais
Segundo : No s mudem de cor mas assumam o formato ITALICO e fiquem em Negrito

Soluo 27 (190199S1Q27)
Respondendo a Primeira pergunta
Option Explicit 'Declare todas as Variveis
Const Blue = 5 'Usando Constantes em Visual Basic
Const Red = 3
Const Green = 4
Const Yellow = 6
Sub MudandoDeCor( )
Dim CellObject as Object 'Definindo a varivel CellObject
ActiveSheet.Range("a5:a300").Select 'Selecionando o Range
For each CellObject in Selection
If CellObject.Value >=500 Then
CellObject.NumberFormat = "0.00"
CellObject.Font.ColorIndex = 7
End if
Next
End Sub
Respondendo a Segunda pergunta
Option Explicit
Const Blue = 5
Const Red = 3
Const Green = 4
Const Yellow = 6
Sub xMudandoDeCor ( )
Dim CellObject as Object
ActiveSheet.Range("a5:a300").Select
For each CellObject in Selection

If CellObject.Value >=500 Then


With CellObject.Font
.ColorIndex = 7
.Bold = True
.Italic = True
End With
End If
Next
End Sub

Questo 28 (190199Q28)
Originalmente na minha Planilha, deixamos em branco grande quantidade de dados . Para indicar
referidos claros usei (*).
Agora quero que tudo que for (*) seja transformado em Zero.
Usei <Edit <Replace Find What: * Replace With: 0 e o que ocorreu que a planilha inteira foi zerada
porque o Excel entendeu que quando escrevi "*" estava indicando "qualquer dado". Como proceder
nestes casos ?

Soluo 28 (190199S1Q28)
Faa o seguinte :
Edit Replace Find What: * Replace With: ~ Search By:
Columns Replace: All

Questo 29 (190199Q29)
No Range b5:b12 tenho os seguintes valores :120,100,150,250,340, 120,200 e 100. Desses meus oito
valores, dois esto repetidos : 100 e 120. Ento, na realidade meu range tem apenas 6(seis) valores
diferentes.
Seria possivel o EXCEL me fornecer o nmero de valores diferentes encontrados num Range ?

Soluo 29 (190199S1Q29)
possvel. Escreva em b15 :
=Sum( If ( Countif (b5:b12 ; b5:b12) =1; 1; 1/Countif (b5:b12 ; b5:b12 ) ) )
mas ao invs de Enter use Ctrl Shift Enter
Settings : No meu equipamento (;) o separador de listas

Questo 30 (190199Q30)
Minha planilha tem dois botes de comando (btn1 e btn2). Ao acionar o boto 1 quero que a rotina X
seja executada. Da mesma forma, ao
acionar o boto 2 quero que a rotina Y seja executada. Gostaria de usar a estrutura Select Case. Como
resolver ?

Soluo 30 (190199S1Q30)
Vamos supor que as rotinas a serem chamadas so :
Chamada1( ) e Chamada2( ) as quais transcrevemos abaixo.
Transcreva QuemChamou( ) para seu mdulo. Basta agora ativar btn1 ou btn2
Sub QuemChamou( )
Select Case Application.Caller
Case "btn1"
myRoutine = Application.Run("Chamada1")
Case "btn2"
myRoutine = Application.Run("Chamada2")
End Select

End Sub
Sub Chamada1( )
MsgBox "SSS"
End Sub
Sub Chamada2( )
MsgBox "XXX"
End Sub
Notas:
Ao introduzir objetos numa Planilha, o Excel lhes aplica nomes.
Voce deve ter o cuidado de trocar esses nomes para btn1 e btn2.
Atribua (Assign) a Macro QuemChamou() aos dois botes btn1 e btn2
Ativando btn1 ou btn2 as macros Chamada1() ou Chamada2() sero executadas

Questo 18 (110199Q18)
Minha Planilha ("Informx") no range a1:k5000 contem celulas com informaes importantes que eu
costumo destacar alterando-lhes a cor do fundo.
"Pinto-as" de vermelho.
Estas informaes esto "espalhadas" de uma forma desordenada em linhas e colunas no range citado.
H linhas com uma, ou mais de uma clula com interior vermelho, assim como h linhas sem que
nenhuma clula esteja demarcada.
O uso das facilidades "AutoFilter ou Advanced Filter" pouco me acrescentam para investigar que
clulas esto pintadas de vermelho.
Como resolver o impasse para mostrar-me apenas as linhas que possuem clulas marcadas "pintadas"
de vermelho?

Soluo 18 (110199S1Q18)
Sub MostrandoCelulasEmFundoVermelho( )
Dim MeuRange as Range
Dim Celula as Range, Linha as Range
Worksheets("Informx").Select
'A variavel MeuRange abaixo est apontando para o range 'a1:k5000
Set MeuRange = ActiveSheet.Range("a1:k5000")
'Acelerando a pesquisa desconectando a atualizao da Tela
Application.ScreenUpdating = False
'Escondendo as linhas do range a1:k5000
MeuRange.EntireRow.Hidden = True
'Iniciando a pesquisa em cada linha do range MeuRange
For Each mLinha In MeuRange.Rows
'Iniciando a pesquisa em cada celula de uma mesma linha
For Each Celula In mLinha.Cells
If Celula.Interior.ColorIndex = 6 Then
Celula.EntireRow.Hidden = False
Exit For
End If
Next
Next
'Desfazendo a Atualizao da Tela
Application.ScreenUpdating = True
End Sub

Questo 19 (110199Q19)
Como criar Menus em VBA de tal forma que eu possa acionar minhas duas Rotinas (uma de
Importao e outra de Exportao)

Soluo 19 (110199S1Q19)
Sub IntroduzMenusESubMenus( )
Set MBarraDeMenus = CommandBars.ActiveMenuBar
'===As instrues abaixo introduzem novo Menu na
'===Barra de Menus : "Importao /Exportao"
Set novoMenu = MBarraDeMenus.Controls.Add _

(Type:=msoControlPopup, Temporary:=True)
novoMenu.Caption = "Importao/Exportao"
'===Criando os SubMenus Controle1 e Controle2:
Set Controle1 = novoMenu.CommandBar.Controls.Add _
(Type:=msoControlButton, Id:=1)
Set Controle2 = novoMenu.CommandBar.Controls.Add _
(Type:=msoControlButton, Id:=1)
'===Agora temos o SubMenu "Importao"
Controle1.Caption = "Importao"
Controle1.OnAction = "ExecutaRotina1"
'===Agora temos o SubMenu "Exportao"
Controle2.Caption = "Exportao"
Controle2.OnAction = "ExecutaRotina2"
End Sub
Sub ExecutaRotina1( )
'===Introduza o cdigo
MsgBox "Executando a Rotina de Importao"
End Sub
Sub ExecutaRotina2( )
'===Introduza o cdigo
MsgBox "Executando a Rotina de Exportao"
End Sub

Questo 20 (110199Q20)
O arquivo AA.xls; Sheet1 contem uma frmula em A11
possivel ler esta frmula sem que eu abra o referido arquivo ?

Soluo 20 (110199S1Q20)
Sim possivel. Faa :
Sub LendoSemAbrir( )
Range("A11").Formula = "=[AA.xls]" & "Sheet1" & "!A1"
End Sub

Questo 21 (110199Q21)
Em determinada clula da minha Planilha h Comentrios.
Pergunto como posso identificar se uma celula contem ou no Comentrios ?

Soluo 21 (110199S1Q21)
Sub VeComentario( )
On Error Resume Next
Set Com = ActiveCell.Comment
If Com Is Nothing Then
MsgBox "No h Comentrios", vbExclamation
Else
MsgBox "O comentrio :" & Com.Text, vbExclamation
End If
End Sub

Questo 22 (110199Q22)
Minha Coluna C contem valores numricos inteiros. Preciso fazer um Sort nessa Coluna e mais tarde
voltar atrs, desfazendo esse Sort.
Ativando o Recorder, Sorteando a Coluna de Dados e aplicando Undo a Macro no se completa. Como
resolver o problema usando o VBA ?

Soluo 22 (110199S1Q22)
Estamos supondo seus dados no range C2:Cn
Adicione a Coluna Dummie B adjacente sua Coluna de dados.
Essa coluna B dever conter a srie de valores 1,2,3,4,5...etc
no range B2:Bn
Selecione as colunas B:C e execute a macro abaixo que prescinde
Da funo UNDO.

Sub SortDesfazSort( )
Selection.Sort Key1:=_
Range("C2"), Order1:=xlAscending, Key2:=Range("B2"), _
Order2:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:= False, Orientation:=xlTopToBottom
'[insira seu cdigo complementar]
Selection.Sort Key1:=_
Range("B2"), Order1:=xlAscending, Key2:=Range("C2"), _
Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, _
MatchCase:= False, Orientation:=xlTopToBottom
End Sub

Questo 23 (110199Q23)
Minha coluna A Range("a1:an") contem valores das cotaes de determinada Ao. Quero traar um
grfico linear de tal forma que quando o valor da ao cair a linha deve ficar vermelha, e quando a
ao subir a linha deve ficar verde.

Soluo 23 (110199S1Q23)
Sub ColorLine( )
ActiveSheet.ChartObjects("Chart 1").Activate
AChart = ActiveChart.SeriesCollection(1).Values
For i = 2 To ActiveChart.SeriesCollection(1).Points.Count
With ActiveChart.SeriesCollection(1).Points(i).Border
If AChart(i) >= AChart(i - 1) Then
.Color = RGB(0, 255, 0)
Else
.Color = RGB(255, 0, 0)
End If
End With
Next
End Sub

Questo 11(040199Q11)
Quero preparar para o meu Cliente uma Worksheet com vrias CheckBoxes.
Para deflagrar a tarefa A, ele precisar ativar as CheckBoxes (x, z e w)
Para deflagrar a tarefa B, ele precisar ativar as CheckBoxes (s e g) e assim por diante.
Pergunta : possvel identificar a linha correspondente a uma CheckBox que acabou de ser ativada ?

Soluo 11(040199S1Q11)
Sim possvel. Tente a macro abaixo:

Sub Qual_Linha( )
Linha = ActiveSheet.CheckBoxes(Application.Caller).TopLeftCell.Row
MsgBox "Voce Selecionou a CheckBox da Linha : " & _
Linha, vbExclamation
End Sub

Questo 12 (040199Q12)
Minha planilha contem duas colunas adjacentes. Uma coluna contem cdigos.
A outra coluna contem Valores em Reais. No h linhas em branco.
Os cdigos diferem no nmero de caracteres. Alem disso h cdigos repetidos, mas no possvel
dizer a priori quantos cdigos diferentes h, nem quantos elementos h relativamente a cada cdigo.
possvel programar-se a obteno
de subtotais ?

Soluo 12 (040199S1Q12)
H trs respostas possveis para sua questo.
O numero de caracteres do cdigo no relevante. O que importa que cdigos iguais pertencentes
ao mesmo grupo formem blocos. Aplicar um Data Sort na sua tabela deve ser ento o primeiro passo.
Mostrando a Tabela
se voce quer obter Subtotais relativamente a cada grupo de cdigos e um Total Geral escreva :
.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2)

Soluo 12 (040199S2Q12)
Escondendo a Tabela
Se voce quer mostrar apenas os Subtotais por grupo de cdigos e um Total Geral relativamente a
soma do conjunto escreva :
.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2)
.Parent.Outline.ShowLevels RowLevels:=2

Soluo 12 (040199S3Q12)
Escondendo a Tabela
Se voce quer obter somente um SubTotal relativamente ao conjunto, sem levar em conta os cdigos
escreva :

.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2)


.Parent.Outline.ShowLevels RowLevels:=1

Imaginemos que na sua tabela (na Sheet1), as clulas B4 e C4 contenha os Labels (Cdigo, Valor em
Reais) e os demais dados estejam no range B5:Cn (onde n indeterminado). A rotina abaixo lhe
servir de guia :
Sub TestandoSubTotais( )
Worksheets(1).Activate
Cells(4, 2).Select
With Worksheets(1).Cells(4, 2).CurrentRegion
.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2)
End With
End Sub

Questo 13 (040199Q13)
Como fazer com que a clula A1 apresente o meu diretrio ?

Soluo 13 (040199S1Q13)
possivel escrever :

NomeAnterior = "C:"
NomeAtual = "C:"
Name NomeAnterior As NomeAtual ' Move o arquivo e Renomeia
Respondendo sua questo :
testePath( )
x = CurDir("C")
Cells(1, 1).Value = x 'retornar C:
MsgBox x, vbExclamation
End Sub

Questo 14 (040199Q14)
Quero somar os valores constantes do range C3:C27800 e obter o resultado na clula C2. Usei a
expresso abaixo, mas no obtive sucesso. Onde est o meu rro ?
Range("c2").Value = Application.WorksheetFunction.Sum("c3:c27800")

Soluo 14 (040199S1Q14)
Modifique sua expresso para :
Range("c2").Value = Application._ WorksheetFunction.Sum(Range("c3:c27800"))

Questo 15 (040199Q15)
Como obter os valores:
(a) 1,5 escrito como texto em a10 (alinhado esquerda)
(b) "1,5" entre aspas duplas em a11
(c) 1,5 escrito como valor numrico em a12 (alinhado direita)
(d) =1,5 escrito como frmula em a13

Soluo 15 (040199S1Q15)
1.Usamos o caracter (,) como separador de casas decimais(WindowsSettings como nosso
equipamento est configurado).
2.Quando se escreve 1.5 em VBA obtem-se o numrico 1,5 em EXCEL Cells(n,1).Select 'Substitua n
por 10,11,12,13 em cada um dos casos
ActiveCell.Value = X
Onde :
(a) n = 10, X = "1,5"
(b) n = 11, X = " ""1,5"" "
(c) n = 12, X = "1.5" ou X = 1.5
(d) n = 13, X = "=1.5"

Questo 16 (040199Q16)
Provavelmente (cometi algum rro) perdi meu trabalho. No consigo saber quais eram as Sheets que o
mesmo continha. possivel usar o Windows Explorer ?
H algum modo para contornar essa situao ?

Soluo 16 (040199S1Q16)
possvel, mas voce no encontrar no Windows Explorer Properties as informaes que precisa.
Tente no entanto :
Com File Open aponte para o arquivo corrompido selecionando-o sem tentar abri-lo.
Com o Mouse direito ative "Properties", o Excel deflagra uma caixa de dilogo com 5 tabs. Ative a tab
"Contents" e voce ver as sheets e dialogSheets do arquivo corrompido.

Questo 17 (040199Q17)
Preciso saber quantos valores h nas colunas A(range(a1:a65)), B(range(b1:b100)) e na coluna C
(range(c1:c185)) que satisfaam a condio : Maiores que 50. No tocante aos ranges, dou preferncia
a frmulas que usem indices.

Soluo 17 (040199S1Q17)
A funo Dcount pede trs argumentos : Range, Field e Criteria. Como h preferncia por expresses
com ndices, sugerimos usar tambem a funo Indirect embutida conforme explicamos abaixo :
Escreva em h1:h3 respectivamente : a1:a65, b1:b100 e c1:c185
para referir-se aos ranges das colunas A,B e C
Escreva em i1:i3 respectivamente : RangeA, RangeB e RangeC
para referir-se aos Labels das colunas A, B e C
Escreva em e2 : >50 (que parte do Critrio de Pesquisa)
Escreva em e1 : =indirect("i1")
e em e10 calcule =Dcount(Indirect(h1); Indirect("i1"); e1:e2)
lhe retorna quantos valores h na coluna A que superam 50
Reescreva
e1 : =indirect("i2")
e em e11 calcule
=Dcount(Indirect(h2); Indirect("i2"); e1:e2)
lhe retorna quantos valores h na coluna B que superam 50
Reescreva e1 : =indirect("i3")
e em e12 calcule
=Dcount(Indirect(h3); Indirect("i3"); e1:e2) lhe retorna quantos valores h
na coluna C que superam 50

Questo 1(231298Q1) :
Preciso fazer certos calculos tendo como ponto de partida a hora atual mais 5 segundos. Meu problema
como acrescentar esses 5 segundos ?

Soluo 1(231298S1Q1):
Crie uma varivel e chame-a por exemplo de NovoTempo.
Faa ento :

Function Sub NovoTempo(x as string)


NovoTempo = Now( ) + TimeValue(x)
End function

Selecione uma clula qualquer da planilha


e escreva =NovoTempo("00:00:05")

Soluo 2(231298S2Q1)
Se voce quiser acionar uma rotina decorridos 05 segundos faa :
Sub Inicio( )
MsgBox "Al Brasil"
Application.OnTime Now + TimeValue("00:00:05"), _ Decorridos5Segundos"
End Sub
Sub Decorridos5Segundos()
MsgBox "Feliz Ano Novo"
End Sub
A mensagem "Feliz Ano Novo" ser apresentada 5 segundos
aps voce ter executado a rotina Inicio( )

Questo 2 (231298Q2)
Ao cabo da minha rotina quero acrescentar um som de forma a alertar o usurio de que o programa
chegou ao fim. Isso possvel ?

Soluo 2(231298S1Q2) :
Declare function sndplaysound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal lpszSoundName As String, ByVal uFlags as Long) as Long
Sub TestandoSom( )
Call sndplaysound ("c:.wav",0)
End Sub

Questo 3 (231298Q3)
Meu projeto compreende vrias Worksheets. possivel acrescentar uma nova Worksheet de tal forma
que se posicione aps a ltima ?

Soluo 3(231298S1Q3)
Tudo bem se voce estiver usando a ltima verso do Excel.
Neste caso use o mtodo Count, que contar o numero de worksheets no seu Workbook. Se o seu
Workbook contem por exemplo 3 Worksheets ento Worksheets.Count ser igual a 3 e portanto
Worksheets(Worksheets.Count) ser o mesmo que escrever Worksheets(3)
Insira no seu programa a instruo :
Worksheets.Add. Move After:=Worksheets(Worksheets.Count)

Questo 4(231298Q4)
Tenho quatro arquivos. Para simplificar vamos chama-los de AA.xls, BB.xls, CC.xls e DD.xls. Executo
uma macro para o arquivo AA.xls. Fao o mesmo em relao ao arquivo BB.xls. Grupo os resultados
obtidos quando abro o arquivo CC.xls. O arquivo DD.xls importa os dados anteriores e executa outra
srie de calculos. Este processo, alem de demorado trabalhoso. possivel fazer um programa que
execute o mesmo servio sem interrupo ?

Soluo 4(231298S1Q4)
Suponhamos que a macro que manipula os dados do arquivo AA.xls seja a macro MacroAA, da mesma
forma, seja MacroBB a macro que manipula
os dados do arquivo BB.xls, e assim por diante.
Suponhamos que seus arquivos AA.xls ... DD.xls esto no diretrio C:Documents
Abra um novo arquivo (NovoArquivo.xls) e use como modelo de desenvolvimento a macro
TestandoOperao( ) que abre o arquivo AA.xls
faz os clculos necessrios e fecha o arquivo quando conclui o servio.
O modlo abaixo para o arquivo AA.xls deve ser extendido aos demais arquivos.
Sub TestandoOperao( )
Dim Arquivo as string, diretorio as String
Arquivo = "AA.xls"
diretorio = "C:Documents"
Workbooks.Open diretorio & Arquivo
Application.Run Macro:=Arquivo + "!MacroAA"
Windows(Arquivo).Close
End Sub

Questo 5(231298Q5)
Tenho uma coluna com datas na forma dia/mes/ano. Preciso escrever na coluna ao lado o dia da
semana e o numero de ocorrncias desse dia no mes.

Exemplificando : 28/05/98 ; Quinta Feira; 5 (onde o valor 5 indica que nesse mes de maio tivemos 5
Quintas Feiras at o dia 28)

Soluo 5(231298S1Q5)
Supondo que B:B seja sua coluna de datas e que sua primeira data est em b4
escreva em c4 : = text(b4, "dddd") (que lhe devolve Quinta Feira)
escreva em d4 : =int(day(b4)/7 + 1) (que lhe devolve 5)
Selecione c4:d4 e arraste enquanto houver dados na coluna B

Questo 6(231298Q6) :
Como posso ter acesso a uma constante que foi declarada em outro arquivo .xls ?

Soluo 6(231298S1Q6):
Ao declarar a constante X como Public no arquivo AAA.xls, voce poder acess-la de qualquer mdulo
desde que nesse mesmo arquivo AAA.xls. Mas no lhe ser possvel acessa-la se voce estiver num dos
mdulos do arquivo BBB.xls.

Questo 7(231298Q7)
Numa coluna com 500 valores numricos preciso fazer uma soma complexa, ou seja somar valores
que atendam a diferentes critrios. Somar por exemplo os valores da coluna B quando aqueles da
coluna A superarem 200 subtraindo esse resultado dos valores da coluna B quando aqueles da coluna
A forem inferiores a 53. Isso possivel ?

Soluo 7(231298S1Q7)
Sim, possvel : Supondo seus dados no range a1:a500 escreva ento a frmula :
=sumif(a1:a500; criterio1 ; b1:b500) (Expresso A)
ir somar os valores da coluna B todas as vezes que os valores da coluna A superarem 200
=sumif(a1:a500; criterio2 ; b1:b500) (Expresso B)
ir somar os valores da coluna B todas as vezes que os valores da coluna A no superarem 53
criterio1 ">200" e criterio2 "<=53" Calcule ento :
ExpressoA - Expresso B
Satisfeito ?

Questo 8(231298Q8) :
Seria possivel escrever-se uma rotina que elimine da minha planilha os textos, mantendo no entanto
as datas e demais valores numricos ?

Soluo 8(231298S1Q8):
Sub EliminaTextos( )
Worksheets("Sheet1").Select
On Error GoTo fim
With Columns
.SpecialCells(xlTextValues,xlConstants).ClearContents
End with
fim:
Exit Sub
End Sub

Questo 9(231298Q9) :
Na coluna A, no range A1:An disponho de caracteres numricos sob a forma de strings. Tenho ento
dois problemas a resolver :

a)preciso converter os strings em nmeros para operar com os mesmos


b)o range a1:an variavel de forma que n pode assumir quaisquer valores.
Exemplificando : n pode assumir a sequencia de valores 15; 150; 76 ... resultando nos ranges
a1:a15(n = 15) ; a1:a150(n =150) ; a1:a76(n=76) ; etc...
Como solucionar esse problema.

Soluo 9(231298S1Q9):
O range a1:an tem as caractersticas de um range dinmico, capaz de espichar ou de encolher.
Para resolver o problema do range dinmico :
1)em sheet1 selecione os dados na coluna A (A1:An)
2)<Insert <Name <Define
Name: RngDyn ser o nome do range;
Refers to: =Offset(Sheet1!$A$1;0;0;COUNTA(sheet1!$A:$A);1)
<Add <OK
Em module1 escreva a rotina :
Sub TransfSeuString( )
Worksheets(1).Select
RngDyn.Select
For Each Cell in Selection
Cell.Value = CDBL(cell.value)
Next
End Sub

Questo10(231298Q10) :
Tenho 7 Worksheets na seguinte ordem:
Worksheets(1) = Sheet7, Worksheets(2) = Sheet6, Worksheets(3) = Sheet5, Worksheets(4) =
Sheet4, Worksheets(5) = Sheet1, Worksheets(6) = Sheet2, Worksheets(7) = Sheet3
Como selecionar todas as Worksheets a partir da Worksheets(4) ?
A Proc abaixo no faz exatamente o que eu quero. Onde est o rro ?
Sub SelecionandoTeste( )
Dim i As Integer
prim = 4
With ActiveWorkbook
For i = prim To .Worksheets.Count
.Worksheets(i).Select
Next
End With
End Sub

Soluo10(231298S1Q10)
Sua Proc seleciona somente a ltima Worksheet. e no todas as Worksheets (a partir da Quarta) como
voce deseja
Para selecionar todas as Worksheets a partir da quarta, a linha de comando .Worksheets(i).Select deve
ser reescrita como .Worksheets(i).Select (i=prim)

Outra Soluo10(231298S2Q10)
Sub testandoSeleo( )
Dim MeuArray, c As Integer, i As Integer
c = ActiveWorkbook.Sheets.Count
ReDim MeuArray(4 To c)
For i = 4 To c
MeuArray(i) = i
Next i
Sheets(MeuArray).Select
End Sub

Outra Soluo10(231298S3Q10)
Sub XTesteSeleo( )
VamosSelecionar ActiveWorkbook, 4
End Sub
Sub VamosSelecionar(wb As Workbook, ByVal MeuIndice As Integer)
Dim sh As Worksheet
wb.Worksheets(MeuIndice).Select
For Each sh In wb.Worksheets
If sh.Index >= MeuIndice Then sh.Select False
Next
End Sub

Questo 59 (07032000Q59)
Quero fazer uma macro de forma que me apresente o endereo de determinada coluna. Por exemplo
se a clula ativa for b2 a macro dever apresentar o resultado $b:$b

Soluo 59 (07032000S1Q59)
Supondo que a clula ativa c2 a macro abaixo soluciona a questo.
Sub MostraEndereo( )
Dim msg$, rcell As Range , rEcolumn As Range
Dim rColumnRange As Range
Set rcell = ThisWorkbook.Worksheets(1).Range("$c$2")
Set rEcolumn = rcell.Parent.Cells.EntireColumn(rcell.Column)
MsgBox rEcolumn(1).Address , , O Range :
End Sub
Sendo b2 a clula ativa a macro abaixo apresenta o endereo da clula b1 e o endereo da coluna da
clula ativa
Sub MostraEnderecos( )
Dim msg$ rcell As Range , rEcolumn As Range
Set rcell = ThisWorkbook.Worksheets(1).Range("$b$2")
Set rColumnRange = ThisWorkbook.Worksheets(1).Range("$b:$b")
Set rEcolumn = rcell.Parent.Cells.EntireColumn(rcell.Column)
msg = msg & "rColumnRange(1):" & rColumnRange(1).Address & vbCr
msg = msg & "rEcolumn (1):" & rEcolumn(1).Address & vbCr
MsgBox msg, , "Respostas : "
End Sub

Você também pode gostar