SUB-ROTINA EXECUTADA POR UMA FUNCAO
Boa tarde, Galera.
Sou novato neste grupo e preciso uma ajuda para resolver uma coisa de VBA.
Sei a principal diferença entre uma função e sub-rotinas. Funções retornam valores enquanto sub-rotinas não retornam nada.
Bom, vou colocar aqui o detalhes do que estou querendo fazer.....
Tenho essa sub-rotinas [Ô]btnGeral_Click[Ô]
Private Sub btnGeral_Click()
Dim wsql As String
Dim wdb As Database
Set wdb = CurrentDb
Texto84.SetFocus
Texto84 = [Ô][Ô]
Texto84 = Time
wsql = [Ô]delete * from RotasSem [Ô]
wdb.Execute (wsql)
wsql = [Ô]delete * from RotasNGN[Ô]
wdb.Execute (wsql)
Call CarregaUMG
Call CarregaHIG
Texto65 = [Ô]FIM[Ô]
Texto85.SetFocus
Texto85 = [Ô][Ô]
Texto85 = Time
End Sub
..................
Dentro dela, faz chamada de outras sub-rotinas como [Ô]CarregaUMG[Ô]
Sub CarregaUMG()
On Error GoTo Fimerro
Dim MyString As String
Dim wsql As String
Dim wdb As Database
Dim wrs As Recordset
Dim wRs1 As Recordset
Dim wi As Integer
Dim wPos As Integer
Dim wBusca As Variant
Dim wPosVirgula As Integer
Dim wPosInicial As Integer
Dim wColuna As Integer
Dim wLinha As Long
Dim K As Double
Dim wDado As Variant
Dim wA As Double
Dim dat As Variant
Dim dt2 As Variant
Dim dt6 As Variant
Dim per As Variant
Dim per1 As Variant
Dim reg As String
Dim per2 As Variant
Dim per3 As Variant
Texto55.SetFocus
dat = VBA.Format(Texto55, [Ô]DD/MM/YYYY[Ô])
dt2 = Left(dat, 2) & [Ô]/[Ô] & Mid(dat, 4, 2) & [Ô]/[Ô] & Mid(dat, 7, 4)
dt6 = DateValue(dt2) + 6
Texto48.SetFocus
Texto48 = [Ô][Ô]
Texto48 = [Ô]Executando[Ô]
Set wdb = CurrentDb
wsql = [Ô]DELETE CaminhoUMG.Nome [Ô] & _
[Ô]FROM CaminhoUMG;[Ô]
wdb.Execute (wsql)
Set wrs = wdb.OpenRecordset([Ô]CaminhoUMG[Ô])
Do While Len(reg)
wrs.AddNew
wrs(0) = reg
wrs.Update
reg = Dir
Loop
wsql = [Ô]SELECT * from RotasNGN[Ô]
Set wrs = wdb.OpenRecordset(wsql)
wsql = [Ô]SELECT * From CaminhoUMG[Ô]
Set wRs1 = wdb.OpenRecordset(wsql)
Do While Not wRs1.EOF
per = wRs1!Nome
per3 = Mid(per, 14, 2) & [Ô]/[Ô] & Mid(per, 11, 2) & [Ô]/[Ô] & Mid(per, 6, 4)
If DateValue(per3) < DateValue(dt2) Or DateValue(per3) > DateValue(dt6) Then
wRs1.Delete
End If
wRs1.MoveNext
Loop
wRs1.MoveFirst
Do While Not wRs1.EOF
per = wRs1!Nome
per1 = Left(per, 20)
per2 = Left(per, 4)
Texto48 = Left(per, 15) & [Ô] - [Ô] & CStr(wLinha)
Do While Not EOF(1)
VBA.DoEvents
Line Input #1, MyString
If wLinha = 0 Then
Line Input #1, MyString
End If
wLinha = wLinha + 1
wColuna = 2
wPosInicial = 1
wPosVirgula = InStr(wPosInicial, MyString, [Ô],[Ô])
If wPosVirgula <> 0 Then
With wrs
If (InStr(MyString, [Ô]ITCP_RN2_[Ô])) <> 1 Then
.AddNew
!Bilhetador = per2
Do While wPosVirgula <> 0
wColuna = wColuna + 1
wDado = Trim(Mid(MyString, wPosInicial, wPosVirgula - wPosInicial))
If wColuna = 3 And wDado = [Ô]X[Ô] Then
Exit Do
ElseIf wColuna = 52 And _
Not IsNull(wDado) Then
Exit Do
Else
.Fields(wColuna - 1) = IIf(Len(wDado) = 0, Null, IIf((wColuna > 4 And wColuna < 10) Or wColuna > 12, (Val(wDado)), wDado))
wPosInicial = wPosVirgula + 1
wPosVirgula = InStr(wPosInicial, MyString, [Ô],[Ô])
If wPosVirgula = 0 Then
wColuna = wColuna + 1
wDado = Mid(MyString, wPosInicial)
.Fields(wColuna - 1) = IIf(Len(wDado) = 0, Null, IIf((wColuna > 4 And wColuna < 10) Or wColuna > 12, (Val(wDado)), wDado))
End If
End If
Loop
If wDado = [Ô]X[Ô] Or wColuna = 22 Then
Else
.Update
End If
End If
End With
End If
K = wLinha / 1000
If K = Int(K) Then
Texto48 = Left(per, 15) & [Ô] - [Ô] & CStr(wLinha)
End If
Loop
Close #1
wRs1.MoveNext
Loop
wrs.Close
wRs1.Close
Texto48 = [Ô]OK[Ô]
Exit Sub
Fimerro:
Resume Next
End Sub
O que eu queria agora fazer é criar uma função que aparte dela eu possa executar a sub-rotina principal que é [Ô]btnGeral_Click[Ô]. Pois vou chamar essa funçao dentro de um macro.
Alguém poderia me ajudar se tem alguma forma de eu fazer isso?
Sou novato neste grupo e preciso uma ajuda para resolver uma coisa de VBA.
Sei a principal diferença entre uma função e sub-rotinas. Funções retornam valores enquanto sub-rotinas não retornam nada.
Bom, vou colocar aqui o detalhes do que estou querendo fazer.....
Tenho essa sub-rotinas [Ô]btnGeral_Click[Ô]
Private Sub btnGeral_Click()
Dim wsql As String
Dim wdb As Database
Set wdb = CurrentDb
Texto84.SetFocus
Texto84 = [Ô][Ô]
Texto84 = Time
wsql = [Ô]delete * from RotasSem [Ô]
wdb.Execute (wsql)
wsql = [Ô]delete * from RotasNGN[Ô]
wdb.Execute (wsql)
Call CarregaUMG
Call CarregaHIG
Texto65 = [Ô]FIM[Ô]
Texto85.SetFocus
Texto85 = [Ô][Ô]
Texto85 = Time
End Sub
..................
Dentro dela, faz chamada de outras sub-rotinas como [Ô]CarregaUMG[Ô]
Sub CarregaUMG()
On Error GoTo Fimerro
Dim MyString As String
Dim wsql As String
Dim wdb As Database
Dim wrs As Recordset
Dim wRs1 As Recordset
Dim wi As Integer
Dim wPos As Integer
Dim wBusca As Variant
Dim wPosVirgula As Integer
Dim wPosInicial As Integer
Dim wColuna As Integer
Dim wLinha As Long
Dim K As Double
Dim wDado As Variant
Dim wA As Double
Dim dat As Variant
Dim dt2 As Variant
Dim dt6 As Variant
Dim per As Variant
Dim per1 As Variant
Dim reg As String
Dim per2 As Variant
Dim per3 As Variant
Texto55.SetFocus
dat = VBA.Format(Texto55, [Ô]DD/MM/YYYY[Ô])
dt2 = Left(dat, 2) & [Ô]/[Ô] & Mid(dat, 4, 2) & [Ô]/[Ô] & Mid(dat, 7, 4)
dt6 = DateValue(dt2) + 6
Texto48.SetFocus
Texto48 = [Ô][Ô]
Texto48 = [Ô]Executando[Ô]
Set wdb = CurrentDb
wsql = [Ô]DELETE CaminhoUMG.Nome [Ô] & _
[Ô]FROM CaminhoUMG;[Ô]
wdb.Execute (wsql)
Set wrs = wdb.OpenRecordset([Ô]CaminhoUMG[Ô])
Do While Len(reg)
wrs.AddNew
wrs(0) = reg
wrs.Update
reg = Dir
Loop
wsql = [Ô]SELECT * from RotasNGN[Ô]
Set wrs = wdb.OpenRecordset(wsql)
wsql = [Ô]SELECT * From CaminhoUMG[Ô]
Set wRs1 = wdb.OpenRecordset(wsql)
Do While Not wRs1.EOF
per = wRs1!Nome
per3 = Mid(per, 14, 2) & [Ô]/[Ô] & Mid(per, 11, 2) & [Ô]/[Ô] & Mid(per, 6, 4)
If DateValue(per3) < DateValue(dt2) Or DateValue(per3) > DateValue(dt6) Then
wRs1.Delete
End If
wRs1.MoveNext
Loop
wRs1.MoveFirst
Do While Not wRs1.EOF
per = wRs1!Nome
per1 = Left(per, 20)
per2 = Left(per, 4)
Texto48 = Left(per, 15) & [Ô] - [Ô] & CStr(wLinha)
Do While Not EOF(1)
VBA.DoEvents
Line Input #1, MyString
If wLinha = 0 Then
Line Input #1, MyString
End If
wLinha = wLinha + 1
wColuna = 2
wPosInicial = 1
wPosVirgula = InStr(wPosInicial, MyString, [Ô],[Ô])
If wPosVirgula <> 0 Then
With wrs
If (InStr(MyString, [Ô]ITCP_RN2_[Ô])) <> 1 Then
.AddNew
!Bilhetador = per2
Do While wPosVirgula <> 0
wColuna = wColuna + 1
wDado = Trim(Mid(MyString, wPosInicial, wPosVirgula - wPosInicial))
If wColuna = 3 And wDado = [Ô]X[Ô] Then
Exit Do
ElseIf wColuna = 52 And _
Not IsNull(wDado) Then
Exit Do
Else
.Fields(wColuna - 1) = IIf(Len(wDado) = 0, Null, IIf((wColuna > 4 And wColuna < 10) Or wColuna > 12, (Val(wDado)), wDado))
wPosInicial = wPosVirgula + 1
wPosVirgula = InStr(wPosInicial, MyString, [Ô],[Ô])
If wPosVirgula = 0 Then
wColuna = wColuna + 1
wDado = Mid(MyString, wPosInicial)
.Fields(wColuna - 1) = IIf(Len(wDado) = 0, Null, IIf((wColuna > 4 And wColuna < 10) Or wColuna > 12, (Val(wDado)), wDado))
End If
End If
Loop
If wDado = [Ô]X[Ô] Or wColuna = 22 Then
Else
.Update
End If
End If
End With
End If
K = wLinha / 1000
If K = Int(K) Then
Texto48 = Left(per, 15) & [Ô] - [Ô] & CStr(wLinha)
End If
Loop
Close #1
wRs1.MoveNext
Loop
wrs.Close
wRs1.Close
Texto48 = [Ô]OK[Ô]
Exit Sub
Fimerro:
Resume Next
End Sub
O que eu queria agora fazer é criar uma função que aparte dela eu possa executar a sub-rotina principal que é [Ô]btnGeral_Click[Ô]. Pois vou chamar essa funçao dentro de um macro.
Alguém poderia me ajudar se tem alguma forma de eu fazer isso?
Você pode simplesmente executar btnGeral_Click
O fato de essa rotina ser acionada de um botão, não impede que ela seja executada de qualquer outro local.
O fato de essa rotina ser acionada de um botão, não impede que ela seja executada de qualquer outro local.
Concordo
Só ressaltando Funções retorna valores e SubRotinas não!!
Não necessariamente!!
Funções podem ser executadas sem um retorno de valor e um sub rotina pode retornar valor por passagem de parametros!!
Citação:Você pode simplesmente executar btnGeral_Click
O fato de essa rotina ser acionada de um botão, não impede que ela seja executada de qualquer outro local.
Só ressaltando Funções retorna valores e SubRotinas não!!
Não necessariamente!!
Funções podem ser executadas sem um retorno de valor e um sub rotina pode retornar valor por passagem de parametros!!
Citação::
Você pode simplesmente executar btnGeral_Click
O fato de essa rotina ser acionada de um botão, não impede que ela seja executada de qualquer outro local.
Kerplunk e Filman,
Obrigado pela resposta,
mas não é possÃvel executar uma rotina dentro de um macro, somente função que é possÃvel colocando no AÇÃO [Ô]ExecutarCódigo[Ô] do macro. Hoje aciono este botão tudo funciona sem problema, mas ao invés que ficar clicando no botar, quero fazer isso automatico acionado [Ô]btnGeral_Click[Ô] de uma função ou um script, onde farei um agendamento sem precisar clicando no botão toda hora.
Cara você quer acionar o Click do Botão sem clicar nele, é isso? Através de uma função executada pela macro?
Nos mostre como esta sua planilha para clarear mais as ideias !!
Nos mostre como esta sua planilha para clarear mais as ideias !!
Filman,
Sim, quero acionar a rotina que criei vinculado ao botão sem clicar nele.
Como não posso executar uma rotina através de macro, ao invés disso quero usar uma função que de repente possa acionar [Ô] se eh que existe como eu chamar uma rotina através de uma função[Ô] a rotina.
Não tenho nenhuma planilha, estou fazendo isso em access. Depois de todos criterios que gero algumas planilhas em excel.
Sim, quero acionar a rotina que criei vinculado ao botão sem clicar nele.
Como não posso executar uma rotina através de macro, ao invés disso quero usar uma função que de repente possa acionar [Ô] se eh que existe como eu chamar uma rotina através de uma função[Ô] a rotina.
Não tenho nenhuma planilha, estou fazendo isso em access. Depois de todos criterios que gero algumas planilhas em excel.
Segue um exemplo muito simples de como fazer isso
Ai é só você adaptar
Ai é só você adaptar
Obrigado pela disponibiidade.
Mas, não vi nenhuma função no código. Você está usando rotina para acionar o botão principal que é Acionar_Botao?
Mas, não vi nenhuma função no código. Você está usando rotina para acionar o botão principal que é Acionar_Botao?
caro COBBY isso é somente um Exemplo de como ira funcionar !!
Ou seja dentro de um módulo você cria suas macros!!
Dentro de cada USERFORM você vai criar suas funções ou procedimentos nesse exemplo que te passei criei um procedimento Public Sub Acionar_Botão()
dentro desse procedimento ou sub-rotinas como queira dizer esta chamando o botão do USERFORM CommandButtom1_Click
Dentro do Botão esta chamando uma outra sub-torina que captura os valores da primeira ABA na sua Pasta de Trabalho e calculando os juros conforme disposto em planilha!!
Já na Aba(Plan1) coloquei um Texto acionar botão e esse Texto chama a macro clickBotao
Onde não esta o que você quer?
Ou seja dentro de um módulo você cria suas macros!!
Dentro de cada USERFORM você vai criar suas funções ou procedimentos nesse exemplo que te passei criei um procedimento Public Sub Acionar_Botão()
dentro desse procedimento ou sub-rotinas como queira dizer esta chamando o botão do USERFORM CommandButtom1_Click
Dentro do Botão esta chamando uma outra sub-torina que captura os valores da primeira ABA na sua Pasta de Trabalho e calculando os juros conforme disposto em planilha!!
Já na Aba(Plan1) coloquei um Texto acionar botão e esse Texto chama a macro clickBotao
Onde não esta o que você quer?
Filman,
Eu não me expressei bem.......que pergunta se está usando uma função uma rotina, pois eu queria usar uma função.
Mesmo assim, fiz os testes aqui eu não deu certo.
Valeu
Eu não me expressei bem.......que pergunta se está usando uma função uma rotina, pois eu queria usar uma função.
Mesmo assim, fiz os testes aqui eu não deu certo.
Valeu
Usei sub rotinas, mas vc pode usar funções !!
é só trocar!!!
é só trocar!!!
Faça seu login para responder