Ir para conteúdo
Fórum Script Brasil
  • 0

Programação Reativa VBA


Josué Paulo

Pergunta

Olá a todos,

Minha primeira pergunta no fórum.

Já tentei muito, mas não achei a solução, nem sei se existe, peço humildemente a ajuda de vocês.

tenho vários pcs rodando cada um o seu sistema na empresa, o banco de dados (access) fica em unidade de rede compartilhada, todos as maquinas fazem consultas e alterações no BD, porem preciso que o BD avise os outros sistemas que sofreu alteração e atualizar as informações automaticamente.

o que eu penso: Cada sistema tem uma macro que roda marcando as horas. Tenho um botão(macro) que atualiza os dados. Cada sistema quando faz alteração no BD, ele mesmo já se atualiza, quando a alteração no BD foi feita por outro pc a atualização tem que ser feita manualmente (através do botão). Penso que será possível colocar uma condição bolleana dentro da macro horas, se ela for true então atualiza, se o BD sofrer alguma alteração então o BD altera a variável para true dos sistemas que estiverem abertos para que eles façam a atualização automática.

O sistema é feito em excel. 5 pcs tem o mesmo sistema em seu disco C:, porém com nomes diferente, todos os sitemas usam o mesmo BD que fica em uma local da rede compartilhada. todos os pcs estao conectados na mesma rede.

tenho conhecimento em VBA excel, não tenho conhecimento algum no VBA Access, nunca sequer fiz uma macro no Access.

se não fui claro o suficiente, não excite em perguntar.

alguém pode me ajudar?

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

sim, poderia, mas eu não sei como fazer isso, quando tento conectar um arquivo com outro(criar referencia) o vba so cria referencia se o arquivo estiver na mesma maquina e não pode estar aberto em outra maquina, tentei criar referencia no vba para alterar o valor da variavel, coloquei os 5 arquivos, na mesma pasta compartilhada na rede, quando abre o arquivo que tem referencia, ele não deixa abrir.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom eu nunca testei isso, mas se no BD você criar uma macro que atualiza as planilhas, por exemplo "Update_FrontEnd". 

E da planilha que está fazendo a alteração, chamar a macro:

 

Ex.:

Dim strDatabasePath As String
Dim appAccess as object

Set appAccess = VBA.CreateObject("Access.Application")
 
strDatabasePath = "C:\Users\Usuaro\Desktop\BD.accdb"
With appAccess
    .OpenCurrentDatabase strDatabasePath
    .Run "Update_FrontEnd"
    .Quit
End With
Set appAccess = Nothing

Edit.:

No Banco de Dados criar a macro que atualiza planilhas.

Exemplo: 

Public Function Update_FrontEnd()
    Dim sql      As String
    Dim icol     As Long
    Dim rs       As Recordset
    Dim objExcel As Object
    Dim sh       As Object
    
    Set objExcel = CreateObject("Excel.Application")
                   ' abre a pasta de trabalho
    Set objExcel = VBA.GetObject("C:\Users\usuario\Desktop\Arquivo\Pasta_de_trabalho.xlsm")
    Set sh = objExcel.Worksheets("Bancodedados") 'seta a aba

    sql = "SELECT * from Sua_Tabela"
    
       On Error GoTo Error_Qr
    Set rs = CurrentDb.OpenRecordset(sql)
       On Error GoTo 0
    
    If Not rs.EOF Then
       ' add nome dos campos do bd
        For icol = 0 To rs.Fields.Count - 1
            sh.Cells(1, icol + 1).Value = rs.Fields(icol).Name
        Next
       
        sh.Cells(2, 1).CopyFromRecordset rs ' cola os dados

        sh.Cells.EntireColumn.AutoFit
     
        objExcel.Close saveChanges:=True
        Set rs = Nothing
        Set sh = Nothing
       
    End If
    Exit Function
    
Error_Qr:
    MsgBox "Error: " & Err.Description, vbCritical
    Exit Function
End Function

 

Editado por Basole
Link para o comentário
Compartilhar em outros sites

  • 0

Olá Basole,

Vou tentar isso Basole, porém, como vou saber quais são arquivos do Excel que estão em execução no momento?

Set objExcel = VBA.GetObject("C:\Users\usuario\Desktop\Arquivo\Pasta_de_trabalho.xlsm")

exemplo, eu poderia colocar todos os arquivos em uma pasta (JLT_Sistema) na rede, cada pc acessaria o seu arquivo, quando fosse chamado a UpdateFront_End eu faria um for para atualizar todos os arquivos da pasta, certo, mas atualizar só os arquivos que já estão em execução, isso eu não sei fazer, qual linha de codigo vba retorna se um arquivo já está em execução?

outra coisa, quando faço a solicitação para um arquivo1 fazer a alteração no arquivo2, não sei fazer de forma que o arquivo2 seja alterado sem ser "aberto", ou seja, meus arquivos, já iniciam com forms, e o excel em oculto, quando faço a interação entre eles, ao processo inicia-se no Workbook_Open, se houver como "abrir" um arquivo que já está em execução em outro pc, isso me gera problemas mesmo assim, porque o processo vai aguardar o fechamento do form.

exemplo:

Private Sub Workbook_Open()
    wbClose = False
    Inicializacao = True
    Call WorkbookOpen
    TelaPrincipalTelaG.Show  
End Sub
 

o processo para na ultima linha de codigo, se eu colocar unload (TelaPrincipalTelaG) vai atrapalhar todo o processo do operador que já esta trabalhando na máquina

eu ainda penso Basole, que o mais ideal seria uma forma de a UpdateFront_End acessar a memória de cada arquivo em execução, e localizar a bolleana que autoriza a alteração, alterar o seu valor, isso tudo sem abrir o arquivo, e sem atrapalhar o que já esta sendo executado no arquivo em questão. Não sei se isso é possivel, se for não sei como fazer.

 

vou executar o seu exemplo acima durante a proxima semana, assim que tiver resultados lhes apresento os feedbacks.

grato desde já

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...