Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

kari0ca

[Resolvido] Chamar macro/vbscript automaticamente

Recommended Posts

Boa tarde galera,

 

Estou com um problema, eu queria saber se é possível criar (talvez vbs) um mecanismo que rode uma macro, ou transferir tudo para algum script que possa ser agendado.

 

No excel a minha macro funciona perfeitamente, mas essa solução obriga que alguém aperte no botão pra rodar a macro. eu pretendo agendar o script para rodar de x em x tempo.

 

Mais informação: tenho uma macro/sub que chama varias outras macro/sub, e eu pretendo chamar apenas essa principal que chama as outras.

 

Poderiam dar uma ajuda?

 

Obrigado.

 

Edit: eu estive testando algumas coisas, e o que eu fiz foi o seguinte:

criei um txt com todo o código que usei no excel, e gravei como script.vbs, quando eu tento dodar pelo cscript aparece o seguinte erro: "Microsoft VBScript compilation error: Expected end of statement"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente o código que você copiou, depende de referencias do excel.

 

 

Mas para rodar automaticamente, você pode schedular o vbs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Scorpio, Obrigado pela resposta, mas acho que você não entendeu o problema.

 

eu vou explicar melhor e colocar um exemplo aqui:

 

o erro que acontece ao rodar o script com wscript

Imagem Postada

Código do 1º processo (são varios processos e no fim, chamo um processo que chama os outros).

Segundo a mesagem de erro, o problema está na 2ª linha

Sub Cria_Temp()
    Dim strXLSFile As String
    Dim strXLSNewFile As String
            
    Const strInputFolder As String = "D:\HSG\TEMP\XLS\"
    Const strTempFolder As String = "D:\HSG\TEMP\TMP\"
    Const xlSaveChanges = 1

    strXLSFile = Dir(strInputFolder & "*.xls")
    Application.DisplayAlerts = False
    
    'Bloco de codigo para criar um novo ficheiro excel com 1 worksheet que vai ter apenas os dados relevantes
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = False
    objExcel.DisplayAlerts = False

    Do While strXLSFile <> ""
        Set objWorkbook_DST = objExcel.Workbooks.Add()
        Set objWorksheet_DST = objWorkbook_DST.Worksheets(1)
    
        objWorkbook_DST.Sheets(3).Select
        objWorkbook_DST.Sheets(3).Delete
        
        objWorkbook_DST.Sheets(2).Select
        objWorkbook_DST.Sheets(2).Delete
        'Apagou as worksheets a mais
    
        'Gravar o workbook
        strXLSNewFile = Left(strXLSFile, InStrRev(strXLSFile, ".") - 1) & "_TMP" & ".xls"
        objWorkbook_DST.SaveAs (strTempFolder & strXLSNewFile)
        objWorkbook_DST.Close 'xlSaveChanges 'Sai e grava automaticamente
        strXLSFile = Dir
    Loop
    objExcel.Quit

End Sub

este código funciona perfeitamente no excel...

o que eu fiz foi copiar o código do excel e passar para um .vbs

 

Alguém pode dar uma ajuda?

Compartilhar este post


Link para o post
Compartilhar em outros sites

- Em VBS não tem os tipos das variaveis.

- Você criou a sub, mas chama ela onde? Retire o Sub XXXX e End Sub.

 

Vê se roda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Scorpio, obrigado mais uma vez por responder.

 

O problema não é o fato de ter subs no meu script, eu também não podia "eliminar" os sub, porque estou programando como se fosse um programa, tenho vários subs que vão ser chamados.

 

Tive que converter todo o meu código, ao que parece, o código usado em um vbs é meio diferente e tem que ser tudo declarado com 'late binding' não posso definir os tipos das variáveis...

 

só para dar um exemplo, o código antigo ficou deste jeito:

Sub Cria_Temp()
    Dim strXLSFile
    Dim strXLSNewFile
	Dim fso, msg, texto, num
           
    Const strInputFolder ="D:\HSG\TEMP\XLS\"
    Const strTempFolder = "D:\HSG\TEMP\TMP\"
    Const xlSaveChanges = 1

    'Application.DisplayAlerts = False
    
    'Bloco de codigo para criar um novo ficheiro excel com 1 worksheet que vai ter apenas os dados relevantes
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = False
    objExcel.DisplayAlerts = False

	Set fso = CreateObject("Scripting.FileSystemObject")
	set mainfolder=fso.GetFolder(strInputFolder)
	Set filecollection = mainfolder.Files

	For Each file In filecollection
		' Caso o ficheiro seja do tipo excel .xls ou .xlsx
		if InStrRev(file.Name, ".xls") <> 0 then
		    Set objWorkbook_DST = objExcel.Workbooks.Add()
		    Set objWorksheet_DST = objWorkbook_DST.Worksheets(1)
			
		    'Apaga as worksheets a mais
		    objWorkbook_DST.Sheets(3).Select
		    objWorkbook_DST.Sheets(3).Delete
		    objWorkbook_DST.Sheets(2).Select
		    objWorkbook_DST.Sheets(2).Delete
    
		    'Gravar o workbook
		    strXLSNewFile = left(file.Name, InStrRev(file.Name, ".xls") - 1) & "_TMP" & ".xls"
		    objWorkbook_DST.SaveAs (strTempFolder & strXLSNewFile)
			objWorkbook_DST.Close 
		end if
	Next
	objExcel.Quit
end sub

No fim, fora de todos os subs, basta ir chamando os subs que preciso, e dentro dos subs posso fazer referencia a outros subs ou funções.

 

Problema resolvido e fica a dica para quem tiver a mesma dúvida/problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei rodar aqui no meu PC com a SUB e deu erro :). Mas se deu certo ótimo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei rodar aqui no meu PC com a SUB e deu erro :). Mas se deu certo ótimo!

 

Scorpio,

 

Para poder rodar o sub, você tem que declarar (como eu fiz aí em cima) e depois chamar ele, por exemplo

 

Sub xpto()

...

...

código

...

End sub

 

xpto

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.