Ir ao conteúdo
  • Cadastre-se

Excel Erro em tempo de execução '9' - Subscrito fora do intervalo


Ir à solução Resolvido por Midori,

Posts recomendados

Prezados, tudo bem!

 

Estou importando um arquivo txt para o excel via VBA. O código começa normal, mas após preencher a linha 225 da minha planilha ocorre um erro de tempo de execução '9' - subscrito fora do intervalo.

 

No anexo, tem o print dos erros que ocorreram, o modelo do txt e da planilha que estou utilizando

Alguém já enfrentou esse problema?

 

 

Muito Obrigado!

 

Nova pasta.zip

Link para o comentário
Compartilhar em outros sites

@Kleber Bispo Veja nessa linha do arquivo tem as colunas referentes aos índices 20 ou 22.

 

Se for o caso você pode usar Ubound para evitar esse erro, p.ex

 

U = Ubound(Split(Registro,";"))
If U >= 22 Then
If Split(Registro,";")(22) = "999" Then
...

 

Obs: Já que você está usando #1 em Open, devia usar apenas esse número. Se quiser usar a variável I pode substituir onde tem 1 para I.

Link para o comentário
Compartilhar em outros sites

@Midori Corrigi, tirei a variável e deixei apenas o 1, mas o erro persiste.

 

Não consegui entender a lógica do Ubound dentro do Loop. Alterei o código como abaixo, mas na mesma linha que dava o erro anterior, agora entra em loop infinito.

 

Sub Importa_Txt()

Dim Registro    As String
Dim Arquivo     As Variant
Dim L           As Long
Dim U           As Long
Dim W           As Worksheet


Set W = Planilha1
W.Select


Arquivo = Application.GetOpenFilename("Arquivo de Texto (*.txt),*.txt", Title:="Escolha o arquivo desejado")

If Arquivo = "" Or Arquivo = False Then
    MsgBox "Arquivo de texto não selecionado. Processo abortado", vbOKOnly, "Planilha Modelo"
    Exit Sub
End If

Open Arquivo For Input As #1

L = 5

Do Until EOF(1)
    Line Input #1, Registro
    U = UBound(Split(Registro, ";"))
    If U >= 22 Then
        If Split(Registro, ";")(20) = "999" Or Split(Registro, ";")(22) = "999" Then
            L = L + 1
            Cells(L, 2) = Split(Registro, ";")(6)
            Cells(L, 3) = Split(Registro, ";")(1)
            Cells(L, 4) = Split(Registro, ";")(2)
            Cells(L, 5) = Split(Registro, ";")(3)
            Cells(L, 7) = Split(Registro, ";")(10)
            Cells(L, 8) = Split(Registro, ";")(12)
            Cells(L, 9) = Split(Registro, ";")(16)
            Cells(L, 10) = Split(Registro, ";")(17)
            Cells(L, 11) = Split(Registro, ";")(20)
            Cells(L, 12) = Split(Registro, ";")(18)
            Cells(L, 13) = Split(Registro, ";")(19)
            Cells(L, 14) = Split(Registro, ";")(22)
            Cells(L, 15) = Split(Registro, ";")(24)
            If Split(Registro, ";")(20) = "999" Then
                With Cells(L, 6)
                    .Value = CDbl(Split(Registro, ";")(11) / -100)
                    .NumberFormat = "#,##0.00"
                End With
            Else
                With Cells(L, 6)
                    .Value = CDbl(Split(Registro, ";")(11) / 100)
                    .NumberFormat = "#,##0.00"
                End With
            End If
        End If
    End If
Loop

Close #1

MsgBox "Arquivo importado", , "Planilha Modelo"

End Sub


 

 

Link para o comentário
Compartilhar em outros sites

  • Solução
1 hora atrás, Kleber Bispo disse:

Não consegui entender a lógica do Ubound dentro do Loop. Alterei o código como abaixo, mas na mesma linha que dava o erro anterior, agora entra em loop infinito.

A função Split quebra a string Registro e retorno um vetor com as partes separadas por ;.

 

UBound vai retornar o tamanho desse vetor.

 

Peguei o ; como separador porque parece ser o padrão de colunas do seu arquivo.

 

Para organizar o código e facilitar a comparação acho melhor você atribuir variáveis com os nomes dos campos em vez de usar só Split, p.ex.

 

Type Cadastro
    Nome        As String
    EstadoCivil As String
    Idade       As String
    Codigo      As Variant
End Type

Sub Importa_Txt()
Dim C           As Cadastro
Dim Registro    As String
Dim Arquivo     As Variant
Dim L           As Long
Dim U           As Integer

Arquivo = Application.GetOpenFilename("Arquivo de Texto (*.txt),*.txt", Title:="Escolha o arquivo desejado")

Open Arquivo For Input As #1

L = 5

Do Until EOF(1)
    Line Input #1, Registro
    U = UBound(Split(Registro, ";"))
    
    C.Nome = Split(Registro, ";")(0)
    C.Idade = Split(Registro, ";")(1)
    C.EstadoCivil = Split(Registro, ";")(3)
    C.Codigo = ""
    
    If U >= 20 Then
        If Split(Registro, ";")(20) = "999" Then C.Codigo = CDbl(Split(Registro, ";")(11) / -100)
    End If
    
    If U >= 22 Then
        If Split(Registro, ";")(22) = "999" Then C.Codigo = CDbl(Split(Registro, ";")(11) / 100)
    End If
    
    If C.Codigo <> "" Then
        L = L + 1
        Cells(L, 1) = C.Nome
        Cells(L, 2) = C.Idade
        Cells(L, 3) = C.EstadoCivil
        Cells(L, 4) = C.Codigo
    End If
Loop

Close #1
End Sub

 

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...
Em 12/08/2020 às 09:53, Midori disse:

A função Split quebra a string Registro e retorno um vetor com as partes separadas por ;.

 

UBound vai retornar o tamanho desse vetor.

 

Peguei o ; como separador porque parece ser o padrão de colunas do seu arquivo.

 

Para organizar o código e facilitar a comparação acho melhor você atribuir variáveis com os nomes dos campos em vez de usar só Split, p.ex.

 




Type Cadastro
    Nome        As String
    EstadoCivil As String
    Idade       As String
    Codigo      As Variant
End Type

Sub Importa_Txt()
Dim C           As Cadastro
Dim Registro    As String
Dim Arquivo     As Variant
Dim L           As Long
Dim U           As Integer

Arquivo = Application.GetOpenFilename("Arquivo de Texto (*.txt),*.txt", Title:="Escolha o arquivo desejado")

Open Arquivo For Input As #1

L = 5

Do Until EOF(1)
    Line Input #1, Registro
    U = UBound(Split(Registro, ";"))
    
    C.Nome = Split(Registro, ";")(0)
    C.Idade = Split(Registro, ";")(1)
    C.EstadoCivil = Split(Registro, ";")(3)
    C.Codigo = ""
    
    If U >= 20 Then
        If Split(Registro, ";")(20) = "999" Then C.Codigo = CDbl(Split(Registro, ";")(11) / -100)
    End If
    
    If U >= 22 Then
        If Split(Registro, ";")(22) = "999" Then C.Codigo = CDbl(Split(Registro, ";")(11) / 100)
    End If
    
    If C.Codigo <> "" Then
        L = L + 1
        Cells(L, 1) = C.Nome
        Cells(L, 2) = C.Idade
        Cells(L, 3) = C.EstadoCivil
        Cells(L, 4) = C.Codigo
    End If
Loop

Close #1
End Sub

 

@Midori Na ocasião, consegui gerar a macro que me atendesse, graças a sua ajuda. Muito obrigado!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...