Notifications
Clear all

[Resolvido] Fechar arquivo em Array

6 Posts
3 Usuários
0 Reactions
1,200 Visualizações
Bautto
(@bautto)
Posts: 70
Estimable Member
Topic starter
 

Colegas, boa tarde.

Tenho a rotina seguinte, para importar vários arquivos, que consolido em apenas um. A quantidade chega a mais de 50.

A rotina funciona bem até a linha de fechamento do arquivo fonte "Workbooks(NomeArquivo(a)).Close", que na execução vem a mensagem de "Tipos incompatíveis". Quando mudo para apenas  "Workbooks(NomeArquivo).Close", muda a mensagem para ""Subscrito fora do intervalo".

Não encontrei solução, embora me pareça algo simples, mas não tenho a experiência necessária para solucionar...

Desta forma, peço se algum colega do fórum puder, me orientar sobre como resolver essa situação.

Agradeço antecipadamente.

Public Sub ImportaPlans()

Dim Fonte, Dest             As Workbook
Dim WSFonte, WSDest         As Worksheet
Dim a                       As Integer
Dim ArqParaAbrir            As Variant
Dim NomeArquivo, NomSheet   As String

Set Dest = ThisWorkbook


ArqParaAbrir = Application.GetOpenFilename("Arquivo para importar (*.xls*), *.xls*", _ Title:="Escolha os Arquivos", MultiSelect:=True)
               
If Not IsArray(ArqParaAbrir) Then

    If ArqParaAbrir = "" Or ArqParaAbrir = False Then
        MsgBox "Processo abortado. Não foram selecionados Arquivos..."
    Exit Sub
    End If
    
End If

Application.ScreenUpdating = False

    For a = LBound(ArqParaAbrir) To UBound(ArqParaAbrir)
    
            NomeArquivo = ArqParaAbrir(a)
            Application.Workbooks.Open (NomeArquivo)
            Range("C:C").Select
            Selection.Copy
            
            Dest.Activate
            
        With Dest
            Sheets.Add After:=ActiveSheet
            ActiveSheet.Name = Trim$(Mid$(NomeArquivo, 63, 15))
            Columns("C").Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
            Range("A1").Select
        End With
        
            Workbooks(NomeArquivo).Close
            
Application.DisplayAlerts = True

MsgBox "Processo concluído com sucesso !!..."

End Sub
 
Postado : 03/03/2023 3:48 pm
kev027
(@kev027)
Posts: 64
Trusted Member
 

Olhando o código, parece que falta um Next para fechar o For

 
Postado : 03/03/2023 4:21 pm
Bautto
(@bautto)
Posts: 70
Estimable Member
Topic starter
 

  kev027

Realmente, mas foi só na transcrição acima, no arquivo está completo.

Public Sub ImportaPlans()

Dim Fonte, Dest             As Workbook
Dim WSFonte, WSDest         As Worksheet
Dim a                       As Integer
Dim ArqParaAbrir            As Variant
Dim NomeArquivo, NomSheet   As String

Set Dest = ThisWorkbook

'Carregando o arquivo para tratamento

ArqParaAbrir = Application.GetOpenFilename("Arquivo para importar (*.xls*), *.xls*", _
               Title:="Escolha os Arquivos", MultiSelect:=True)
               
If Not IsArray(ArqParaAbrir) Then

    If ArqParaAbrir = "" Or ArqParaAbrir = False Then
        MsgBox "Processo abortado. Não foram selecionados Arquivos..."
    Exit Sub
    End If
    
End If

Application.ScreenUpdating = False

    For a = LBound(ArqParaAbrir) To UBound(ArqParaAbrir)
    
            NomeArquivo = ArqParaAbrir(a)
            Application.Workbooks.Open (NomeArquivo)
            Range("C:C").Select
            Selection.Copy
            
            Dest.Activate
            
        With Dest
            Sheets.Add After:=ActiveSheet
            ActiveSheet.Name = Trim$(Mid$(NomeArquivo, 63, 15))
            Columns("C").Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
            Range("A1").Select
        End With
        
            'Workbooks(NomeArquivo).Close
Next

Application.DisplayAlerts = True

MsgBox "Processo concluído com sucesso !!..."


End Sub
 
Postado : 06/03/2023 4:08 pm
kev027
(@kev027)
Posts: 64
Trusted Member
 

Olá boa noite.

Veja a Estrutura Condicional abaixo, talvez funcione.

Public Sub ImportaPlans()

Dim Fonte, Dest             As Workbook
Dim WSFonte, WSDest         As Worksheet
Dim a                       As Integer
Dim ArqParaAbrir            As Variant
Dim NomeArquivo, NomSheet   As String

Set Dest = ThisWorkbook

'Carregando o arquivo para tratamento

ArqParaAbrir = Application.GetOpenFilename("Arquivo para importar (*.xls*), *.xls*", _
               Title:="Escolha os Arquivos", MultiSelect:=True)
               
If Not IsArray(ArqParaAbrir) Then

    If ArqParaAbrir = "" Or ArqParaAbrir = False Then
        MsgBox "Processo abortado. Não foram selecionados Arquivos..."
    Exit Sub
    End If
    
End If

Application.ScreenUpdating = False

    For a = LBound(ArqParaAbrir) To UBound(ArqParaAbrir)
    
            NomeArquivo = ArqParaAbrir(a)
            Application.Workbooks.Open (NomeArquivo)
            Range("C:C").Select
            Selection.Copy
            Dest.Activate
            
        With Dest
            Sheets.Add After:=ActiveSheet
            ActiveSheet.Name = Trim$(Mid$(NomeArquivo, 63, 15))
            Columns("C").Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
            Range("A1").Select
        End With
           
    Next
    
    For Each wk In Workbooks
         If wk.Name <> Dest.Name Then
            wk.Close SaveChanges:=True
        End If
    Next

Application.DisplayAlerts = True

MsgBox "Processo concluído com sucesso !!..."


End Sub
 
Postado : 06/03/2023 7:51 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

@Bautto, vc precisa incluir o caminho até o arquivo para usar no método Open (concatenar caminho + nome do arquivo).

Usando o GetOpenFileName como vc tem feito só vem o nome do arquivo, não o caminho completo.

Ou alternativamente vc pode apontar o vetor para o drive e/ou caminho onde estão os arquivos antes de usar o método Open, através das instruções ChDrive e ChDir.

 

 
Postado : 06/03/2023 10:06 pm
Bautto
(@bautto)
Posts: 70
Estimable Member
Topic starter
 

  kev027 e   EdsonBR

Colegas, boa tarde.

Agradeço a ajuda de vocês.

Tenho duas notícias: a primeira é que a rotina que o kev027 sugeriu funcionou bem e fechou os arquivos...

A segunda é que fiz a concatenação que o EdsonBR orientou e os arquivos também abriram normalmente, mas ainda, ao rodar a linha do fechamento dos arquivos, surge a mensagem de "Subscrito fora do intervalo".

Printei as duas telas anexas, para ver que na linha do "stop" da depuração, mostra o nome do arquivo com o caminho completo, mas ao executar a linha, vem a mensagem de erro.

Não sei se talvez tenha que fazer no comando para fechar o arquivo, referência à sua posição na array (ArquParaAbrir (a)).

Vou usar a rotina criada pelo kev027, mas vou continuar testando algumas formas de fechar os arquivos imediatamente após a cópia de seus dados, para não ficar com uma quantidade muito grande de arquivos abertos.

Mais uma vez agradeço a orientação de vocês. Muito obrigado.

 
Postado : 08/03/2023 4:39 pm