

✔ VBA Excel Specialist® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog podem ser tratados como consultoria freelance. Contate-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.



Crie um Combobox
Os usuários da versões Excel 2010 e Excel 2007 podem clicar em Inserir a partir da aba Desenvolvedor, clicando no Combo Box na seção de Controles ActiveX.
Agora desenhe o combo Box na sua planilha:
Para adicionar itens ao seu combobox, execute os seguintes passos.
1. Adicione o código abaixo na área de código de abertura da sua planilha (Workbook Open event), ou o adicione a outro módulo do seu código.
With Sheet1.ComboBox1.AddItem "Paris".AddItem "New York".AddItem "London"End With
Nota: Use Sheet2 se o seu combobox estiver localizado na sua segunda worksheet.
Resultado:
Nível da implementação: Intermediário.Versão em que foi testada: 2000 - 2013.Descrição: Um combobox é disponibilizado com 10 linhas e treze colunas de informação.
Segue o 1º exemplo:
Option ExplicitPrivate Sub UserForm_activate()
Dim MyList(10, 10) 'Definindo como array.' O combobox neste exemplo contém 3 colunas - Implemente quantas colunas desejarWith ComboBox1
.ColumnCount = 3.ColumnWidths = 75.Width = 220.Height = 15.ListRows = 6
End With' Definindo tanto a lista como o local de onde obter os dados (Colunas A, D, G)With ActiveSheet
' MyList (Linha{0 to 9}, Coluna{primeira}) = (Coluna A neste exemplo) ' Não se esqueça de continuar acrescentando para LINHA e COLUNA ' iniciando do zero Não de um MyList(0, 0) = .Range("A1")MyList(1, 0) = .Range("A2")MyList(2, 0) = .Range("A3")MyList(3, 0) = .Range("A4")MyList(4, 0) = .Range("A5")MyList(5, 0) = .Range("A6")MyList(6, 0) = .Range("A7")MyList(7, 0) = .Range("A8")MyList(8, 0) = .Range("A9")MyList(9, 0) = .Range("A10")' MyList (Linha {0 to 9}, Coluna{segunda}) = (Coluna D neste exemplo) MyList(0, 1) = .Range("D1")MyList(1, 1) = .Range("D2")MyList(2, 1) = .Range("D3")MyList(3, 1) = .Range("D4")MyList(4, 1) = .Range("D5")MyList(5, 1) = .Range("D6")MyList(6, 1) = .Range("D7")MyList(7, 1) = .Range("D8")MyList(8, 1) = .Range("D9")MyList(9, 1) = .Range("D10")' MyList (Linha {0 to 9}, Coluna {Terceira}) = (Coluna G neste exemplo) MyList(0, 2) = .Range("G1")MyList(1, 2) = .Range("G2")MyList(2, 2) = .Range("G3")MyList(3, 2) = .Range("G4")MyList(4, 2) = .Range("G5")MyList(5, 2) = .Range("G6")MyList(6, 2) = .Range("G7")MyList(7, 2) = .Range("G8")MyList(8, 2) = .Range("G9")MyList(9, 2) = .Range("G10")
End With' Agora populamos o ComboboxComboBox1.List() = MyList
End SubComo usar:
Abra uma planilha MS ExcelSelecione Editor Visual Basic (Tools/Macro/Visual Basic Editor)Na janela do editor VBA (VBE window), selecione Insert/UserFormSelecione ComboBox a partir da caixa de ferramentas (toolbox), cole-o no FormulárioClique o botão direito do mouse no formulárioSelecione Inserir códigoEntão copie e cole o código acimaTestando o código:Digite alguns dados nas colunas A, D e G na planilhaExiba o formulário novamente, agora verá as três colunas preenchidas no Combobox
Segue o 2º exemplo:
Populando o controle:Option ExplicitPrivate Sub UserForm_Initialize()With Me.ComboBox1.AddItem "Item 1".AddItem "Item 2"End WithEnd SubPopulando a partir da seleção de um range na planilha:Option ExplicitPrivate Sub CommandButton1_Click()With Sheet1 'code name.Range("A1") = Me.ComboBox1.ValueEnd WithEnd Sub
Outro:Private Sub UserForm_Initialize()With Worksheets("Sheet1")ComboBox1.List = .Range("A1:A" & .Range("A" & .Rows.Count).End(xlUp).Row).ValueEnd WithEnd Sub


Option ExplicitFunction SheetsAlphaSort()' Author: Date: Contact:' André Bernardes 13/10/2008 11:07 bernardess@gmail.com' Ordena de forma alfabética todas as pastas em uma planilha MS Excel.Dim i As IntegerDim j As IntegerDim PrimPastaOrdenar As IntegerDim UltiPastaOrdenar As IntegerDim DescrescOrdem As BooleanLet DescrescOrdem = FalseIf ActiveWindow.SelectedSheets.Count = 1 Then
'Altera o 1 para o número da pasta que deseja ordenar primeiro.Let PrimPastaOrdenar = 1Let UltiPastaOrdenar = Worksheets.Count
Else
With ActiveWindow.SelectedSheets
For i = 2 To .CountIf .Item(i - 1).Index <> .Item(i).Index - 1 ThenMsgBox "Não há como ordenar PASTAS não-adjacentes!"Exit SubEnd IfNext iLet PrimPastaOrdenar = .Item(1).IndexLet UltiPastaOrdenar = .Item(.Count).Index
End With
End IfFor j = PrimPastaOrdenar To UltiPastaOrdenar
For i = j To UltiPastaOrdenar
If DescrescOrdem = True Then
If UCase(Worksheets(i).Name) > UCase(Worksheets(j).Name) Then
Worksheets(i).Move Before:=Worksheets(j)
End If
Else
If UCase(Worksheets(i).Name) < UCase(Worksheets(j).Name) Then
Worksheets(i).Move Before:=Worksheets(j)
End If
End If
Next i
Next jEnd Function


1º Option Explicit - Coloque essa expressão logo no início dos seus módulos.Isso forçará você a inicializar quaisquer variáveis que por ventura crie no seu código.Sim, você será obrigado a definir os tipos de todas as suas variáveis e assim saberá o conteúdo delas.E sim, isso lhe acrescentará um pouco de trabalho, mas o retorno será excelente, pois lhe poupará problemas como utilizar tipos diferentes de variáveis, escrever erroneamente o nome delas.O melhor de tudo? As suas rotinas serão executadas mais rapidamente.2º Idente o seu código - Adapte-se a essa ideiaA identação ajuda a compreender o fluxo de ideias que o seu código quer transmitir.A identação serve de ajuda quanto a identificar certos procedimentos no código.Ao utilizar FOR...NEXT, WHILE, IF, CASE, por exemplo, considere a identação como um modo de facilitar, em muito, a identificação destes.3º Cuidado com a expressão On Error Resume NextEsta instância faz com que o MS Excel ignore quaisquer erros e continue o processamento.Em algumas situações isso fará com que o MS Excel ignore os erros que não devem ser ignorados.Imagine só, talvez existam erros no seu código que sequer tenha percebido, por causa deste comando.4º Use comentários, não economize com eles.Nada pode ser mais frustrante do que ao revisitar um código desenvolvido a uns meses e perceber que não deixou ali nenhuma "cola" para ajudar no seu trabalho.Não tenha preguiça, adicione alguns comentários para descrever sua lógica, isso poderá lhe poupar muito tempo em eventuais manutenções que requeiram velocidade.5º Codifique SimplificadamenteEscreva os seus códigos em módulos pequenos.Escreva-os de forma simples, direta e bem definida.Torne rápido uma posterior compreensão por parte de outros analistas e programadores.6º Não envergonhe - se: Use o gravador de MacrosO gravado de macro é o professor ideal para muitos que estão aprendendo a programar.Analise o modo como soluciona certos procedimentos corriqueiros.Poupe muito tempo!7º A primeira solução talvez não seja a melhorEste é um excelente hábito para se tornar um excelente desenvolvedor.Considere soluções diferentes para o mesmo problema.Não é raro demorarmos para implementar uma solução que não se adeqüa muito bem a aplicação como um todo, mas resolve momentaneamente o nosso problema.Sim, olhe para o lado e desenvolva algo, muitas vezes, totalmente diferente da sua primeira solução. Tal código provavelmente se encaixará melhor na solução total da aplicação.Gastarei mais um pouco de tempo neste tópico para compartilhar alguns aos de experiência:Quando nossas mentes estão sobrecarregadas com a pressão da entrega do projeto e ao mesmo tempo dividida com o desenvolvimento técnico do algoritmo, certamente não ficaremos tão absortos quanto gostaríamos.Muito provavelmente os nossos cérebros estejam focados em terminar o projeto e não em ter as melhores e mais amplas considerações.O mais importante é usar as suas melhores ideias e não necessariamente as primeiras ideias.Volte e transforme o seu resultado final em algo melhor - Quando tiver ultrapassado o estágio final da entrega, volte-se para os códigos que envolvem o kernel da nossa aplicação.Será que usei a melhor solução?Tive chance de ver outros códigos desenvolvidos com essa preocupação?Há uma harmonia geral deste com o todo?Sim, ninguém fará isso por você! Desenvolva essa auto disciplina para voltar e melhorar um código que poderá trazer transtornos no futuro, por não ter sido tão abrangente, ou cuidado.8º Fique amigo do DebugadorO debugador é uma excelente ferramenta quando usada plenamente.Habitue-se a consultar o help e aprender tudo o que pode retirar do debugador.Poupará muito tempo!9º Reutilize blocos de códigoNão há vergonha alguma em reutilizar bons e eficazes códigos.Obviamente devemos ter o cuidado de zerar todas as variáveis utilizadas, assim que finalizarmos a utilização deste.Isso tornará o seu código final menor e mais acessível.Nos tornaremos desenvolvedores melhores, pois os nossos códigos tenderão a ser mais lógicos e amplos. Não serão soluções fechadas e específicas, aderindo apenas ao problema do momento.10º Consulte a InternetNão há como conceber que somente nós, no mundo inteiro, precisamos de uma solução, de um código, um procedimento que ninguém nunca desenvolveu ou usou.Sempre haverá um código parecido, uma necessidade similar.E sabe o melhor de tudo? Alguém com a mente aberta fez questão de compartilhar essa solução.Então, use o seu tempo para pesquisar outras fontes, elas o tornarão um desenvolvedor melhor e mais completo.Ahhh, e depois de encontrar e implementar a sua solução, divulgue-a para o máximo de pessoas que puder!Pode usar este canal, este Blog, como um meio para isso.


Private Sub Form_Open (Cancel As Integer)
' Author: Date: Contact:' André Bernardes 18/06/2008 08:21 bernardess@gmail.com' Sub de abertura do formulário.' Rastreador inserido em 25.09.2008 - 10:52.LOG.Dim ThisFormName As StringLet ThisFormName = Me.NameCall Rastrear ' Registra acesso no Log.Call ImagesPathCall SetMoldura("Logando à aplicação", " . . . ")HideAccessCloseButton ' Elimina o botão fechar na janela da aplicação do Windows.Me.LblTime.Caption = Now()Call AssenteAcesso("OF", ThisFormName, "Sys: Splash de abertura.")Call SetMoldura("", ".: A&A - In Any Place")
End Sub
Function Rastrear()
' Author: Date: Contact:' André Bernardes 25/09/2008 10:01 bernardess@gmail.com' Cria arquivo .LOGOpen Application.CurrentProject.Path & "\" & Left(Application.CurrentProject.Name, Len(Application.CurrentProject.Name) - 4) & ".log" For Append As #1Print #1, " "Print #1, "User: " & atCNames(1) & "- " & Trim(atCNames(2)), Now()Print #1, " In: " & CodeProject.FullNamePrint #1, " "Close #1
End Function

Como posso ordenar a série de dados que demonstro no meu gráfico cada vez que os respectivos dados são atualizados?
Sub RankTable()Dim chtTemp As ChartDim vntData() As VariantDim objSeries As SeriesDim lngIndex As LongDim rngSort As RangeDim lngRow As LongSet chtTemp = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).ChartReDim vntData(1 To chtTemp.SeriesCollection.Count, 1 To 2)lngIndex = 1For Each objSeries In chtTemp.SeriesCollectionvntData(lngIndex, 1) = objSeries.NamevntData(lngIndex, 2) = Application.WorksheetFunction.Index(objSeries.Values, 1, objSeries.Points.Count)lngIndex = lngIndex + 1NextSet rngSort = Range("J1").Resize(UBound(vntData) - LBound(vntData) + 1, 2)With rngSort.Value = vntData.Sort .Cells(1, 2), xlDescending, , , , , , xlNovntData = .ValueEnd WithFor lngRow = rngSort.Rows.Count To 1 Step -1chtTemp.SeriesCollection(vntData(lngRow, 1)).PlotOrder = lngRowNextEnd Sub
