Ir ao conteúdo
  • Cadastre-se

Excel VBA - ignorar célula vazia


Posts recomendados

Boa tarde!

 

 

 

 

Estou com um código VBA, onde o mesmo pega coordenadas (x,y) de uma coluna, e de acordo com essas coordenadas ele desenha linhas em outro aplicativo (AutoCAD).

Na planilha, essas coordenadas contém 6 linhas.

 

Só que essas 6 linhas contendo coordenadas, as vezes terá coordenadas em todas as linhas. As vezes terá coordenadas na 2ª, 3ª, 4ª e 5ª linhas, e as vezes somente na 3ª e 4ª linhas.

Quando o VBA passa por essas colunas para captar as coordenadas, caso estejam todas preenchidas, ok... Porém quando eu tenho alguma linha vazia, o código VBA não aceita.

 

Queria saber se é possível fazer com que o código entenda que caso em alguma linha não tenha números (estejam vazias), o código trabalhe com as outras linhas restantes.

 

 

Código VBA:

 

Citação

i = 1
Set u = Worksheets("Detalhamento")
u.Select
u.Range("AC95").Select
Selection.Activate
Do While i <= 5


Inicio(0) = ActiveCell.Value: Inicio(1) = ActiveCell.Offset(0, 1).Value: Inicio(2) = 0
Fim(0) = ActiveCell.Offset(1, 0).Value: Fim(1) = ActiveCell.Offset(1, 1).Value: Fim(2) = 0

 Set Arm_Long1 = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Inicio, Fim)
 Arm_Long1.Layer = "Arm_Longitudinal"
 Arm_Long1.Update
 AutoCAD.Application.Update

i = i + 1
If ActiveCell.Offset(2, 0).Value <> "" Then
'O IF testa se duas linhas abaixo há uma célula vazia, caso positivo ele já pula 3 linhas parao próximo segmento válido, caso negativo, prossegue normalmente.
 ActiveCell.Offset(1, 0).Activate
 Else: ActiveCell.Offset(3, 0).Activate
 End If
AutoCAD.Application.Update
Loop

 

 

(acrescentei uma imagem mostrando, quando uma coluna fica vazia, o código da erro.

Imagem tabela.png

adicionado 18 minutos depois

 

 

Desculpem o incomodo. 

Link para o comentário
Compartilhar em outros sites

@Ken8 Não tenho o CAD para testar, mas veja se assim resolve,

Dim N   As Integer
Dim Ignora  As Boolean

i = 1
Set u = Worksheets("Detalhamento")
u.Select
u.Range("AC95").Select
Selection.Activate
Do While i <= 5
Ignora = False

Inicio(0) = ActiveCell.Value: Inicio(1) = ActiveCell.Offset(0, 1).Value: Inicio(2) = 0
Fim(0) = ActiveCell.Offset(1, 0).Value: Fim(1) = ActiveCell.Offset(1, 1).Value: Fim(2) = 0

For N = 0 To UBound(Inicio) - 1
    If Inicio(N) = "" Or Fim(N) = "" Then
        Ignora = True
    End If
Next

If Ignora = False Then
 Set Arm_Long1 = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Inicio, Fim)
 Arm_Long1.Layer = "Arm_Longitudinal"
 Arm_Long1.Update
 AutoCAD.Application.Update
End If

If ActiveCell.Offset(2, 0).Value <> "" Then
'O IF testa se duas linhas abaixo há uma célula vazia, caso positivo ele já pula 3 linhas parao próximo segmento válido, caso negativo, prossegue normalmente.
 ActiveCell.Offset(1, 0).Activate
 Else: ActiveCell.Offset(3, 0).Activate
 End If

i = i + 1

Loop

 

Link para o comentário
Compartilhar em outros sites

5 horas atrás, Midori disse:

@Ken8 Não tenho o CAD para testar, mas veja se assim resolve,


Dim N   As Integer
Dim Ignora  As Boolean

i = 1
Set u = Worksheets("Detalhamento")
u.Select
u.Range("AC95").Select
Selection.Activate
Do While i <= 5
Ignora = False

Inicio(0) = ActiveCell.Value: Inicio(1) = ActiveCell.Offset(0, 1).Value: Inicio(2) = 0
Fim(0) = ActiveCell.Offset(1, 0).Value: Fim(1) = ActiveCell.Offset(1, 1).Value: Fim(2) = 0

For N = 0 To UBound(Inicio) - 1
    If Inicio(N) = "" Or Fim(N) = "" Then
        Ignora = True
    End If
Next

If Ignora = False Then
 Set Arm_Long1 = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Inicio, Fim)
 Arm_Long1.Layer = "Arm_Longitudinal"
 Arm_Long1.Update
 AutoCAD.Application.Update
End If

If ActiveCell.Offset(2, 0).Value <> "" Then
'O IF testa se duas linhas abaixo há uma célula vazia, caso positivo ele já pula 3 linhas parao próximo segmento válido, caso negativo, prossegue normalmente.
 ActiveCell.Offset(1, 0).Activate
 Else: ActiveCell.Offset(3, 0).Activate
 End If

i = i + 1

Loop

 

Não funcionou 😕

valeu a tentativa

Link para o comentário
Compartilhar em outros sites

11 horas atrás, Ken8 disse:

Não funcionou 😕

valeu a tentativa

Se teve um erro diferente do anterior pode ser que a macro não tenha sido adaptada corretamente. Quando testei aqui (comentando as linhas dos comandos do CAD) eu tive que atribuir as variáveis Fim e Inicio para não dar erro de Sub ou Function não definida.

 

Dim Inicio(3)
Dim Fim(3)

 

Pela descrição do primeiro post, parece que o caminho é pular o bloco com os comandos do CAD como tentei fazer com a atribuição da variável Ignora.

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

38 minutos atrás, Midori disse:

Se teve um erro diferente do anterior pode ser que a macro não tenha sido adaptada corretamente. Quando testei aqui (comentando as linhas dos comandos do CAD) eu tive que atribuir as variáveis Fim e Inicio para não dar erro de Sub ou Function não definida.

 


Dim Inicio(3)
Dim Fim(3)

 

Pela descrição do primeiro post, parece que o caminho é pular o bloco com os comandos do CAD como tentei fazer com a atribuição da variável Ignora.

Sou iniciante no VBA.. Não entendi tudo o que falou muito bem, mas acho que captei a ideia.

 

Eu inseri a função If,colocando se a célula estiver vazia der um offset para a linha de baixo.. 

 

Funcionou, só não posso colocar nenhum informação algumas linhas abaixo, pois o loop do Do while vai até cinco, e quando está vazia, ele meio que não conta a célula vazia

Link para o comentário
Compartilhar em outros sites

Boa noite, @Ken8 e demais colegas

Algumas perguntas:

  • Os pares de coordenadas são valores numéricos ou resultado de fórmulas? Considerei numéricos.
  • Começam em AC95 e vão até onde? Supus que fossem até a última linha com dados da coluna AD.
  • No meu entendimento, cada bloco (área) de células não-vazias contém sempre um número par de linhas e a cada duas linhas, a primeira é a coordenada do ponto inicial e a segunda a do ponto final da entidade (Line), correto?

Se não for isso, anexe o arquivo Excel para facilitar o entendimento, ok?

Teste o seguinte código:

Sub DrawLines()
  Dim rgXY As Range, A As Range, i As Long, Inicio(0 To 3) As Double, Fim(0 To 2) As Double
  With Worksheets("Detalhamento")
    Set rgXY = .Range("AC95", .Cells(Rows.Count, "AD").End(xlUp)).SpecialCells(xlCellTypeConstants, xlNumbers)
  End With
  For Each A In rgXY.Areas
    For i = 1 To A.Rows.Count / 2
      Inicio(0) = A.Cells(2 * i - 1, 1): Inicio(1) = A.Cells(2 * i - 1, 2): Inicio(2) = 0
         Fim(0) = A.Cells(2 * i, 1):        Fim(1) = A.Cells(2 * i, 2):        Fim(2) = 0
      Set Arm_Long1 = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Inicio, Fim)
      Arm_Long1.Layer = "Arm_Longitudinal"
      Arm_Long1.Update
      AutoCAD.Application.Update
    Next i
  Next A
End Sub

 

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

Em 12/09/2020 às 22:20, Edson Luiz Branco disse:

Boa noite, @Ken8 e demais colegas

Algumas perguntas:

  • Os pares de coordenadas são valores numéricos ou resultado de fórmulas? Considerei numéricos.
  • Começam em AC95 e vão até onde? Supus que fossem até a última linha com dados da coluna AD.
  • No meu entendimento, cada bloco (área) de células não-vazias contém sempre um número par de linhas e a cada duas linhas, a primeira é a coordenada do ponto inicial e a segunda a do ponto final da entidade (Line), correto?

Se não for isso, anexe o arquivo Excel para facilitar o entendimento, ok?

Teste o seguinte código:


Sub DrawLines()
  Dim rgXY As Range, A As Range, i As Long, Inicio(0 To 3) As Double, Fim(0 To 2) As Double
  With Worksheets("Detalhamento")
    Set rgXY = .Range("AC95", .Cells(Rows.Count, "AD").End(xlUp)).SpecialCells(xlCellTypeConstants, xlNumbers)
  End With
  For Each A In rgXY.Areas
    For i = 1 To A.Rows.Count / 2
      Inicio(0) = A.Cells(2 * i - 1, 1): Inicio(1) = A.Cells(2 * i - 1, 2): Inicio(2) = 0
         Fim(0) = A.Cells(2 * i, 1):        Fim(1) = A.Cells(2 * i, 2):        Fim(2) = 0
      Set Arm_Long1 = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Inicio, Fim)
      Arm_Long1.Layer = "Arm_Longitudinal"
      Arm_Long1.Update
      AutoCAD.Application.Update
    Next i
  Next A
End Sub

 

 

Bom dia Edson.

 

Muito obrigado pela ajuda. Deu certo aqui com seu código.

 

Valeu!

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!