Important:

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.

Views

DONUT PROJECT - VBA - Criando uma Matriz de Datas MAT - Moving Annual Total

DONUT PROJECT - VBA - Criando uma Matriz de Datas MAT



Em diversas ocasiões usamos tabelas com períodos MAT, geralmente estas são extraídas de BIs (Business Information). Os cabeçalhos nem sempre são aquilo que desejaríamos usar.




Como podemos conciliar o conteúdo, adequando os títulos?



As funções abaixo lhe permitirão carregar (LoadMonths()) em uma Matriz, 12 meses, sendo o primeiro uma data passada e os próximos 11 meses serão calculados retroativamente. Depois poderão recuperar (ReturnMonth()) estas datas.

Global nMeses(12) As Date

Sub LoadMonths()
    '      Author: André Bernardes
    '        Date: 20/08/14 - 09:53
    '      Action: Cria tabelas de Regionais para análise.
    ' Application: Analysis****Regional®
    '   Test line: nMeses (1), nMeses(2), nMeses(3), nMeses(4), nMeses(5), nMeses(6), nMeses(7), nMeses(8), nMeses(9), nMeses(10), nMeses(11), nMeses(12)
    '   Test line: Debug.Print ReturnMonth(1), ReturnMonth(2), ReturnMonth(3), ReturnMonth(4), ReturnMonth(5), ReturnMonth(6), ReturnMonth(7), ReturnMonth(8), ReturnMonth(9), ReturnMonth(10), ReturnMonth(11), ReturnMonth(12)

    Dim i As Integer
    Dim Flag As Boolean
    Dim LastDate As Date

    Let Flag = True

    For i = 1 To 12
        If Flag Then
            Let nMeses(i) = Sheets("Analise").Range("I5").Value
            Let LastDate = nMeses(i)
            Let Flag = False
        Else
            Let nMeses(i) = DateAdd("m", -1, LastDate)
            Let LastDate = nMeses(i)
        End If
    Next
End Sub

Function ReturnMonth (nMnth As Integer) As String
    '      Author: André Bernardes
    '        Date: 20/08/14 - 09:53
    '      Action: Cria tabelas de Regionais para análise.
    ' Application: AnalysisMDTRRegional®
    '   Test line: nMeses (1), nMeses(2), nMeses(3), nMeses(4), nMeses(5), nMeses(6), nMeses(7), nMeses(8), nMeses(9), nMeses(10), nMeses(11), nMeses(12)
    '   Test line: Debug.Print ReturnMonth(1), ReturnMonth(2), ReturnMonth(3), ReturnMonth(4), ReturnMonth(5), ReturnMonth(6), ReturnMonth(7), ReturnMonth(8), ReturnMonth(9), ReturnMonth(10), ReturnMonth(11), ReturnMonth(12)

    Dim nMonth As String
    Dim nYear As String
    Dim nTitle01 As String

    Let nMonth = Mid(Format(nMeses(nMnth), "DD/MM/YYYY"), 4, 2)
    Let nYear = Year(nMeses(nMnth))
    Let nTitle01 = UCase(Left(Format(Month(nMonth), "mmm"), 3))

    If nMonth = "01" Then
        Let ReturnMonth = "JAN|" & nYear
    ElseIf nMonth = "02" Then
        Let ReturnMonth = "FEV|" & nYear
    ElseIf nMonth = "03" Then
        Let ReturnMonth = "MAR|" & nYear
    ElseIf nMonth = "04" Then
        Let ReturnMonth = "ABR|" & nYear
    ElseIf nMonth = "05" Then
        Let ReturnMonth = "MAI|" & nYear
    ElseIf nMonth = "06" Then
        Let ReturnMonth = "JUN|" & nYear
    ElseIf nMonth = "07" Then
        Let ReturnMonth = "JUL|" & nYear
    ElseIf nMonth = "08" Then
        Let ReturnMonth = "AGO|" & nYear
    ElseIf nMonth = "09" Then
        Let ReturnMonth = "SET|" & nYear
    ElseIf nMonth = "10" Then
        Let ReturnMonth = "OUT|" & nYear
    ElseIf nMonth = "11" Then
        Let ReturnMonth = "NOV|" & nYear
    ElseIf nMonth = "12" Then
        Let ReturnMonth = "DEZ|" & nYear
    End If
End Function

Caso queiram traduzir os meses para outros idiomas basta que alterem os meses.

André Luiz Bernardes

Inline image 1

DONUT PROJECT - VBA - Access - Criando uma Query com Parâmetros

DONUT PROJECT - VBA - Access - Criando uma Query com Parâmetros





Essa técnica pode ajudá-lo em projetos nos quais precise de certa agilidade para criar bases de dados para análises.

O código abaixo o ajudará a fazer isso.

Sub CrieQueriesComParametros()
    '      Author: André Bernardes
    '        Date: 18/08/14 - 10:38
    '      Action: Cria uma query com Parâmetros.
    ' Application: ****®

    Dim dbs As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim strSQL As String

    Set dbs = CurrentDb
    Set qdf = dbs.CreateQueryDef("nQuery")
    Application.RefreshDatabaseWindow

    Let strSQL = "PARAMETERS Param1 TEXT, Param2 INT; "
    Let strSQL = strSQL & "SELECT * FROM [Table1] "
    Let strSQL = strSQL & "WHERE [Field1] = [Param1] AND [Field2] = [Param2];"
    Let qdf.SQL = strSQL

    qdf.Close

    Set qdf = Nothing
    Set dbs = Nothing
End Sub

DONUT PROJECT - VBA - Access - Atualizando o conteúdo de uma Query





É muito mais rápido atualizarmos internamente o conteúdo de uma query do que ficar criando-a todas as vezes que precisarmos. A performance conseguida em grandes volumetrias é incrível.

O código abaixo o ajudará a fazer isso.

Sub UpdateQuery(QueryName, SQL)
    '      Author: André Bernardes
    '        Date: 18/08/14 - 09:53
    '      Action: Atualiza o conteúdo de uma query com um novo script.
    ' Application: ****®

    ' Usando o nome da query e o respectivo script, caso a query não exista.
    If IsNull(DLookup("Name", "MsysObjects", "Name='" & QueryName & "'")) Then
        ' Cria-a, ...
        CurrentDb.CreateQueryDef QueryName, SQL
    Else
        ' Caso contrário, atualizao o script sql.
        Let CurrentDb.QueryDefs(QueryName).SQL = SQL
    End If
End Sub

Para evocar o código basta fazer assim:

' Atualiza a query que é a base de todas as análises.
Dim nSQL2 As String
Let nSQL2 = "SELECT * " & _
                     "FROM lnk_Med " & _
                     "WHERE (((Left([FVD_Sector],2))='" & nParticula & "')) "
Call UpdateQuery("qry_lnk", nSQL2)

Lembre-se que deletar uma query inexistente pode causar um erro:

DoCmd.DeleteObject acQuery, "qry_lnk"

Inline image 1

DONUT PROJECT - VBA - Access - Saiba o Número de Registro cada tabela

DONUT PROJECT - VBA - Access - Saiba o Número de Registro cada tabela



Saiba quantos registros foram gerados em suas Tabelas.

Sub Records()
    '      Author: André Bernardes
    '        Date: 28/07/14 - 12:35
    ' Application: *** SalesForce®

    Dim dbs As DAO.Database
    Dim tbf As TableDef

    Set dbs = CurrentDb
    Set tbf = dbs.CreateTableDef
 
    For Each tbf In dbs.TableDefs
        Debug.Print "Tabela " & tbf.Name & ", com " & Format(tbf.RecordCount, "###,###,###") & " registros." '&Chr(10)   'vbCrLf
    Next tbf
End Sub


DONUT PROJECT - VBA - Access - Extraia Blocos de dados do Banco de dados - sem problemas de TIMEOUT.




Podemos analisar grandes blocos de dados, 'fatiando-os' e consolidando-os se precisarmos, para análises pontuais, relatórios ou mesmo distribuição junto com as nossas planilhas Excel ou apresentações Powerpoint com os nossos Dashboards ou Scorecards.

Este código e técnica lhe permitirá extrair automaticamente blocos de informações de grandes bases de dados, além de lhe ensinar como passar o conteúdo de um campo como parâmetro para criar as tabelas de análise.

Este modelo de código foi desenvolvido de modo bem facilitado para ensinar aos iniciantes uma técnica acessível de extração de dados.

Tudo começa com o script SQL, copiado a partir do construtor do MS Access. Depois de definir no modo design todos os campos que deseja, bem como as consolidações, etc...Basta copiá-lo para o código abaixo, colocando-o na variável nSQL.

Esse código é extremamente versátil pois permite que você crie a query no MS Access, destruindo-a em seguida, e automaticamente elimina um problema muito comum para os menos experientes: Atribuir à query a característica de poder ficar conectada à view do SQL o tempo que for necessário sem que a conexão dê problemas de TIMEOUT.

Como este código pode ser adaptado a qualquer banco de dados MS Access, o código também higieniza a nossa base limpando-a das queries criadas para a geração das tabelas. 

Function GeraBases_Por_Region()
    '      Author: André Bernardes
    '        Date: 25/07/14 - 10:30
    ' AppliCategoryion: *** SalesForce®

    Dim nSQL As String
    Dim nQuery As String
    Dim i As Integer
    Dim nRegion As String
    Dim db_Q As QueryDef

    ' Cria uma tabela atualizada para cada Local.
    For i = 1 To 6  'Nº de Locais.
        Debug.Print i
        
        Let nRegion = Trim(Str(i))                        'Nº de Locais
        Let nSQL = "SELECT SQLServer_View_BIGDATA_Relatorio_LAB.OBSERVE_MYLAB, SQLServer_View_BIGDATA_Relatorio_LAB.Category_CT, SQLServer_View_BIGDATA_Relatorio_LAB.STATUS, SQLServer_View_BIGDATA_Relatorio_LAB.AREA, SQLServer_View_BIGDATA_Relatorio_LAB.BRAND AS Product, Left([DEPTO],2) AS Region, Left([DEPTO],3) AS DISTRICT, SQLServer_View_BIGDATA_Relatorio_LAB.DEPTO, SQLServer_View_BIGDATA_Relatorio_LAB.ID, SQLServer_View_BIGDATA_Relatorio_LAB.PROFILE, SQLServer_View_BIGDATA_Relatorio_LAB.CLIENT, SQLServer_View_BIGDATA_Relatorio_LAB.Citie, SQLServer_View_BIGDATA_Relatorio_LAB.FMonth AS PX00, SQLServer_View_BIGDATA_Relatorio_LAB.SMonth AS PX01, SQLServer_View_BIGDATA_Relatorio_LAB.TRI_00, SQLServer_View_BIGDATA_Relatorio_LAB.TRI_03, SQLServer_View_BIGDATA_Relatorio_LAB.SEMF_00, SQLServer_View_BIGDATA_Relatorio_LAB.SEMF_01, SQLServer_View_BIGDATA_Relatorio_LAB.MAT_00 " & _
                   "INTO tbl_tmp_B" & nRegion & "_PX " & _
                   "FROM SQLServer_View_BIGDATA_Relatorio_LAB " & _
                   "GROUP BY SQLServer_View_BIGDATA_Relatorio_LAB.OBSERVE_MYLAB, SQLServer_View_BIGDATA_Relatorio_LAB.Category_CT, SQLServer_View_BIGDATA_Relatorio_LAB.STATUS, SQLServer_View_BIGDATA_Relatorio_LAB.AREA, SQLServer_View_BIGDATA_Relatorio_LAB.BRAND, Left([DEPTO],2), Left([DEPTO],3), SQLServer_View_BIGDATA_Relatorio_LAB.DEPTO, SQLServer_View_BIGDATA_Relatorio_LAB.ID, SQLServer_View_BIGDATA_Relatorio_LAB.PROFILE, SQLServer_View_BIGDATA_Relatorio_LAB.CLIENT, SQLServer_View_BIGDATA_Relatorio_LAB.Citie, SQLServer_View_BIGDATA_Relatorio_LAB.FMonth, SQLServer_View_BIGDATA_Relatorio_LAB.SMonth, SQLServer_View_BIGDATA_Relatorio_LAB.TRI_00, SQLServer_View_BIGDATA_Relatorio_LAB.TRI_03, SQLServer_View_BIGDATA_Relatorio_LAB.SEMF_00, SQLServer_View_BIGDATA_Relatorio_LAB.SEMF_01, SQLServer_View_BIGDATA_Relatorio_LAB.MAT_00 " & _
                   "HAVING (((Left([DEPTO],2))='B" & nRegion & "'))"
        
        DoCmd.SetWarnings (False)
        
        ' Cria a query.
        Let nQuery = "qry_tmp_" & nRegion & "_Region"   ' Nome da query
        
        If Not IsNull(DLookup("Type", "MSYSObjects", "Name='nQuery'")) Then
            ' Deleta o objeto query.
            DoCmd.DeleteObject acQuery, nQuery
            
        Else
            CurrentDb.CreateQueryDef nQuery, nSQL
        End If

        ' Configura o timeout da query
        Set db_Q = CurrentDb.QueryDefs(nQuery)
        Let db_Q.ODBCTimeout = 0
        db_Q.Close

        ' Executa a query
        'DoCmd.RunSQL (nSQL)
        DoCmd.OpenQuery nQuery, acViewNormal, acEdit

        ' Deleta o objeto query.
        DoCmd.DeleteObject acQuery, nQuery

        DoCmd.SetWarnings (True)
    Next
    
    Set db_Q = Nothing
End Function



DONUT PROJECT - VBA - Access - Lista o Tamanho de Todas as Tabelas

DONUT PROJECT - VBA - Access - Lista o Tamanho de Todas as Tabelas



Quando criamos tabelas vindas de outras bases de dados no MS Access. O resultado de views e análises, é importante que tenhamos uma ideia do seu tamanho.

Especialmente se formos conectá-las a planilhas com Dashboards.

O tamanho das tabelas fica registrado na área de debugação:

Sub Lista_Tamanho_Todas_Tabelas()
    '      Author: André Bernardes
    '        Date: 28/07/14 - 10:13
    ' Application: *** SalesForce®

  Dim dbs As DAO.Database
  Dim tdf As DAO.TableDef

  Dim strName As String
  Dim strFile As String
  Dim strPath As String
  Dim lngBase As Long
  Dim lngSize As Long
    
  On Error GoTo ListAllTables_Size_Error

  Set dbs = CurrentDb
  Let strName = dbs.Name
  Let strPath = Left(strName, Len(strName) - Len(Dir(strName)))
  
  ' Cria um database vazio para medir o tamanho do arquivo.
  Let strFile = strPath & "base" & ".mdt"
  CreateDatabase strFile, dbLangGeneral
  
  Let lngBase = FileLen(strFile)
  Kill strFile
  Debug.Print "Tamanho Base: ", lngBase

  For Each tdf In dbs.TableDefs
    Let strName = tdf.Name
    
    ' Appica um filtro para ignorar as tabelas internas de sistema do MS Access.
    If Left(strName, 4) <> "MSys" Then
      Let strFile = strPath & strName & ".mdt"
      
      Debug.Print strName, ;
      
      CreateDatabase strFile, dbLangGeneral
      
      DoCmd.TransferDatabase acExport, "Microsoft Access", strFile, acTable, strName, strName
      
      Let lngSize = FileLen(strFile) - lngBase
      Kill strFile
      Debug.Print lngSize
    End If
  Next
  
  Set tdf = Nothing
  Set dbs = Nothing

   On Error GoTo 0
   Exit Sub

ListAllTables_Size_Error:

    MsgBox "Erro: " & Err.Number & " (" & Err.Description & ") na SUB Lista_Tamanho_Todas_Tabelas."
End Sub


UM BREVE RETROSPECTO...




Bem, a minha primeira linguagem de programação foi o COBOL, passei pelo PascalC, e aprofundei-me mesmo no Clipper.

Já trabalhando, desenvolvi inúmeras aplicações com o Clipper para as diversas áreas de trabalho, uma vez que trabalhava em Santos, cidade portuária, com necessidades diversas. A empresa em que trabalhei, era uma softwarehouse, como chamávamos na época.

Desenvolvi sistemas de estocagem de café, venda|corretagem de café, contabilidade, estoque em geral, venda no balcão, etc...De software de Locadora de Videos a Controle de Condomínio, desenvolvi uma infinidade de aplicações e sistemas que foram ampliando-se com o passar do tempo e das necessidades dos Clientes, que já eram inúmeros.

A tecnologia também não parou, então venho conhecendo computadores de CP500 ao atual Ultrabook.

Vim de uma época onde o conceito Cliente/Servidor não existia, e precisávamos emulá-lo.

Enfim, casei-me e vim trabalhar no mercado de São Paulo numa consultoria. Como já tinha desenvolvido experiência para ter contato com diversos clientes, desenvolvendo inúmeras aplicações, pude destacar-me nesta empresa, que a princípio contratara-me apenas para desenvolver soluções internas.

Nesta ocasião, fui apresentado ao Delphi, uma linguagem visual, a minha primeira, apesar de já ter visto o Visual Basic e usado a versão Visual Objects do Clipper.

Em São Paulo pude ampliar meus conhecimentos e técnicas. Atendia variados clientes corporativos, nas áreas mais abrangentes possíveis, o que foi excelente!

Com o passar dos anos, além de programação e análise de sistemas, passei a focar-me em processos, liderar equipes, mas a paixão por desenvolver soluções rápidas e práticas não terminava, sempre dava um jeito para participar no desenvolvimento durante os projetos onde estava envolvido.

Pois bem, acabei percebendo um gap, lá pelos idos de 1997/8. As empresas, na sua totalidade, utilizavam massivamente o MS Office. O qual conhecia desde as primeiras versões, pois fora usuário dos famosos Lotus 123Visicalc, QuattroProWordstar, etc... Tive o insight de detectar que, apesar de muitos usuários terem acesso a este produto, o MS Office, bem poucos sabiam utilizá-lo plenamente. Não conheciam o conceito de Macros, e depois não captaram o momento onde a Microsoft trouxera o Visual Basic para dentro do MS Office.

Juntando a minha percepção e a necessidade do mercado, tive a ideia de me especializar em criar soluções única e exclusivamente com o MS Office. E isso envolvia usá-lo desde o MS Powerpoint, até o MS Access, e é óbvio que depois as tecnologias e a arquitetura em si, foram tornando-se ainda mais abrangentes.

Criei as aplicações mais diversas, em áreas ainda mais distintas que anteriormente. E poderá verificá-las através das minhas experiências profissionais, através das mais de 43 empresas por onde passei e estão constantes no meu curriculum vitae.

Pois bem, como não poderia deixar de ocorrer, findei por embrenhar-me em novos conceitos. Li muito, comprei muitos livros. Ministrei e assisti muitos cursos. E isso acabou me levando a manter em certo momento, uns 5 Blogs, onde escrevia sobre o desenvolvimento VBA e seus desdobramentos: 

Hoje, focado nos últimos 5 anos, na Indústria Farmacêutica, continuo usando os meus conhecimentos técnicos para desenvolver soluções na minha área de atuação.



DONUT PROJECT - VBA - Exportação Automatizada - De *.docx Para *.pdf - Otimizando o tamanho





Este código, desenvolvido no MS Excel, pode reduzir o tamanho de um documento do Word, por exemplo de 400kb para 100kb.

Suponhamos que lhe pedissem alguma forma de reduzir o tamanho de um arquivo *.docx, que inclui algumas fotos. Uma pergunta mais específica seria a de se há algum modo de realmente reduzirmos o tamanho de um documento do MS Word que tenha incorporado imagens *.Jpg? Essa exigência existe devido a necessidade de enviarmos um e-mail com este documento em anexo, pesando menos do que 100 KB. Digamos que a empresa onde trabalha não permita nada acima de 100 KB e por isso tenhamos que descobrir uma maneira de reduzir o tamanho do arquivo. Não há nenhum formato de arquivo especificado ou exigido.

Certamente após refletirmos um pouco, algumas soluções possíveis vieram:

A compactação de arquivos *.Jpeg, salvando-o num formato de arquivo diferente e reinserindo-os no texto.

Capturar um screenshot do documento do MS Word com zoom-out e salvá-lo como um novo arquivo *.Jpg.

Bem, até o momento a melhor solução era realmente fazer screenshots e depois manipulá-los para reduzir o seu tamanho. O único problema era que esse processo seria manual e muito longo, havendo um monte de arquivos para passar.

Após alguns testes com diferentes formatos de arquivo, verificando os resultados (tamanhos). Deparei-me com o recurso de exportação de documento ativo para *.Pdf, mas com a opção de otimização para definir um tamanho mínimo.


Após experimentar isso em cerca de 10 arquivos diferentes, e obter em cada vez, um arquivo menor do que 100 KB de arquivo. Imaginei que seria muito simples abrir um arquivo *.docx e exportá-lo para um arquivo *.pdf. Mas ainda imaginava como automatizaria esse processo. Não sabia a quantidade exata de arquivos que precisavam ser convertidos - apenas tinha a impressão de haver muitos deles.

Então, tive a ideia para o processo de automação, criar uma planilha do MS Excel com algumas macros que:

    • Solicitasse ao usuário para entrar um ou vários arquivos de uma só vez.
    • Abrir cada arquivo.
    • Processar cada arquivo (exportação).
    • Terminar, formatando as células, colocando os resultados em destaque.
Códigos:

Sub Main()
Let Application.ScreenUpdating = False
 
    Setup
    SelectFilesToConvert
    UpdateConverted
 
Columns.AutoFit
Let Application.ScreenUpdating = True
End Sub
 
Private Sub Setup()
    Cells.Clear
    
Let Range("A1") = "Path"    
Let Range("B1") = "Size (KB)"    
Let Range("D1") = "PDF Path"    
Let Range("E1") = "PDF Size (KB)"
 
 Let Range("E:E").Font.Color = xlNone
 Let Range("B:B", "E:E").NumberFormat = "0.0"
 
    With Range("A1:E1")
        Let .Interior.Color = RGB(102, 153, 255)
        Let .Borders.LineStyle = xlContinuous
    End With 
End Sub
 
Private Sub SelectFilesToConvert()
    Dim i As Long
    Dim r As Range
 
    Set r = Range("A2")
    With Application.FileDialog(msoFileDialogOpen)
        Let .AllowMultiSelect = True        
        Let .InitialFileName = "initial path"
        Let .InitialView = msoFileDialogViewList
        .Filters.Clear
        .Filters.Add "Word Documents", "*.docx"
        .Show
        ' Create hyperlinks to the files and show their size in KB

        For i = 1 To .SelectedItems.Count
            r.Worksheet.Hyperlinks.Add Anchor:=r, Address:=.SelectedItems(i), TextToDisplay:=.SelectedItems(i)
            r.Offset(0, 1) = FileLen(r) / 1000
 
            ' Open each Word file
            OpenWordFile CStr(r)
            Set r = r.Offset(1, 0)
        Next i
    End With 
End Sub
 
Private Sub OpenWordFile(filePath As String) 
    On Error GoTo ErrCleanUp
 
    Dim wordApp As Word.Application
    Set wordApp = New Word.Application
 
    Let wordApp.DisplayAlerts = wdAlertsNone
    Let wordApp.Visible = False
 
    Dim wordDoc As Document
    Set wordDoc = wordApp.Documents.Open(filePath)
 
    SaveAsMinimizedPDF wordDoc 
    Let wordDoc.Saved = True
    wordDoc.Close
    wordApp.Quit
 
    Exit Sub
 
ErrCleanUp:
    Let wordDoc.Saved = True
    wordDoc.Close
    wordApp.Quit
End Sub
 
Private Sub SaveAsMinimizedPDF(ByRef doc As Document)
    doc.ExportAsFixedFormat OutputFileName:= _
 Split(doc.FullName, ".")(0) & ".pdf", ExportFormat:=wdExportFormatPDF _
 , OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForOnScreen, Range _
 :=wdExportAllDocument, From:=1, to:=1, Item:=wdExportDocumentContent, _
 IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _
 wdExportCreateNoBookmarks, DocStructureTags:=False, BitmapMissingFonts:= _
 False, UseISO19005_1:=False
End Sub
 
Private Sub UpdateConverted()
    Dim i As Long
    Dim r As Range

    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        Set r = Range("A" & i)
        r.Offset(0, 3).Worksheet.Hyperlinks.Add _
 Anchor:=r.Offset(0, 3), Address:=Split(r, ".")(0) & ".pdf", _
 TextToDisplay:=Split(r, ".")(0) & ".pdf"
        r.Offset(0, 4) = FileLen(r.Offset(0, 3)) / 1000
        ' validate
        r.Offset(0, 4).Font.Color = IIf(r.Offset(0, 4) > 100, RGB(255, 0, 0), RGB(0, 255, 0))
    Next i 
End Sub


Reference: vba4all


LinkWithinBrazilVBAAccessSpecialist

Related Posts Plugin for WordPress, Blogger...

Vitrine