Página 1 de 1
VBA | Else then com GOTO
Enviado: 29 Jun 2022 às 07:52
por atcgfc
Bom dia,
Antes de mais, referir que tenho aprendido muito neste fórum.
Montei uma estrutura de decisão para apagar conteúdo de uma tabela, no entanto tem dado o erro 13, ou seja o que eu quero é o seguinte se o conteúdo naquela linha for vazio acabou a estrutura de decisão, mas caso não seja vazio selecionar a linha e as linhas abaixo e apagar o conteúdo.
Código: Selecionar todos'Apagar conteúdo da folha c/Estrutura de decisão
If Sheets("Folha1").Range("A12:G12").Value = "" Then
MsgBox "Sem conteúdo para apagar"
GoTo Acabou
Else: Sheets("Folha1").Range("A12:G12").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
MsgBox "Apagado conteúdo"
Acabou:
End If
Cumprimentos,
Álvaro Gonçalves
Re: VBA | Else then com GOTO
Enviado: 29 Jun 2022 às 09:06
por osvaldomp
Experimente:
Código: Selecionar todosIf Application.CountA(Range("A12:G12")) <> 0 Then Range("A12:G" & Cells(Rows.Count, 1).End(3).Row).Value = ""
Re: VBA | Else then com GOTO
Enviado: 29 Jun 2022 às 09:22
por atcgfc
Como sempre, funcionou às mil maravilhas.
Muito obrigado, no entanto consegue explicar-me porquê que nenhum do códigos que inseri não funcionaram ?
Tentei com estes dois
Código: Selecionar todosIf Sheets("Folha1").Range("A12:G12").Value <> "" Then
Sheets("Folha1").Range("A12:G12").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
MsgBox "Apagado conteúdo"
Else: GoTo Acabou
Acabou:
End If
Código: Selecionar todosIf Sheets("Folha1").Range("A12:G12").Value = "" Then
MsgBox "Sem conteúdo para apagar"
GoTo Acabou
Else: Sheets("Folha1").Range("A12:G12").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
MsgBox "Apagado conteúdo"
Acabou:
End If
Cumprimentos,
Álvaro Gonçalves
Re: VBA | Else then com GOTO
Enviado: 29 Jun 2022 às 10:32
por osvaldomp
Olá, Álvaro.
If ActiveSheet.Range("A12:G12").Value = "" Then
Utilizada na forma acima, a Propriedade Value só pode se referir a uma única célula, e não a um intervalo com múltiplas células, por isso retorna erro.
Para verificar o preenchimento de um intervalo há opções como as funções de planilha =CONT.SE(), =CONT.NÚM(), =CONTAR.VAZIO() e =CONT.VALORES().
E foi a função em VBA que corresponde a CONT.VALORES que utilizei no código que eu sugeri ~~~> Application.CountA(Range("A12:G12"))
Re: VBA | Else then com GOTO
Enviado: 29 Jun 2022 às 10:42
por atcgfc
Muito obrigado Osvaldo.
Optei pelo Código que sugeriste com o end if na linha posterior.
No entanto, os códigos que tinha com uma pequena alteração também resultaram.
Código: Selecionar todosIf Sheets("Folha1").Range("A12").Value = "" Then
MsgBox "Sem conteúdo para apagar"
GoTo Acabou
Else: Sheets("Folha1").Range("A12:G12").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
MsgBox "Apagado conteúdo"
Acabou:
End If
Código: Selecionar todosIf Application.CountA(Range("A12:G12")) <> 0 Then
Range("A12:G" & Cells(Rows.Count, 1).End(3).Row).Value = ""
End If
If Sheets("Folha1").Range("A12").Value <> "" Then
Sheets("Folha1").Range("A12:G12").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
MsgBox "Apagado conteúdo"
Else: GoTo Acabou
Acabou:
End If
Cumprimentos,
Álvaro Gonçalves
Re: VBA | Else then com GOTO
Enviado: 29 Jun 2022 às 11:12
por osvaldomp
Os comandos GoTo Acabou ... Acabou: e Else: GoTo Acabou ... Acabou: são desnecessários, pois a instrução If ...Then ... Else é mais esperta e inteligente do que você supõe.
Exclua esses comandos que citei, execute os seus códigos no modo Depurar (via F8) e observe.
Re: VBA | Else then com GOTO
Enviado: 23 Ago 2022 às 12:14
por atcgfc
Olá Osvaldo,
Pode ajudar-me ? Tou com um problema na Macro que desenvolvi com este código.
O código está nas linhas infra.
O problema é o seguinte, se executar linha a linha, através do F8, ele executa a estrutura de decisão.
Se for através do botão ele nem sempre apaga a linha, as vezes coloca a partir das linhas seguintes.
Código: Selecionar todosSub SAP_EC_Ficheiro1()
'Definição de variáveis
Dim caminho As Variant
Dim ficheiro_sap As Workbook, ficheiro_excel As Workbook
Dim contarlinhas As Long
Application.ScreenUpdating = False
'Estrutura de decisão (if/Then) para apagar o conteúdo da folha
If Sheets("Folha1").Application.CountA(Range("A12:G12")) <> 0 Then
Sheets("folha1").Range("A12:G" & Cells(Rows.Count, 1).End(3).Row).Value = ""
End If
' Abrir Shell da localização do ficheiro
caminho = Application.GetOpenFilename
'Estrutura de decisão
If caminho = False Then Exit Sub
Workbooks.Open caminho, , True
'Definição dos ficheiros
Set ficheiro_excel = ThisWorkbook
Set ficheiro_sap = ActiveWorkbook
'Apagar linhas e colunas do ficheiro_sap
ficheiro_sap.Sheets(1).Columns(4).Delete
ficheiro_sap.Sheets(1).Columns(2).Delete
ficheiro_sap.Sheets(1).Columns(1).Delete
ficheiro_sap.Sheets(1).Rows("1:13").Delete
'Copiar erros do sap para ficheiro excel
ficheiro_sap.Sheets(1).Range("A1").CurrentRegion.Copy ficheiro_excel.Sheets("Folha1").Range("A12")
'Contar linhas exportadas do ficheiro SAP
contarlinhas = ficheiro_sap.Sheets(1).Range("a1").CurrentRegion.Rows.Count
'Mensagem a aparecer com o número de linhas na folha
MsgBox "Extraídas " & contarlinhas & " linhas de erro do SAP", vb0k0nly, "EMMA" & Now()
Application.CutCopyMode = False
'Fechar ficheiro sap
ficheiro_sap.Close savechanges:=False
End Sub
Cumprimentos,
Álvaro
Re: VBA | Else then com GOTO
Enviado: 23 Ago 2022 às 17:24
por osvaldomp
Olá, Álvaro.
O erro que você relatou ocorre porque este comando ~~~> Cells(Rows.Count, 1).End(3).Row busca a última linha com conteúdo na coluna A da planilha ativa ao executar a macro, que se não for a Folha1 então poderá apresentar resultado não desejado.
Para buscar a última linha da Folha1, mesmo que ela não seja a planilha ativa, é preciso referenciá-la, conforme em vermelho abaixo.
Sheets("Folha1").Range("A12:G" & Sheets("Folha1").Cells(Rows.Count, 1).End(3).Row).Value = ""