Propósito

✔ 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.

.: Vitrine

Carregando artigos...

Views

Mostrando postagens com marcador Find. Mostrar todas as postagens
Mostrando postagens com marcador Find. Mostrar todas as postagens

Truques VBA Raramente Usados - Não Seja Pego no Loop

Truques VBA Raramente Usados - Não Seja Pego no Loop




Sei que pode parecer redundância, mas pense sempre fora da caixa. Mesmo que, para isso, precise abrir mão de usar o VBA. Nós programadores precisamos utilizar as melhores soluções entre os 2 mundos e isso, às vezes, na verdade muitas vezes, significará utilizarmos aquilo que já existe pronto no próprio MS Excel.

Não seja pego na Loop: 

Francamente, tento correr de usar Loops. Geralmente são demasiadamente lentoooosss!

Um erro comum que todos cometemos ao aprender VBA é o de usar Loops quando realmente não são necessários. Observe este exemplo simples logo abaixo, onde a proposta é colocarmos a palavra vazio escrita em cada célula que estiver em branco.

Sub EahhWrongWay ()
Dim Bcell Como Gama

Para Cada Bcell Em Range ("A1: D500")

Se IsEmpty (Bcell) Então Bcell = "vazio"

Próximo Bcell
End Sub

Agora compare com o código abaixo:

Sub OhhEahhRightWay ()
Range ( "A1: D500"). SpecialCells (xlCellTypeBlanks) = "vazio"
End Sub


Muito Melhor!

Este código não somente é melhor como muito mais fácil de escrever e muito mais rápido. 

Da próxima vez que precisar de algo assim, não se apresse com um Loop. Dê um passo para atrás e pense seriamente em utilizar as funções construídas em C# dentro do próprio MS Excel. Algumas das minhas favoritas são: SpecialCells, AutoFilter, Find, AdvancedFilter e Subtotals, para citar apenas algumas. Quando começar a usá-las, sempre pensará duas vezes antes de usar de qualquer jeito um loop


Posso prometer-lhe que utilizar estes recursos quase sempre significará ter sua solução sendo executada pelo menos 100 vezes mais rápida do que num Loop! 


brazilsalesforceeffectiveness@gmail.com

✔ Brazil SFE®Author´s Profile  Google+   Author´s Professional Profile   Pinterest   Author´s Tweets

VBA Excel - Encontre critérios na célula e exclua a linha - Find Values Delete Rows

 Sub FindValueDeleteRow()

    Dim s As String, Count As Integer
    Let Application.ScreenUpdating = False
    Let s = "A"
    For Count = 1 To ActiveSheet.UsedRange.Rows.Count

        Set f = Cells.Find(s, LookIn:=xlValues)
        If Not f Is Nothing Then
            f.EntireRow.Delete    'Shift:=xlUp
            Let Application.ScreenUpdating = True
        End If
    Next Count
End Sub

Tags: Excel, VBA, find, values, delete, row, rows, 


Inline image 1

VBA Excel - Procurando um valor na Coluna A com Looping - Find a Value in Column A using a loop

Sub FindValue()

'This example Loops through Column"A", and searches for
'a value selected from the input box and diplays the address with a MsgBox

    Dim r As Range
    Dim c As Range
    Dim s As String
    Dim ms As String

    Set r = Range("A1", Range("A65536").End(xlUp))

    Let ms = "The Value was found at  "
    Let s = InputBox("Enter Value to Find", "Hello", "Enter Number Here")

    For Each c In r.Cells
        If c = s Then MsgBox ms & c.Address
    Next c

End Sub

Tags: Excel, VBA, Find, Value, Column, loop, Range.  



Inline image 1

VBA Word - Abra um documento e encontre uma Palavra nele - Function to open/get a Word document and Find a string

Inline image 1












O propósito da função VBA disponibilizada a seguir é o de abrir um documento do MS Word e encontrar a próxima ocorrência de uma seqüência específica. Além disso, teremos mais um excelente exemplo do uso do late binding com essa automação vinculada à função AppActivate. Ahh, e sim, este é um post para usuários avançados.

É sempre bom relembrar que uma das vantagens de usarmos late binding (uso de objetos genéricos, como o objWd na função), é o de não sermos obrigados a fazermos uma referência a uma biblioteca em particular. Termos a liberdade de não efetuarmos uma referência direta liber-nos da necessidade de sabermos qual a versão do MS Word que está sendo usada pelo usuário final da aplicação. Mas como não existe almoço de graça, a desvantagem é a de que precisamos definir um constante para ser usado no MS Word, razão pela qual o wdFindContinue foi definido.

O AppActivate torna fácil ativarmos um aplicativo específico que estiver aberto na tela. Como? Fazendo referência direta a legenda contida no título da respectiva janela ativa. Neste caso, quando o texto não é encontrado, o documento do MS Word ainda fica ativo, sendo necessário apenas ativar o código do aplicativo em execução antes de mostrarmos a caixa de mensagem. Se não tivéssemos esse cuidado o usuário poderia acabar por ouvir aquele 'ding' quando a caixa de mensagem aparecesse, sendo coberta pelo documento do MS Word e despercebida pelo usuário.

Caso utilize um documento do MS Word como um manual do usuário para o seu aplicativo, digamos do MS Access, por exemplo, poderá usar essa função VBA no evento Click de um botão que abra o documento e detecte a posição da palavra ou expressão desejada num determinado título u trecho do texto no documento. Mas, caso clicasse no botão novamente, quando o documento já estivesse aberto, a próxima ocorrência do texto seria encontrada, tornando-se uma maneira simples de fornecer ajuda sensível ao contexto. Chique hein!

Function OpenAndFindWordExpression (WordFileName As String, Optional WordFindText) As Boolean
' If the Microsoft Word file specified in WordFileName is not open yet, it will
' be opened.  If a value for WordFindText is specified, it will find the next
' occurance of the value.
' Copyright © 2009 Extra Mile Data

On Error GoTo Err_OpenWordAndFind
   
    Dim strPrompt As String
    Dim objWd As Object
    Dim strAppName As String
    Dim intPos As Integer
    Const wdFindContinue As Integer = 1
    
    ' Get the name of the Word document from the path in WordFileName
    ' by finding the last \ and grabbing all the characters to the right
    ' of that position.

    Let intPos = InStrRev(WordFileName, "\")
    Let strAppName = Right(WordFileName, Len(WordFileName) - intPos)
    
    ' Se o documento do Word estiver aberto ele efetuará a busca, caso não esteja aberto, o abrirá.    
    ' Torna a aplicação visível.
    Let objWd.Application.Visible = True
  
    If Not IsMissing(WordFindText) Then
        With objWd.Application.Selection.Find
            Let .Text = WordFindText
            Let .Forward = True
            Let .Wrap = wdFindContinue
            Let .Format = False
            Let .MatchCase = False
            Let .MatchWholeWord = False
            Let .MatchWildcards = False
            Let .MatchSoundsLike = False
            Let .MatchAllWordForms = False
            
            .Execute            
      
            If Not .Found Then      
                AppActivate Application.Name

                Let strPrompt = "O termo de busca '" & WordFindText & "' não pôde ser encontrado."
                MsgBox strPrompt, vbInformation + vbOKOnly, "Não encontrado!"

                AppActivate strAppName

                Let OpenWordAndFind = False

                GoTo Exit_OpenWordAndFind
            End If
        End With
    End If
    
    AppActivate strAppName
    
    Let OpenWordAndFind = True
    
Exit_OpenWordAndFind:
    On Error Resume Next

    Set objWd = Nothing
    Exit Function
    
Err_OpenWordAndFind:
    Select Case Err.Number
    Case 432

        strPrompt = "Este documento do MS Word não pôde ser encontrado:" _
        & vbCrLf & vbCrLf & WordFileName
        MsgBox strPrompt, vbInformation, "Não encontrado!"
    Case Else
        MsgBox Err.Number & " " & Err.Description, , "OpenWordAndFind"
    End Select
    
    Let OpenWordAndFind = False
    Resume Exit_OpenWordAndFind
End Function


Tags: VBA, Word, late binding, find, document, busca, procura, search, 




VBA Access Basic - Localizando um registro - Search Records in VBA


Não existe atividade mais repetitiva num banco de dados MS Access quanto a de encontrar um registro específico. 

Existem diversas formas de fazer isso, abaixo seguem algumas delas: 

1º EXEMPLO
Dim strSQL As String
Dim rst As ADODB.Recordset
Dim lngID As Long

   strSQL = "SELECT Det.ID, Det.EntryDate, Det.UserEntry FROM UserEntrys WHERE Det.ID=" & EID
  
   Set rst = New ADODB.Recordset

     With rst
       .Open strSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly

       Do While Not rst.EOF
          Let idnumber = !ID
          Let recdate = !EntryDate
          Let recdata = !UserEntry

          rst.MoveNext
       Loop

       .Close
   End With

   Set rst = Nothing

2º EXEMPLO


Dim cn As ADODB.Connection 
Dim Str As String 
Dim rs2 As ADODB.Recordset 
Set cn = CurrentProject.Connection 
Set rs2 = New ADODB.Recordset 
Str = "SELECT CustomerID FROM YourTable WHERE CustomerID ='N'" 
rs2.Open Str, cn, adOpenStatic 
If rs2.RecordCount <> 0 Then 
     ' Found it
End If 
rs2.Close 
Set rs2 = Nothing 
cn.Close 


3º EXEMPLO


DoCmd.FindRecord "Smith",, True,, True

Tags: VBA, Access, recordset, select, SQL, rst, record, registro, find




VBA Access - Encontrando um registro específico

Não existe atividade mais repetitiva num banco de dados quanto a de encontrar um registro específico. Existem diversas formas de fazermos isso, abaixo segue código de uma dessas formas. Divirtam-se!

Dim strSQL As String
Dim rst As ADODB.RecordsetDim lngID As Long

Let strSQL = "SELECT Det.ID, Det.EntryDate, Det.UserEntry FROM UserEntrys WHERE Det.ID=" & EID
Set rst = New ADODB.Recordset
With rst
.Open strSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
Do While Not rst.EOF
Let idnumber = !ID
Let recdate = !EntryDate
Let recdata = !UserEntry
rst.MoveNext
Loop
.Close
End With

Set rst = Nothing 

Tags: Access, find, recordset, loop, while, ADODB, select, SQL

André Luiz Bernardes
A&A® - Work smart, not hard.




diHITT - Notícias