Notifications
Clear all

Encerrar Loop - Data

14 Posts
2 Usuários
0 Reactions
2,209 Visualizações
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Muito boa tarde a todos!

Estou desenvolvendo uma macro pra fazer o seguinte:
1- Há várias empresas, preciso baixar as cotações de cada uma delas até 09-2012;
2 - Quando terminar de baixar as cotações, copio os dados e salvo em uma pasta;
3 - Vou para a próxima empresa e faço a mesma coisa, assim sucessivamente.

Criei, então, 02 loops, sendo um para a empresa e outro para a data. O problema que encontrei foi "parar" o loop, pois o loop está continuando mesmo após "12-2012". Onde eu errei?
Vejam a rotina que estou trabalhando:

Sub BaixarCotações()

Dim Pasta
Dim Nrsas As Integer
Dim NomePlanilha
Dim NomeEmpresa
Dim dt As Date, Td As String


Sheets("Parâmetros").Select
'Declara as variáveis
Nrsas = Worksheets("Parâmetros").Cells(Cells.Rows.Count, "A").End(xlUp).Row
Pasta = ActiveWorkbook.Path & "BalançosCotações Históricas"
dt = #9/30/2004#

For i = 2 To Nrsas

For x = dt To Sheets("Parâmetros").Range("h1").Value
Td = Format(dt, "MM-YYYY")
MsgBox (Format(Sheets("Parâmetros").Range("h1").Value, "MM-YYYY"))

NomeEmpresa = Sheets("Parâmetros").Range("D" & i)
NomePlanilha = Sheets("Parâmetros").Range("D" & i) & " Cotacoes"

Sheets(Td).Select

Td = Format(dt, "MM/YYYY")

Range("A1").Select
         With ActiveSheet.QueryTables.Add(Connection:= _
       "URL;http://www.bmfbovespa.com.br/sig/FormConsultaMercVista.asp?strTipoResumo=RES_MERC_VISTA&strSocEmissora=" & NomeEmpresa & "&strDtReferencia=" & Td & "&strIdioma=P&intCodNivel=2&intCodCtrl=160#", _
       Destination:=Range("a1"))
          .BackgroundQuery = True
          .TablesOnlyFromHTML = True
          .Refresh BackgroundQuery:=False
          .SaveData = True
          End With
          
                  
          Td = Format(dt, "MM-YYYY")
                 
'Faz o teste para verificar se a empresa tem a cotação para esta data.
If Sheets(Td).Range("a4").Value Like "*Não*" Then
Sheets(Td).Select
Cells.Select
    Selection.Delete Shift:=xlUp
Else
End If

dt = DateAdd("m", 3, dt)

Next

' Aqui Salva as cotações que foram baixadas
MkDir Pasta
Sheets.Select
Sheets.Copy
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:= _
Pasta & "" & NomePlanilha & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
ActiveWorkbook.Close

' Vai para a próxima empresa.

Next

End Sub

A planilha que estou trabalhando eu postei no seguinte endereço: http://www.sendspace.com/file/quxqyz

Alguem pode me ajudar a parar o Loop em 12-2012?

Desde já agradeço.

 
Postado : 30/12/2012 11:15 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Experimente assim:

Substitua:

For x = dt To Sheets("Parâmetros").Range("h1").Value

.....

Next

Por:

Do While dt <= Sheets("Parâmetros").Range("h1").Value
.....
Loop

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/12/2012 12:15 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Eu olhei bem rápido mas isso pode te ajudar.

CDate(Sheets("Parâmetros").Range("h1").Value) 

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/12/2012 12:17 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Esqueci de mencionar, se quiser o mes 9/2012 inclusive, então altere a data em H1 para 30/9/2012 (está como 1/9/2012)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/12/2012 12:43 pm
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Reinaldo, sua sugestão deu certo!
Alexandre, tentei também a sua sugestão, porém não surtiu efeito, talvez eu não tenha entendido direito, mas como a sugestão do Reinaldo resolveu o problema acabei ficando com ela.
Muitíssimo obrigada!

 
Postado : 30/12/2012 2:20 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Lembre se de marcar sua postagem como resolvido!!

Como marcar Tópico como Resolvido e Agradecer a mensagem?
viewtopic.php?f=7&t=3784
Att ;)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/12/2012 2:26 pm
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Aproveitando o tópico, só para encerrar de vez esta macro, após baixar as cotações e copiar os dados para uma outra planilha e salvar, eu preciso "limpar" esta planilha, exceto a aba "Parâmetro". Pensei neste comando, mas como são 149 sheets, achei que deixará o código muito longo:

Sheets(Array(2, 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,23,......até 149)).ClearContents

Vocês sugeririam outro comando que não fosse tão longo?

Desde já agradeço mais uma vez,
Milena

 
Postado : 30/12/2012 2:26 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!
Tente adaptar

Sub Limpar_AleVBA()
  Sheets(1).Range("A1:H1000").Clear
  Sheets.FillAcrossSheets Sheets(1).Range("A1:H1000")
End Sub

Att ;)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/12/2012 2:48 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Uma possibilidade

Sub limpa()
For Each sh In Sheets
If sh.Name <> "Parâmetros" Then
sh.UsedRange.ClearContents
End If
Next
End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/12/2012 3:01 pm
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Alexandre, não entendi essa macro, pq ela está apagando a plan "Parâmetro", mas eu gostaria de apagar todas, exceto a Parametro.

 
Postado : 30/12/2012 3:13 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Não foi feito diferenciando sua guia principal.
Como eu disse!!...Tente adaptar

Boa tarde!!
Tente adaptar
CÓDIGO: SELECIONAR TODOS
Sub Limpar_AleVBA()
Sheets(1).Range("A1:H1000").Clear
Sheets.FillAcrossSheets Sheets(1).Range("A1:H1000")
End Sub

Att

Use a do ronaldo!!!

sh.Name <> "Parâmetros" Then

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/12/2012 3:15 pm
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

A Macro do Reinaldo, deu certo!

Sem querer abusar, mas já abusando, eu não tenho muita prática com o Do While, sugerido na primeira resposta, só que a macro após salvar a planilha no seu devido lugar, ao invés de fazer o loop de novo na nova empresa, baixando as cotações da outra empresa (linha seguinte), a rotina está indo para o final sem baixar. Onde eu errei?

Veja a macro concluída:
Sub BaixarCotações()

Dim Pasta
Dim Nrsas As Integer
Dim NomePlanilha
Dim NomeEmpresa
Dim dt As Date, Td As String

Sheets("Parâmetros").Select
'Declara as variáveis
Nrsas = Worksheets("Parâmetros").Cells(Cells.Rows.Count, "A").End(xlUp).Row
Pasta = ActiveWorkbook.Path & "BalançosCotações Históricas"
dt = #9/30/2004#

For i = 2 To Nrsas

NomeEmpresa = Sheets("Parâmetros").Range("D" & i)
NomePlanilha = Sheets("Parâmetros").Range("D" & i) & " Cotacoes"

Do While dt <= Sheets("Parâmetros").Range("h1").Value
Td = Format(dt, "MM-YYYY")

Sheets(Td).Select

Td = Format(dt, "MM/YYYY")

Range("A1").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"URL; http://www.bmfbovespa.com.br/sig/FormConsultaMercVista.asp?strTipoResumo=RES_MERC_VISTA&strSocEmissora=" & NomeEmpresa & "&strDtReferencia=" & Td & "&strIdioma=P&intCodNivel=2&intCodCtrl=160#", _
Destination:=Range("a1"))
.BackgroundQuery = True
.TablesOnlyFromHTML = True
.Refresh BackgroundQuery:=False
.SaveData = True
End With

Td = Format(dt, "MM-YYYY")

'Faz o teste para verificar se a empresa tem a cotação para esta data.
If Sheets(Td).Range("a4").Value Like "*Não*" Then
Sheets(Td).Select
Cells.Select
Selection.Delete Shift:=xlUp
Else
End If

dt = DateAdd("m", 3, dt)
Loop

Sheets.Select
Sheets.Copy
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:= _
Pasta & "" & NomePlanilha & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
ActiveWorkbook.Close

Call limpa
' Aqui, eu coloco +1 para ir para a linha 2 e baixar os balanços da 2º empresa.
i = i + 1
Next

End Sub

 
Postado : 30/12/2012 3:34 pm
(@milenamoreno)
Posts: 51
Trusted Member
Topic starter
 

Descobri, é que o While estava "memorizado" a última data, então bastou zerar a data de novo para funcionar.

Fico aqui imensamente agradecida à vocês dois pela ajuda e paciencia.

Obrigada,
Milena

 
Postado : 30/12/2012 4:00 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não é o while que memoriza a data, e que dt inicial está fora do for..next
se mudar a posição da definição do dt inicial
de:

dt = #9/30/2004#

For i = 2 To Nrsas

para:

For i = 2 To Nrsas
dt = #9/30/2004#

Vai "rodar" normal tb

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/12/2012 4:03 pm