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

VBA Tips - Código de exemplo determinar a letra de unidade de CD-ROM - Sample Code to Determine CD-ROM Drive Letter

Inline image 1

Aqui coloco um artigo com um código que determina a primeira letra da unidade de CD-ROM, retornando uma variável como string, em seguida mostra numa caixa de mensagens. Isso seria útil para acessar arquivos contidos em um CD.

  ' **********************************************************************     '     ' FUNCTION:     '    GetFirstCdRomDriveLetter()     '     ' PURPOSE:     '    Finds the first CD-ROM device and then returns its drive letter.     '     ' ARGUMENTS:     '    None     '     ' RETURNS:     '    A string that represents the first CD-ROM drive letter. If the     '    function fails for any reason, it returns vbNullString.     '     ' **********************************************************************     Declare Function GetDriveType Lib "kernel32" Alias _        "GetDriveTypeA" (ByVal nDrive As String) As Long       Declare Function GetLogicalDriveStrings Lib "kernel32" Alias _        "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, _        ByVal lpBuffer As String) As Long       Public Const DRIVE_CDROM As Long = 5       Function GetFirstCdRomDriveLetter() As String          ' Declare variables.        Dim lDriveType As Long        Dim strDrive As String        Dim lStart As Long: lStart = 1          ' Create a string to hold the logical drives.        Dim strDrives As String        strDrives = Space(150)          ' Get the logial drives on the system.        ' If the function fails it returns zero.        Dim lRetVal As Long        lRetVal = GetLogicalDriveStrings(150, strDrives)          ' Check to see if GetLogicalDriveStrings() worked.        If lRetVal = 0 Then             ' Get GetLogicalDriveStrings() failed.           GetFirstCdRomDriveLetter = vbNullString           Exit Function        End If          ' Get the string that represents the first drive.        strDrive = Mid(strDrives, lStart, 3)          Do             ' Test the first drive.           lDriveType = GetDriveType(strDrive)             ' Check if the drive type is a CD-ROM.           If lDriveType = DRIVE_CDROM Then                ' Found the first CD-ROM drive on the system.              GetFirstCdRomDriveLetter = strDrive              Exit Function           End If             ' Increment lStart to next drive in the string.           lStart = lStart + 4             ' Get the string that represents the first drive.           strDrive = Mid(strDrives, lStart, 3)          Loop While (Mid(strDrives, lStart, 1) <> vbNullChar)     End Function

Segue um exemplo que chama a função GetFirstCdRomDriveLetter()

  Sub Main          Dim strDriveLetter as String          ' Call the GetFirstCdRomDriveLetter() and store the        ' return value in strDriveLetter.        strDriveLetter = GetFirstCdRomDriveLetter()          ' Display the drive letter in a message box.        MsgBox strDriveLetter       End Sub

Reference

Tags: VBA, Tips, CR-ROM, Drive Letter

Inline image 1

Access VBA - Como copiar a tela ou janela para a área de transferência a partir do Visual Basic - How To Capture and Print the Screen, a Form, or Any Window



Este artigo demonstra como programaticamente copiar a janela ativa ou a tela inteira para a área de transferência e imprimir a imagem.

Este artigo mostra como capturar qualquer formulário ou janela, incluindo a tela e colocá-lo em um objeto de imagem do Visual Basic. 

Se o único requisito for copiar a tela ou janela ativa para a área de transferência, chamar a API keybd_event teremos a mesma funcionalidade que combinação das teclas [ALT] + [PRINTSCRN] (copiar a janela ativa para a área de transferência) ou [PRINTSCRN] (copiar a tela para a área de transferência). Se também precisas imprimir a imagem, um controle PictureBox oculto pode fornecer essa funcionalidade.

Passo a passo
- Inicie um novo projeto Visual Basic Standard EXE. O Form1 é criado por padrão.

- Adicione três CommandButtons e um controle PictureBox ao Form1.

- Adicione o seguinte código na seção General Declarations do Form1:

Option Explicit

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
  bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Declare Function GetVersionExA Lib "kernel32" _
     (lpVersionInformation As OSVERSIONINFO) As Integer

Private Type OSVERSIONINFO
   dwOSVersionInfoSize As Long
   dwMajorVersion As Long
   dwMinorVersion As Long
   dwBuildNumber As Long
   dwPlatformId As Long
   szCSDVersion As String * 128
End Type

Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_SNAPSHOT = &H2C
Private Const VK_MENU = &H12

Dim blnAboveVer4 As Boolean

Private Sub Command1_Click()
   If blnAboveVer4 Then
keybd_event VK_SNAPSHOT, 0, 0, 0
   Else
keybd_event VK_SNAPSHOT, 1, 0, 0
   End If
End Sub

Private Sub Command2_Click()
   If blnAboveVer4 Then
keybd_event VK_SNAPSHOT, 1, 0, 0
   Else
keybd_event VK_MENU, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
   End If
End Sub

Private Sub Command3_Click()
   ' Load the captured image into a PictureBox and print it
    Let Picture1.Picture = Clipboard.GetData()
   Printer.PaintPicture Picture1.Picture, 0, 0
   Printer.EndDoc
End Sub

Private Sub Form_Load()
   Dim osinfo As OSVERSIONINFO
   Dim retvalue As Integer

    Let osinfo.dwOSVersionInfoSize = 148
    Let osinfo.szCSDVersion = Space$(128)
    Let retvalue = GetVersionExA(osinfo)

   If osinfo.dwMajorVersion > 4 Then blnAboveVer4 = True

    Let Picture1.Visible = False
    Let Command1.Caption = "Print Screen"
    Let Command2.Caption = "Alt+Print Screen"
    Let Command3.Caption = "Print Image"
End Sub

- Abrir o Microsoft Paint e execute o projeto.

- Clique no botão Print Screen , alterne para o Paint e pressione CTRL+V para colar o conteúdo da área de transferência no Paint. A tela inteira é colada.

- Clique no botão ALT + PRINT SCREEN , alterne para Paint como antes e pressione CTRL+V novamente. Somente a janela ativa é colada.
 
- Clique no botão Imprimir imagem e a imagem capturada imprimirá (usando um PictureBox oculto).

Reference::
161299  Como captura e a tela, um formulário ou qualquer janela de impressão
189249  Como determinar qual versão do Windows de 32 bits está sendo usado
230502  How To Print a Form That is Too Large for the Screen or Page
178076  How To Use a PictureBox to Control Orientation Printing a Form
194580  How To Print a Composite Image From a RichTextBox
146022  How To Set Up the RichTextBox Control for WYSIWYG Printing

Tags: VBA, Access, transferência, clipboard, API, keybd_event, PRINTSCRN, PictureBox, ALT,

Inline image 1

LinkedIn - O perfil profissional que as empresas procuram no mercado.

Logo LinkedIn
A internet possui uma série de redes sociais, para públicos e propósitos diferentes. Entre elas, há uma que, embora seja muito conhecida, muitas vezes é utilizada para uma finalidade diferente daquela para a qual foi idealizada.

O LinkedIn é uma rede destinada a mostrar um perfil profissional, não somente para quem está em busca de um novo emprego ou uma recolocação no mercado. Ele também pode servir para encontrar parcerias, investidores, empreendedores para um novo negócio, companhias para as quais você possa prestar consultoria etc.

Diferente de uma rede social como o Facebook, a ideia do LinkedIn não é ser um lugar para você encontrar amigos ou conhecer pessoas novas, compartilhar fotos ou pensamentos pessoais. Trata-se de um local para você adicionar informações de cunho profissional e localizar conexões associadas com a sua carreira ou negócio.

As empresas contratam pela atitude, porque as atividades somos capazes de desenvolver. Precisamos sair da descrição do cargo e ir para a ação. É a atitude emocional que faz a diferença. 

Quando olhamos para a realidade das empresas, precisamos de alguém que seja capaz de se auto-liderar para poder remar contra a correnteza e ser ético; garantir a sobrevivência da sua empresa e gerar valores de forma recorrente sustentável, de forma a gerar cada vez mais resultados com cada vez menos recursos. Cidadania, responsabilidade social e mais respeito ao meio-ambiente.

Sempre acompanho quem tem dado uma olhada no meu perfil e não canso de me surpreender sobre os perfis e as localidades.


Os profissionais precisam ter competências que sejam canalizadas para a geração de negócios para a empresa. São pré-requisitos: agilidade, coletividade e capacidade de gerar valor agregado ao produto. O profissional hoje precisa ser multifuncional, ter habilidade para trabalhar em equipe e ter uma série de atitudes resultantes de uma vertente ética pesada. Que seja capaz de compatibilizar inteligência, experiência e expertise, transformadas em valores éticos, e que tenha uma visão global mesmo que ele não trabalhe fora do país. Ao lado disso, ele precisa ser capaz de entender as estratégias de sua empresa, capaz de se auto-liderar a ponto de fazer parte dos grandes desafios que as empresas enfrentam, que são produzir mais com cada vez menos recursos de forma sustentável, recorrente, com responsabilidade social e respeito ao meio-ambiente. Estes são os caminhos que temos que tentar completar. Isso é o que cada um de nós terá que prover para garantir a própria empregabilidade. Eu preciso de uma empresa que seja socialmente justa, ambientalmente responsável e economicamente viável.

VBA Access - Como abrir ou fechar o painel de navegação

Inline image 1

Para deixarmos as nossas aplicações mais estéticas e profissionais, como podemos abrir ou fechar o painel de navegação do MS Access 2007 com o VBA?

Private Sub Form_Load()
'SelectObject usado para dar o foco ao Painel de Navegação

DoCmd.SelectObject acForm, "Nome de um formulário", True

'Ocultando janela com o foco
DoCmd.RunCommand acCmdWindowHide
End Sub

Também poderá abrigar o código em um módulo:
Call SetStartupOptions ("StartupShowDBWindow", dbBoolean, False)

Public Sub SetStartupOptions (propname As String, propdb As Variant, prop As Variant)
On Error Resume Next

Dim dbs As Object
Dim prp As Object
Set dbs = CurrentDb

dbs.Properties(propname) = prop
If Err.Number = 3270 Then
Set prp = dbs.CreateProperty(propname, propdb, prop)
dbs.Properties.Append prp
End If

Set dbs = Nothing
Set prp = Nothing

End Sub

Reference::

Tags: VBA, Excel, matriz, vetor, array, DAO, ADO, Northwind, CopyFromRecordset

Inline image 1

MS Office 15 suportará padrão de documentos abertos ODF 1.2

Inline image 1
Microsoft também irá suportar o ODF 1.2 na sua suíte de escritório na nuvem, Office 365

A Microsoft demonstrou suporte ao padrão Open Document Format (ODF) 1.2 - o formato de documento nativo do OpenOffice.org 3 e LibreOffice 3 - em uma apresentação da próxima suite de produtividade Office 15, e planeja lançar uma versão beta com o recurso nos próximos meses. A apresentação foi feita durante o Plugfest ODF, realizado em Bruxelas na semana passada.

O Plugfest, ou teste de interoperabilidade, foi organizado pela Sociedade OpenDoc, criada para promover o ODF no momento em que a Microsoft tentava tranformar o formato de documento proprietário OOXML padrão ISO. O ODF 1.0 já havia sido adotado como um padrão internacional, ISO / IEC 26300, e uma variante do OOXML foi adotado mais tarde como ISO / IEC 29500.

O uso de formatos de documentos abertos padrão é importante para o arquivamento e o intercâmbio de informações. Os documentos legados em formatos proprietários podem se tornar inacessíveis se o software original usado para criá-los não estiver mais disponível. Em contrapartida, é possível continuar a decodificar os documentos salvos em formatos abertos ou padrão, pois qualquer aplicação compatível com os padrões é capaz de fazer o trabalho.

A versão atual do Microsoft Office já pode ler e gravar documentos em formato ODF 1.1, mas o padrão mudou: A The Organization for the Advancement of Structured Information Standards (OASIS) aprovou a versão 1.2 em setembro passado , e além da OpenOffice.org e da LibreOffice, já é suportado pelo Gnumeric, Google Docs, Office Softmaker, EuroOffice, WebODF, Zoho Office, AbiWord e a suite Calligra.

Michiel Leenaars, vice-presidente da OpenDoc Society, saudou a decisão da Microsoft de suportar o ODF 1.2.

A adoção do padrão de documentos abertos permitirá que os clientes da Microsoft possam se comunicar melhor com usuários de outros software de produtividade. O uso do ODF liberta os usários que tradicionalmente estavam ligadas a um ambiente de software, explica Leenaars. "O tempo que só tinhamos um computador em nossa mesa ficou para trás. Nós agora temos tablets, telefones celulares e uma variedade de outros dispositivos para acesso à informação".

A Microsoft planeja lançar uma versão beta pública do Office 15 no segundo trimestre, mas alguns desenvolvedores já estão fazendo testes com uma versão Technical Preview, sob NDA (acordo de não revelação de informações).

No Plugfest, a Microsoft permitiu que os participantes fizessem o upload de documentos no formato ODF 1.2 através de uma interface Web para uma visualização da máquina executando o Office 15, evitando a necessidade de assinatura do NDA. Essa máquina, em seguida, devolveu o documento ODF ou um arquivo PDF para mostrar como o Office poderia imprimi-lo.

Quando a Microsoft lançar o Office 15, ele irá atualizar os clientes Office, Office 365, Exchange e Sharepoint para dispositivos móveis e PCs, ao mesmo tempo .

Reference::
idgnow


TagsPlugfest ODF, Office 15,  LibreOffice 3, OpenOffice.org 3, Open Document Format (ODF) 1.2, Microsoft, OOXML,ISO,ISO / IEC 26300, ISO / IEC 29500, OASIS, Gnumeric, Google Docs, Office Softmaker, EuroOffice, WebODF, Zoho Office, AbiWord, Calligra, Office 365, Exchange, Sharepoint, Plugfest ODF,

Office 365, Exchange, Sharepoint, Plugfest ODF, LibreOffice 3, OpenOffice.org 3,
ODF, OOXML,ISO, OASIS, Gnumeric,Google Docs, Softmaker, EuroOffice, WebODF, Zoho, AbiWord, Calligra,

Inline image 1

VBA Access - Criando uma query com número da página - Creating a MS Access query with page number



Aprenda a criar um query com os números de página para acompanhamento.

let $result = mysql_query("SELECT * FROM tname WHERE year='$y' ORDER BY date DESC LIMIT $pg, $limit");
ResultSet 
rs=sta.executeQuery("SELECT top 100 * FROM tname WHERE year='$y' ORDER BY date DESC");

Reference::


Tags: SQL, Access, record, occurs

Inline image 1

VBA Access - Retornando o número de Registros - Generic function to return number of records



Esta função retorna o número de registros de uma string SQL.

Dim lngRecs as Long
Dim strSQL as String

strSQL = "SELECT * from tblNames"

lngRecs = funRecordCount(strSQL)

Public Function funRecordCount (strSQL As String) As Integer
Dim dbs As Database
Dim rst As Recordset

On Error GoTo Error_funRecordCount
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(strSQL, dbOpenSnapshot, dbSeeChanges)

' Find the number of records. First test records were found.
If (rst.EOF = True) And (rst.BOF = True) Then
funRecordCount = 0 ' No records found
Else
rst.MoveLast ' End of the recordset
funRecordCount = rst.RecordCount ' Number of records
End If

Exit_funRecordCount:
On Error GoTo 0
Set dbs = Nothing
Set rst = Nothing
Exit Function

Error_funRecordCount:
MsgBox "An unexpected situation arose in your program." & funCrLf & _
"Please write down the following details:" & funCrLf & funCrLf & _
"Module Name: modGeneric" & funCrLf & _
"Type: Module" & funCrLf & _
"Calling Procedure: funRecordCount" & funCrLf & _
"Error Number: " & Err.Number & funCrLf & _
"Error Descritption: " & Err.Description

Resume Exit_funRecordCount
End Function

Reference::


Tags: SQL, Access, record, occurs

Inline image 1

VBA Access - Criando tabelas temporárias no Banco de dados MS Access - Creating temporary tables in MS Access DB



Não é raro necessitarmos de tabelas temporárias para fazermos testes, mas como criá-las?

SELECT * INTO tempTable FROM myTable WHERE myTable.id_MyTable IS NULL
       
INSERT INTO myTable SELECT * FROM tempTable
DROP temptable
       
SELECT "X" AS MyId, 1 AS F1, 1 AS f2 INTO MyTempTable

Para simular os demais testes abaixo, certifique-se de abrir o Northwind, nosso banco de dados de exemplo.

Este exemplo cria uma nova tabela chamada 'ThisTable' com 2 campos texto.

Sub CreateTableX1()
    Dim dbs As Database

    ' Modifique este linha para incluir o path do Northwind no seu computador.
    Set dbs = OpenDatabase("Northwind.mdb")

    ' Cria uma tabela com 2 campos texto.
    dbs.Execute "CREATE TABLE ThisTable " _
        & "(FirstName CHAR, LastName CHAR);"

    dbs.Close
End Sub

O exemplo abaixo cria uma nova tabela chamada 'MyTable' com 2 campos texto, um campo Date/Time, e um único índice para os três campos.

Sub CreateTableX2()
    Dim dbs As Database

    ' Modifique este linha para incluir o path do Northwind no seu computador.

    Set dbs = OpenDatabase("Northwind.mdb")

    ' Cria uma tabela com três campos e u múnico índice para os três.
    dbs.Execute "CREATE TABLE MyTable " _
        & "(FirstName CHAR, LastName CHAR, " _
        & "DateOfBirth DATETIME, " _
        & "CONSTRAINT MyTableConstraint UNIQUE " _
        & "(FirstName, LastName, DateOfBirth));"

    dbs.Close
End Sub

O exemplo abaixo cria uma nova tabela chamada 'MyTable' com 2 campos texto e um campo Integer. O campo 'SSN' contém a chave primária (primary key).

Sub CreateTableX3()
     Dim dbs As Database

    ' Modifique este linha para incluir o path do Northwind no seu computador.
    Set dbs = OpenDatabase("Northwind.mdb")

    ' Cria uam tabela com três campo e uma chave primária (primary key).
    dbs.Execute "CREATE TABLE NewTable " _
        & "(FirstName CHAR, LastName CHAR, " _
        & "SSN INTEGER CONSTRAINT MyFieldConstraint " _
        & "PRIMARY KEY);"

    dbs.Close
End Sub

Também poderíamos criar um função que copiasse uma tabela sem os seus registros.

Public Sub subCreateTableCopy(strTableName As String)
' Cria a cópia temporária de uma tabela com o prefixo 'temp'
Dim dbs As Database
Dim tdf As TableDef
Dim strTempTable As String

On Error GoTo Error_subCreateTableCopy

Set dbs = CurrentDb

Let strTempTable = "temp" & strTableName 

' Checa se a tabela existe e deleta-a
For Each tdf In dbs.TableDefs
    If tdf.Name = strTempTable Then
        DoCmd.DeleteObject acTable, strTempTable
        GoTo DeletedTable
    End If
Next

' Cria a cópia da tabela antes de atualizá-la.
DeletedTable:
DoCmd.CopyObject , strTempTable, acTable, strTableName ' Create the copy

Exit_subCreateTableCopy:
Exit Sub

Error_subCreateTableCopy:
MsgBox "Erro " & Err.Number & " - " & Err.Description
Resume Exit_subCreateTableCopy
End Sub

Reference::
http://msdn.microsoft.com/en-us/library/bb177893(v=office.12).aspx

Tags: SQL, Access, create, select, UDF, Statement, Table, 

Inline image 1

SQL Access - Selecionando registros especificados dentro de um período - Select specified amount of rows older than specified datetime



Construir scripts SQL é uma arte aliada a um bom conhecimento técnico. De vez em quando é bom nos aprofundarmos um pouco mais sobre as limitações e alcance do comandos e cláusulas SQL. Por exemplo, é bom saber que:

Há um limite no número de ANDs que você pode usar em uma instrução SQL SELECT não documentado. O limite é 99 ANDs e numa cláusula WHERE é de 99 ANDs em uma cláusula HAVING

Microsoft Access retornará as seguintes mensagens de erro quando exceder esse limite: 
Expressão muito complexa
- ou -
Consulta é muito complexa.

O erro também pode ocorrer se a consulta incluir uma expressão de função Switch() que contenha mais de 13 conjuntos de argumento. A solução alternativa é criar uma função definida pelo usuário (UDF) que incorpore a instrução Select Case e chamá-la da consulta.

Existem processos que precisam estar submetidos a períodos como datas e horários. Também é necessário submetê-los a um ranking e etc... Como podemos efetuar essas cláusulas em tabelas, de modo que fiquem condicionados aos períodos, horários e de um modo ranqueado? O modo como escrevemos o nosso código SQL é que definirá o retorno da nossa consulta. Por isso demonstro algumas técnicas de como isso pode ser feito (Divirtam-se):

' Este código retorna todos os emails cadastrados numa tabela chamada
"Mails" , cujo o campo "timeReceived" (que registrou a gravação dos
' registros) tenha ocorrência com o período inferior a '2012-04-28 08:53:00'.
 
"SELECT * FROM ( SELECT * FROM Mails WHERE (timeReceived < '2012-04-28 08:53:00' ) )";
 
Este código retorna todos os emails cadastrados numa tabela chamada
"Mails" , cujo o campo "timeReceived" (que registrou a gravação dos
' registros) tenha ocorrência com o período igual a '2012-04-28 08:53:00'. 
' Ordenando o resultado pela coluna timeReceived em ordem descendente.

"SELECT * FROM Mails WHERE (timeReceived =  '2012-04-28 08:53:00' ) ORDER BY timeReceived DESC";

Este código retorna todos os 30 primeiros emails cadastrados na tabela
"Mails", cujo o campo "timeReceived" (que registrou a gravação dos
registros) tenham ocorrência com o período inferior a '2012-04-28 08:53:00'.
Ordenando o resultado pela coluna timeReceived em ordem descendente.

SELECT TOP 30 * FROM Mails WHERE timeReceived  < '2012-04-28 08:53:00'  ORDER BY timeReceived DESC

Este código retorna todos os 25 primeiros emails cadastrados na tabela
"Students", cujo o campo "GraduationYeartenham ocorrência com o período
' igual a '2012'Ordenando o resultado pela coluna GradePointAverage em
' ordem descendente.

SELECT TOP 25
FirstName, LastName
FROM Students
WHERE GraduationYear = 2003
ORDER BY GradePointAverage DESC

Este código retorna todos os 30 primeiros emails cadastrados na tabela
"Mails", cujo o campo "timeReceived" seja inferior a '2012-04-28 08:53:00'.
Ordenando o resultado pela coluna GTimeReceived em ordem descendente e
Ordenando a coluna MailID em ordem crescente

SELECT TOP 30 *
FROM Mails
WHERE timeReceived < '2012-04-28 08:53:00'
ORDER BY timeReceived DESC, MailID ASC
   
Este código retorna todos os 30 primeiros emails cadastrados na tabela
' "Mails", cujo o campo "timeReceived" seja inferior a '2012-04-28 08:53:00'.
Ordenando o resultado da coluna GTimeReceived em ordem descendente

SELECT top 30 *
FROM Mails
WHERE timeReceived < '2012-04-28 08:53:00'
ORDER BY timeReceived desc
Reference::
http://office.microsoft.com/en-us/ac...313511033.aspx
http://office.microsoft.com/en-us/ac...314971033.aspx

Tags: SQL, Access, Top, descend, ANDs, AND, HAVING, SELECT, DESC, ASC, UDF

Inline image 1

LinkWithinBrazilVBAAccessSpecialist

Related Posts Plugin for WordPress, Blogger...

Vitrine