VBA Access - Documentando Objetos da Aplicação MS Access - Code Documenter
ACESSE CÓDIGO ATUALIZADO PARA TODAS AS VERSÕES AQUI.
Envie seus comentários e sugestões e compartilhe este artigo!
brazilsalesforceeffectiveness@gmail.com
✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-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.

Agora desenhe o combo Box na sua planilha:
With Sheet1.ComboBox1.AddItem "Paris".AddItem "New York".AddItem "London"End With
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


Eis a solução:
Sub CreateObject()
Dim nAddress as StringDim nApplication as String
Let nAddress = ThisWorkbook.Path + ""
' Poderíamos usar para o Excel: Excel.Application
Set nApplication = CreateObject("Access.Application")
Let nApplication.Visible = False
nApplication.OpenCurrentDatabase (nAddress + "tmpRPT.accdb")
' Caso fosse Excel: a.Workbooks.Open (nAddress + "tmpRPT.xlsb")
nApplication.CloseCurrentDatabase
nApplication.Quit
Set nApplication = Nothing
End Sub


O código abaixo abrirá uma nova janela filha e colocará as janelas em cascata, abrindo as janelas para a pasta de trabalho ativa:
Sub OpenCascadeWindows()ActiveWindow.NewWindowApplication.Windows.Arrange xlArrangeStyleCascade, TrueEnd Sub
Feche a janela aberta no código anterior e restaure a janela original para um estado maximizado no Excel:
Controle a janela pai do MS Excel usando as propriedades WindowState e DisplayFullScreen do objeto ApplicationSub CloseMaximize()ActiveWindow.CloseActiveWindow.WindowState = xlMaximizedEnd Sub
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Sub ChangeExcelWindowState()Let Application.WindowState = xlMaximizedSleep 1000Let Application.WindowState = xlMinimizedSleep 1000Let Application.WindowState = xlNormalSleep 1000Let Application.DisplayFullScreen = TrueSleep 1000Let Application.DisplayFullScreen = FalseEnd Sub


Defina a propriedade DisplayAlerts como False, escondendo as caixas de diálogo padrão do MS Excel enquanto o código for executado.Configure a propriedade Interactive como False para bloquear completamente os usuários do MS Excel.Otimize a propriedade ScreenUpdating como False, ocultando as alterações executadas via código. Um dos benefícios da definição de ScreenUpdating como False é que o código anterior é executado mais rapidamente, pois o MS Excel não precisa atualizar a tela ou rolar a planilha quando células estiverem selecionadas.
Sub UserBlock()Dim cel As RangeLet Application.Cursor = xlWaitLet Application.Interactive = FalseLet Application.ScreenUpdating = False' Simulando uma ação.For Each cel In [a1:iv999]cel.SelectNext' Restaura as configurações padrãoLet Application.Interactive = TrueLet Application.ScreenUpdating = TrueLet Application.Cursor = xlDefault[a1].SelectEnd Sub

'Loop em todos os formulários:
Public Sub FormsLoopSkeleton()'Código para percorrer todo os Forms da coleção (formulários fechados).Dim myForm As AccessObjectFor Each myForm In CurrentProject.AllForms'Código visualizar os nomesDebug.Print myForm.NameNextEnd Sub'Loop em todos os relatório:Public Sub LoopThroughAllReports()Dim myReport As AccessObjectFor Each myReport In CurrentProject.AllReports''Código visualizar os nomesDebug.Print myReport.NameNextEnd Sub'Loop em todos os formulários abertos:
Public Sub LoopThroughOpenForms()Dim myForm As FormFor Each myForm In Forms'Código visualizar os nomesDebug.Print myForm.NameNextEnd Sub'Loop em todos os relatórios abertos:Public Sub LoopThroughOpenReports()Dim myReport As ReportFor Each myReport In Reports'Código visualizar os nomesDebug.Print myReport.NameNextEnd Sub'Loop em todas as queries:
Public Sub QueriesLoopSkeleton()Dim myObject As AccessObjectFor Each myObject In CurrentData.AllQueries'Código visualizar os nomesDebug.Print myObject.NameNextEnd Sub'Loop em todas as TABELAS:Public Sub TablesLoopSkeleton()Dim myObject As AccessObjectFor Each myObject In CurrentData.AllTables'Código visualizar os nomesDebug.Print myObject.NameNextEnd Sub
'PLUS: Extraindo todos os Labels.
Sub SkipLabels(ReportName As String, LabelsToSkip As Byte, Optional PassedFilter As String)'Declara algumas variáveis.Dim MySQL, RecSource, FldNames As StringDim MyCounter As ByteDim myReport As Report'Desligas as mensagens de aviso.DoCmd.SetWarnings False' Copia todos os LABELS originais do relatório' para o objeto LabelsTempReportDoCmd.CopyObject , "LabelsTempReport", acReport, ReportName' Abre o objeto LabelsTempReport na visão de Design.DoCmd.OpenReport "LabelsTempReport", acViewDesign' Obtém os nomes das queries e consultas sob os relatórios,' e os guarda aqui na variável RecSource .Let RecSource = Reports!LabelsTempReport.RecordSource' Fecha o objeto LabelsTempReportDoCmd.Close acReport, "LabelsTempReport", acSaveNo'Declara um Recordset ADODB chamado de MyRecordSetDim cnn1 As ADODB.ConnectionDim MyRecordSet As New ADODB.RecordsetSet cnn1 = CurrentProject.ConnectionLet MyRecordSet.ActiveConnection = cnn1' Lê os dados do objeto RecSource para o objeto MyRecordSetLet MySQL = "SELECT * FROM [" + RecSource + "]"MyRecordSet.Open MySQL, , adOpenDynamic, adLockOptimistic' Extrai os nomes dos campos e os seus' respectivos tipos da coleção Fields collection.Dim MyField As ADODB.FieldFor Each MyField In MyRecordSet.Fields' Converte o campo AutoNumber (Tipo=3) para Long' para evitar problemas de inserção posterior.If MyField.Type = 3 ThenLet FldNames = FldNames + "CLng([" + RecSource + _"].[" + MyField.Name + "]) As " + MyField.Name + ","ElseLet FldNames = FldNames + _"[" + RecSource + "].[" + MyField.Name + "],"End IfNext'Remove vírgula a direita.Let FldNames = Left(FldNames, Len(FldNames) - 1)'Cria uma tabela vazia com a mesma estrutura RecSource,'sem quaisquer campos AutoNumeração.Let MySQL = "SELECT " + FldNames + _" INTO LabelsTempTable FROM [" + _RecSource + "] WHERE False"MyRecordSet.CloseDoCmd.RunSQL MySQL' A seguir adiciona registros em branco para' esvaziar no objeto LabelsTempTable.Let MySQL = "SELECT * FROM LabelsTempTable"MyRecordSet.Open MySQL, , adOpenStatic, adLockOptimisticFor MyCounter = 1 To LabelsToSkipMyRecordSet.AddNewMyRecordSet.UpdateNext'Agora o objeto LabelsTempTable tem registros vazios suficientes nele.MyRecordSet.Close' Construa uma cadeia de SQL para anexar todos os registros da fonte' original (RecSource) no objeto LabelsTempTable.Let MySQL = "INSERT INTO LabelsTempTable"Let MySQL = MySQL + " SELECT [" + RecSource + _"].* FROM [" + RecSource + "]"' Adere à condição PassedFilter, se existir.If Len(PassedFilter) > 1 ThenMySQL = MySQL & " WHERE " & PassedFilterEnd If' Acrescenta os registrosDoCmd.RunSQL MySQL' O objeto LabelsTempTable está pronto agora' Em seguida nós fazemos LabelsTempTable o registro fonte' para LabelsTempReport.DoCmd.OpenReport "LabelsTempReport", acViewDesign, , , acWindowNormalSet myReport = Reports![LabelsTempReport]Let MySQL = "SELECT * FROM LabelsTempTable"Let myReport.RecordSource = MySQLDoCmd.Close acReport, "LabelsTempReport", acSaveYes' Agora podemos finalmente imprimir os labels.'DoCmd.OpenReport "LabelsTempReport", acViewPreview, , , acWindowNormal'Nota: As written, procedure just shows labels in Print Preview.'To get it to actually print, change acPreview to acViewNormal'in the statement above.' Como escrito, o procedimento só mostra labels na prévia de impressão '' para obtê-los realmente para imprimir,' altere acPreview para acViewNormal na declaração acima.End Sub