Introdução
Tabelas
Relacionamentos
 Consultas
Formulários
 Relatórios
 Macros
Módulos
ActiveX
 AutomaçãoOLE
 Gráficos
 DAO
 SQL
 Segurança
Redes/ODBC
 Dicas
 Curso Online
Wizards
Ferramentas
Help
 Downloads
 Links
Novidades
FAQs
Index

DICAS



Dicas2 - Como esta seção engordou um pouco, nasceu uma filha. Dicas Novas.

Dicas Preferidas

Deixar na memória o programa e ser executado numa determinada hora! *
Retornar que dia, mês e ano será de hoje a daqui 1 mes e 48 dias, por exemplo. *
Transformar .mdb em .txt *
Senha apenas para o Banco de Dados no Access 2 *
Acessar a porta paralela do computador usando o Visual Basic *
Mudar de campo com a tecla enter, pois só consigo com o TAB *
Definir ENTER para saltar de campos, e não emitir um Beep após o ENTER ser pressionado *
Ler o número do HD para mostrar ao usuário do programa o número em uma tela *
Atualizar um TextBox automaticamente ao preencher um determinado item no DBCombo *
Somar o conteúdo de um campo e exibi-lo em uma textbox *
Texto de uma caixa de texto selecionado quando a caixa tiver com o foco *
Impor uma período de funcionamento para meu programa *
Ao digitar o ponto do teclado numérico, o progrma interprete como vírgula *
Consulta em várias tabelas *
Criar um campo numérico com duas casas decimais em uma determinada tabela, através de código *
Como registrar um OCX *
Aplicação Multiusuária com Windows 3.11 *
IMPRIMIR ARQUIVO TEXTO *
Ler arquivo do Excel no VB ou Access *
Parábola *
Como uma barra de progresso estabelecer o mínimo (0%) como sendo o inicio da copia de alguns arquivos e o máximo (100%) como o final? *
Pegar somente os 2 primeiros dígitos de um número *
Número de Linha em Arquivo Texto *
Acelerando Código *
Botão de Comando Redondo *
Fazendo AutoNumeração voltar a iniciar de 1 novamente

Deixar na memoria o programa e ser executado numa determinada hora!

(Exemplo: às 17:30).

: Eh por forma Hide ??

Uma forma é colocar no Form um controle Timer e testar nele se chegou determinada hora.

Ex:

Private Sub Timer1_Timer()

If format(now,"hh:nn") = "17:30" then call Aciona_Rotina

end sub
 

Retornar que dia, mês e ano será de hoje a daqui 1 mes e 48 dias, por exemplo.

: Ja tentei criar uma funcao,contudo devido a variações dos dias dos meses e ainda de anos bissextos, acabei desistindo.

Caro Alexandre

Você deve usar a Função dateAdd a sintaxe você pega no

Help do VB, mais a Solução Seria:

DateAdd("d",78,Now)

o "d" significa que Vou somar dias 78 = 1 mes e 48 dias
 

Transformar .mdb em .txt

Existe dois métodos:

1- usando o arquivo txt como se fosse uma tabela de um banco de dados e usar comandos

SQL para transportar os registros (nunca me lembro dos comandos)

2- usando programação, como segue:

Tabela.MoveFirst

open "arquivo.txt" for output as #1

do while not Tabela.EOF

print #1, tabela!campo1 & vbtab & tabela!campo2 & vbtab ....

tabela.MoveNext

loop

close #1

(cria um arquivo com campos de tamanho variavel separados por TAB)
 
 

Senha apenas para o Banco de Dados no Access 2

Eu tenho um Banco de Dados no Access e não gostaria de deixar que o usuário pudesse abri-lo e fazer as alterações que achasse "melhor", pois talvez o programa não funcionaria corretamente, portanto gostaria de acessar o banco de dados protegido apenas através do programa.

Obs.: Isso para o Acces2, que não tinha o recurso de senha apenas para o Banco de Dados.

: Desde já agradeço,

: Batata

Use:

Set BancoDeDados = OpenDatabase("C:\BANCO DE DADOS.MDB", False, False, ";pwd=suasenha")

A senha é case sensitive.
 
 

Acessar a porta paralela do computador usando o Visual Basic

é simples:

open "lpt1" as #1

print #1, "texto"

close #1
 
 

Mudar de campo com a tecla enter, pois só consigo com o TAB

No evento Keypress insira o seguinte código:

If KeyAscii = 13 then

SendKeys "{TAB}"

KeyAscii = 0

End If
 
 

Definir ENTER para saltar de campos, e não emitir um Beep após o ENTER ser pressionado

Existe mais duas formas de fazer isso:

Se voce quer que o efeito do ENTER funcione para todos os controles

presentes no formulario:

1) No evento Form_KeyPress insira o codigo:

If KeyAscII = 13 then

SendKeys "{Tab}"

KeyAscII = 0

endif

2) Altere a propriedade KeyPreview do Form para True

Se voce quer que o efeito do ENTER funcione num controle em

especifico:

1) No evento KeyPress do controle insira o codigo:

If KeyAscII = 13 then

SendKeys "{Tab}"

KeyAscII = 0

Endif
 
 

Ler o número do HD para mostrar ao usuário do programa o número em uma tela

Prezado Eduardo,

Segue a rotina para verificação do Serial Number de qualquer unidade

registrada no Windows 95 ou Windows NT

'Declaração da API, só funciona em VB32bits (4 ou 5)

Private Declare Function GetVolumeInformation Lib "Kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long

Private Sub mostra_serial()

Dim lVSN As Long, n As Long, s1 As String, s2 As String

Dim unidade As String

Dim sTmp As String

On Local Error Resume Next

'especifica-se o diretorio raiz

unidade = "C:\"

'Reservando espaço para os string que serão passados para a API

s1 = String$(255, Chr$(0))

s2 = String$(255, Chr$(0))

n = GetVolumeInformation(unidade, s1, Len(s1), lVSN, 0, 0, s2, Len(s2))

's1 terá o label da unidade

'lVSN terá o serial number

's2 indica o tipo de gravação de arquivo (se FAT, etc...)

'Numero IVSN (serial number) é convertido para hexadecimal para ser mostrado como no DIR

sTmp = Hex$(lVSN)

Label3(0) = s1

Label3(1) = Left$(sTmp, 4) & "-" & Right$(sTmp, 4)

Label3(2) = s2

End Sub
 

Somar o conteúdo de um campo e exibi-lo em uma textbox

Gilda Gomes,

Vamos admitir que o TextBox destino seja Text1, a tabela contendo o campo Valor se chame Tabela1, e que o banco de dados onde está Tabela1 seja Banco1.MDB:

Sub Exemplo()

Dim BD as Database

Dim strSQL as String, auxRS as Recordset

Set BD = Workspaces(0).OpenDatabase("Banco1.MDB")

strSQL = "select sum(Valor) as Soma" & _

" from Tabela1"

Set auxRS = BD.OpenRecordset(strSQL)

if Not IsNull(auxRS!Soma) then

Text1 = auxRS!Soma

End If

auxRS.Close

BD.Close

End Sub
 

Texto de uma caixa de texto selecionado quando a caixa tiver com o foco

Sim, isso é possível.

No evento GotFocus, escreva:

Text1.SelStart = 0

Text1.SelLength = Len(Text1)
 
 

Impor uma período de funcionamento para meu programa

Prezado Silva,

Não vou escrever a rotina para você, mas tenho uma idéia e vou expo-la:

1-Na primeira execução do seu sistema, já na tela de abertura, verifique se é a primeira vez que o sistema é rodado. Para tal, crie um banco de dados ou então um arquivo binario qualquer que registre a data do primeiro acesso. É fácil, se a data do primeiro acesso estiver vazia, então é a primeira vez que o usuário acessa o sistema. Caso não queira usar arquivos ou então banco de dados para fazer isso, você também pode usar o registro do Windows. Pesquise no help a utilização dos comandos GETSETTING, DELETESETTING E SAVESETTING. Esses comandos com certeza resolvem esse problema, pois permitem que você, ao rodar o software pela primeira vez, grave no registro a data.

2-Caso o usuário já tenha acessado, some a data do primeiro acesso ao numero de dias que o usuário poderá utilizar o seu sistema.

3-Compare o resultado com a data atual do windows (função DATE). Caso a data seja maior que a data do sistema, então o usuário ainda não ultrapasso o limite de utilização. Caso contrário, faça com que o sistema "caia", usando uma função EXIT SUB por exemplo.

Espero ter ajudado,
 
 

Ao digitar o ponto do teclado numérico, o progrma interprete como vírgula

Parq que isso ocorra, tenho usado uma conversão no KEY PRESS // Format (CCUR(VAL( TEXTBOX.TEXT)), ##,##0.00), 9), porém, ao utilizar este textbox para uma soma/divisão com outros valores, o número sempre sai arrendondado, ou com um desvio de 0,02.

Oi Paulo,

Para transformar ponto em virgula eu uso o seguinte

codigo no evento KeyPress:

char = Chr(KeyAscii)

If char = "." Then KeyAscii = 44 ‘intercepta o ponto e substitui pela vírgula

O problema e que se voce for usar o valor da textbox para fazer outros calculos, como parece ser o seu caso, o VB nao vai reconhecer a virgula como separador de decimais. Tive muita dor de cabeca com isso, mas arranjei uma solucao bisonha, mas que funciona.

O codigo vai abaixo:

valor = Txtvalor.Text

pos = InStr(valor, ",") 'captura a posição da vírgula na string

If pos <> 0 Then 'se o numero não tem vírgula, InStr=0

stresq = Left(valor, (pos - 1)) 'captura a parte inteira

strdir = Right(valor, (Len(valor) - pos)) 'captura a parte decimal

valor = stresq & "." & strdir 'concatena com um ponto

Else

valor = Val(TxtValor.Text) 'no caso do número não ter vírgulas

End If
 
 

Consulta em várias tabelas

Por exemplo , se eu tiver várias tabelas e quiser fazer uma consulta em todas ao mesmo tempo e emitir um relatório desta consulta . Como devo proceder ???

Ai vai Ale...

Você não informa onde quer fazer as pesquisas...

No VB vc pode usar o comando SQL a seguir:

Dim sSqlCode as String

Dim lObjConsulta as Object

sSqlCode = ""

sSqlCode = sSqlCode & "Select * "

sSqlCode = sSqlCode & "From Tabela1, Tabela2, Tabela3, Tabela4, ... "

sSqlCode = sSqlCode & "Where Condicao"

Set lObjConsulta = VariavelDoBancoDeDados.openrecordset(sSqlCode, snapshot)

If lObjConsulta.bof and lObjConsulta.eof then 'nao foi encontrado nenhum registro que satisfaca a condicao

..

..

..

..

Else

objeto1 = lObjConsulta.fields("campo1")

objeto2 = lObjConsulta.fields("campo2")

objeto3 = lObjConsulta.fields("campo3")

objeto4 = lObjConsulta.fields("campo4")

..

..

..

..

End If
 
 

Criar um campo numérico com duas casas decimais em uma determinada tabela, através de código

Criei meus arquivos via código, mas não consigo armazenar numero com casas decimais.

Marcelo,

Verifique se o tipo do campo que você criou é algo como dbSingle, dbDouble ou um dos demais tipos listados no Help que comportam casas decimais; no Help, também, estão os limites de cada tipo.
 
 

Como registrar um OCX

Luiz,

você pode registrar da seguinte forma:

c:\vb\tools\regsvr32 c:\windows\system\keysta32.ocx

Uu então:

C:\WINDOWS\SYSTEM\Regsvr32.exe RText.ocx

Se você quizer desregistrar use

c:\vb\tools\regsvr32 /u c:\windows\system\keysta32.ocx

Ou:

C:\WINDOWS\SYSTEM\Regsvr32.exe /u RText.ocx
 

Aplicação Multiusuária com Windows 3.11

Estou desenvolvendo uma aplicação multiusuária para o ambiente Windows for Workgroup. Quero abrir uma tabela compartilhada para dois terminais, onde possa incluir, alterar e excluir na mesma tabela e ao mesmo tempo. Devo utilizar o acesso direto a uma Table ou utilizo Dynaset? O Que é melhor?

Resposta do MarcusVinicius: Para atualização tanto faz. O Table é mais rápido do que o Dynaset, mas se você for fazer pesquisa, o Dynaset é mais indicado, uma vez que ele permite que a consulta seja feita por qualquer campo, independente de ser ou não chave e o Table exige que o mesmo seja chave primária.
 

IMPRIMIR ARQUIVO TEXTO

Método para imprimir um arquivo texto, sem ter que abri-lo:

"print app.path & "\arquivo.txt"
 

Ler arquivo do Excel no VB ou Access

A forma mais simples e que eu usaria seria gerar um TXT, o excel tem essa opção Salvar como.. e então facilitaria a criação de uma interface em Visual Basic para "ler" estes dados. Para ler este arquivo TXT, cria-se um Type como variável de leitura e abrir o arquivo como randon.
 

Parábola

1 - É Possível fazer uma parábola?

A maneira mais fácil de se traçar uma curva é usando coordenadas polares. A equação da parábola é:

ro= p / (1 - cos(alfa))

onde p é a distância que a parábola corta o eixo dos x.

Para o traçado de um programinha seria mais ou menos assim:

p = 1

a = 0

ang = a * 3.141592/180

ro = p / (1. - cos(ang)

xa = cos(ang) * ro

ya = sin(ang) * ro

pset (xa,ya)

for a = 0 to 360 step 5

ang = a * 3.141592/180

ro = p / (1. - cos(ang)

xa = cos(ang) * ro

ya = sin(ang) * ro

line -(xa,ya)

next a

Eu não testei, mas acredito que esta certo. Eu fiz de 0 a 360, isto fará a curva ser traçada de - a + infinito.
 

Como uma barra de progresso estabelecer o mínimo (0%) como sendo o inicio da copia de alguns arquivos e o máximo (100%) como o final?

Se você tem n arquivos para passar para porcentagem é:

for a= 1 to n

perc = a*100/n

manda para o slicer o perc

next a
 

Função Rnd realmente randômica

Função Rnd sempre é constante. Por exemplo: quando coloco ela variando de 0 a 100 o primeiro valor sempre é 95 o segundo 51 o terceiro 37 e assim por diante... gostaria então de algum jeito que realmente fosse randômico.

------

O problema é que você está dando sempre a mesma semente, no randomize(), use o timer como semente, ai cada vez será uma nova sequência de némeros.
 

Pegar somente os 2 primeiros dígitos de um número

Tenho por exemplo um numero 3,531309834738E 04 tem como eu pegar somente

as 2 primeiras casas desse número?

Se você está necessitando do número mesmo, e não de uma representação dele seria alguma coisas assim:

numero= 3.14159265

num = val(format(numero,"0.00"))

se você quizer mais precisão mude o "0.00" para "0.000" e assim por diante.
 

Número de Linha em Arquivo Texto

1) Ajuda!!! Alguém sabe como gerar o número de linhas de um arquivo

texto (formato lista)?

Se for para colocar o numero da linha antes da linha, basta vc fazer:

open "seutexto.txt" for input as #1

open "Temp.txt" for output as #2

while not EOF(1)

line input #1, strTemp

Conta = Conta + 1

print #2, Format(Conta,"000") + strTemp

wend

Close #1

Close #2

kill "seutexto.txt"

Name "Temp.txt" as "seutexto.txt"

OUTRA:

Para contar o número de linhas, vc tem q ler linha a linha e ir contando, por exemplo:

Open "c:\autoexec.bat" for input as #1

Do Until Eof(1)

Line Input #1, Linha

Contador = Contador +1

loop

Close #1

msgbox "O Autoexec.bat tem " & Contador & " Linhas"
 

Acelerando Código

1. Você poderia usar nomes mais esclarecedores para suas variáveis. Fica mais claro.

2. Antes de começar um bloco grande que faz uma coisa só, coloque um comentário.

3. Divida o programa em procedimentos.

4. Estabeleça tipos fixos para as variáveis (String, Integer, Boolean, etc.).
 

Botão de Comando Redondo

De qualquer forma, aí vai uma dica para você construir um botão redondo:

INGREDIENTES:

3 controles Shape (estilo Circle)

1 controle Label

bastante paciência

e muita criatividade!

MODO DE FAZER:

Insira um frame no form e coloque a propriedade BorderStyle = 0 (nenhuma).

Dentro do frame, crie o botão superpondo os três shapes de forma a criar um efeito 3D:

Um shape (ShapeCima) deve ter ser preenchido com uma cor clara (branco ou cinza claro) e o outro (ShapeBaixo) com cor escura (preto ou cinza escuro). Posicione-os como um 8. O terceiro shape (ShapeFace) irá sobrepor os demais. Ajuste as propriedades Left e Top de ShapeCima e ShapeBaixo para dar idéia de luz e sombra. Lembre-se que ShapeCima e ShapeBaixo devem ser maiores que ShapeFace.

Monitore os eventos MouseDown e MouseUp do frame, assim você fica sabendo se o botão foi apertado ou não.

Observe que um botão tradicional recebe "luz" no lado esquerdo e no de cima, fazendo sombra em baixo e à direita quando ele está para cima.

Você deve fazer o mesmo com o botão redondo. Nos eventos MouseUp e MouseDown troque as propriedades de FillColor de ShapeCima e ShapeBaixo. Assim você vai obter o efeito de apertado e solto.

O frame entra na história apenas para responder aos eventos e para que algumas de suas propriedades sejam usadas como, por exemplo, TooltipText.

É claro que aqui descrevi apenas o básico, mas um botão tem propriedades e eventos que um frame não tem. Assim, será preciso escrever código para simular tudo isso. É aí que entram os ingredientes principais paciência e criatividade.

Você pode construir um novo controle, de forma que se possa alterar o tamanho do botão, cor da face, alterar o caption, etc.
 

Transformar Arquivo TXT em Tabela

Como fazer para transformar um arquivo .txt, para uma tabela do Visual Basic 5.0

Depure estas linhas que eu tirei de um programa que desenvolvi:

Set BancoDeDados = OpenDatabase("C:\VisualRota\VisualRota.mdb")

'APAGAR AS TABELAS EXISTENTES PARA GERAR AS NOVAS.

BancoDeDados.Execute "DROP TABLE CGOR0770"

'CRIA TABELAS NA MEMORIA

Set TabelaTemporariaDEF = BancoDeDados.CreateTableDef("CGOR0770")

'REALIZA REFERENCIA DAS TABELAS AO DIRETÓRIO DO ARQ TEXTO.

TabelaTemporariaDEF.Connect = "TEXT;DATABASE=C:\VisualRota\"

'CRIA RELACAO COM O ARQ. TEXT ESPECIFICO

TabelaTemporariaDEF.SourceTableName = "arq770.txt"

'CRIA O ARQUIVO

BancoDeDados.TableDefs.Append TabelaTemporariaDEF

'DELETA TODOS OS REGISTROS EXISTENTES NAS TABELAS DEFEITOS

BancoDeDados.Execute "DELETE * FROM DEFEITOS;"

'COPIA A TABELA RELACIONADA COM O ARQUIVO TEXTO PARA UMA OUTRA TABELA

BancoDeDados.Execute "INSERT INTO DEFEITOS SELECT * FROM CGOR0770;"

OBS: Me desculpe eu esqueci que vc ainda tem que definir o arquivo Schema.ini com a estrutura do seu arquivo!

Outro detalhe, esta rotina só funcionará se o seu arquivo texto estiver todo alinhado em colunas, permitindo desta forma definir os campos!

Fazendo uma mensagem Piscar em Formulário

Para fazer uma mensagem de um controle piscar em um Formulário:

Crie um controle Rótulo chamado lblPiscador e digite uma palavra qualquer como Caption.

- No Evento No Cronômetro do Formulário colocar o código:

    Me!lblPiscador.visible = not Me!lblPiscador.visible

- Mude a Propriedade Intervalo do Cronômetro para 500 (altere a gosto).

Esta dica foi enviada por Osiris Gopfert Moreira (a335@petrobras.com.br) para a revista Forum Access.
 

Fazendo AutoNumeração voltar a iniciar de 1 novamente
 

Alterar o valor inicial de um campo AutoNumeração

Para uma nova tabela que ainda não possua registros, você pode alterar o valor inicial de um campo AutoNumeração que tenha sua propriedade Novos Valores definida com Incremento para um número diferente de 1. Para uma tabela que possua registros, você também pode utilizar esse procedimento para alterar o próximo valor atribuído a um novo número em um campo AutoNumeração.

1 Crie uma tabela temporária com apenas um campo, um campo Número; defina sua propriedade Tamanho do Campo com Inteiro Longo e dê a ele o mesmo nome do campo AutoNumeração na tabela cujo valor você deseja alterar.

2 No modo Folha de Dados, digite um valor no campo Número da Tabela temporária que seja 1 a menos do que o valor inicial que você deseja para o campo AutoNumeração. Por exemplo, se você desejar que o campo AutoNumeração comece em 100, digite 99 no campo Número.
3 Crie e execute uma consulta acréscimo para acrescentar uma tabela temporária à tabela cujo valor AutoNumeração você deseja alterar.

Observação   Se a sua tabela original possuir uma chave primária, você deverá removê-la temporariamente antes de executar a consulta acréscimo. Da mesma forma, se a sua tabela original tiver campos que possuam a propriedade Requerido definida como Sim, a propriedade Indexado definida como Sim (Duplicação não autorizada) ou as definições da propriedade RegraDeValidação do campo e/ou do registro que impedem entradas Nulas nos campos, você deverá desativar temporariamente essas definições.

4 Exclua a tabela temporária.
5 Exclua o registro adicionado pela consulta acréscimo.
6 Se você teve que desativar as definições de propriedade no passo 3, retorne-as às suas definições originais.

Quando você insere um registro na tabela remanescente, o Microsoft Access utiliza um valor do campo AutoNumeração igual ao valor inserido na tabela temporária mais 1.

Observação   Se você desejar compactar o banco de dados depois de alterar o valor inicial de AutoNumeração, certifique-se de adicionar primeiro pelo menos um registro à tabela. Se não fizer isso, quando compactar o banco de dados, o valor de AutoNumeração do próximo registro adicionado será redefinido como 1, mais o maior valor anterior. Por exemplo, se não havia registros na tabela quando você redefiniu o valor inicial, a compactação definirá o valor de AutoNumeração para o próximo registro adicionado como 1; se havia registros na tabela quando você redefiniu o valor inicial e o maior valor anterior era 50, a compactação definirá o valor de AutoNumeração para o próximo registro adicionado como 51.


1