Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Macro para deletar colunas vazias

2,476 views
Skip to first unread message

jordaojunior

unread,
Aug 2, 2007, 8:18:04 AM8/2/07
to
Tenho uma planilha no Excel2007 com mais de 2000 colunas. Depois de tratar
alguns dados, dentro dessas 2000 colunas eu obtenho algumas colunas vazias e
algumas com dados.

Gostaria de criar uma macro que percorresse a planilha deletando todas as
colunas vazias, de modo que as colunas contendo dados sejam agrupadas.

Como posso fazer isso?

Rodrigo Ferreira

unread,
Aug 2, 2007, 10:32:14 AM8/2/07
to
Tente isso:

Sub RemoveBlankCols()
Dim objSheet As Worksheet
Dim RowsCount As Long

Set objSheet = Worksheets("Plan1") 'Nome da sua planilha
RowsCount = objSheet.Rows.Count

For Each objCol In objSheet.Columns
RowsCountAux = objSheet.Cells(1, objCol.Column).End(xlDown).Row
If RowsCountAux = RowsCount Then
objCol.EntireColumn.Delete
End If
Next

End Sub

Espero ter ajudado
--

Rodrigo Ferreira
Regards from Brazil


"jordaojunior" <jordao...@discussions.microsoft.com> escreveu na mensagem
news:8DFD23CC-AF61-43EC...@microsoft.com...

jordaojunior

unread,
Aug 2, 2007, 2:24:05 PM8/2/07
to
Oi Rodrigo, você ajudou sim, mas não funcionou porque eu não prestei atenção
numa coisa. As colunas que eu quero deletar elas não estão necessariamente
vazias em todas as células. Na verdade, elas estão vazias apenas entre as
linhas 3 e 98. Portanto, preciso que a macro delete todas as colunas que
nesse intervalo não apresente nehum valor.
Obs.: as células desse intervalo não estão vazias. Elas possuem uma fórmula
condicional que para uma determinada condição o valor exibido é "" (vazio).

Pode me ajudar nessa situação?

Obrigado!

Sub formatar2()
'
' Macro1 Macro
'
' Atalho do teclado: Ctrl+y
'
Windows("snp.xlsx").Activate

Dim objSheet As Worksheet
Dim RowsCount As Long

Set objSheet = Worksheets("haplótipos") 'Nome da planilha
RowsCount = objSheet.Rows.Count

For Each objCol In objSheet.Columns
RowsCountAux = objSheet.Cells(1, objCol.Column).End(xlDown).Row
If RowsCountAux = RowsCount Then
objCol.EntireColumn.Delete
End If
Next

End Sub

------------------------------------------

Rodrigo Ferreira

unread,
Aug 3, 2007, 10:09:17 AM8/3/07
to
Olá Jordao,

Tente o seguinte:

Sub formatar2()
'
' Macro1 Macro
'
' Atalho do teclado: Ctrl+y
'
'Windows("snp.xlsx").Activate

Dim objSheet As Worksheet
Dim RowFim As Long

Set objSheet = Worksheets("Plan1") 'Nome da planilha
RowIni = 3
RowFim = 98

For Each objCol In objSheet.Columns

For Each objCell In objCol.Cells
'Debug.Print objCell.Address
If objCell.Row > RowIni Then
If objCell.Value <> "" Then
TemValor = True
Exit For
Else
TemValor = False
End If
If objCell.Row = RowFim Then
Exit For
End If
Else
TemValor = True
End If
Next
If Not TemValor Then
'Stop
objCol.EntireColumn.Delete
End If
Next

End Sub

Espero ter ajudado
--

Rodrigo Ferreira
Regards from Brazil


"jordaojunior" <jordao...@discussions.microsoft.com> escreveu na mensagem

news:FC91773A-6E7A-4E9F...@microsoft.com...

jordaojunior

unread,
Aug 3, 2007, 10:56:01 AM8/3/07
to
Oi rodrigo. Eu colei a macro que você criou e não funcionou. Ele entre em
loop e fica aparecendo..."Calculando" e "Pronto" mas não sai disso.

Sabe me dizer?

Obrigado mais uma vez.

Abraços,

Hamilton Jordão

Joao Livio [MVP]

unread,
Aug 3, 2007, 12:01:39 PM8/3/07
to
Boas Rodrigo!

Não sei se estou a ver mal mas acho que te esquecestes de declarar a
variável " TemValor" como Boolean?

Dim TemValor As Boolean

Cpts
Tito

--
Meu site office: http://officept.mvps.org/
Meu Site versão Blog: http://officept.blogspot.com/
FEEDs (Atom): http://officept.blogspot.com/feeds/posts/default


"Rodrigo Ferreira" <cab...@hotmail.com> wrote in message
news:OUyvGed1...@TK2MSFTNGP05.phx.gbl...

Rodrigo Ferreira

unread,
Aug 3, 2007, 2:04:54 PM8/3/07
to
Estranho Jordão,
Pois fiz o teste aqui e funcionou normalmente.
Ou seja, toda a coluna que não tiver valor entre 3 e 98 (mesmo sendo
resultado de alguma fórmula) é excluída.

Obs.: O nome da sua planilha é mesmo "Plan1"?

--

Rodrigo Ferreira
Regards from Brazil


"jordaojunior" <jordao...@discussions.microsoft.com> escreveu na mensagem

news:C01267A0-059D-4F9F...@microsoft.com...

Rodrigo Ferreira

unread,
Aug 3, 2007, 2:06:55 PM8/3/07
to
Bem observado Joao, realmente esqueci de declarar a variável "TemValor" como
Boolean, mas isso não influencia o resultado da função.
Mas por não ter declarado-a, o próprio VB intende que ela é uma variável do
tipo "Variant" aceitando qualquer valor, mas como só utilizo os valores True
ou False, o resultado não é influenciado.
O único problema de variáveis do tipo "Variant" (ou variáveis sem
declaração) é que elas ocupam mais espaço em memória, mas nada que seja
expressivo.
Por isso que é sempre bom colocar "Option Explicit" no inicio de todo
módulo/form/etc, pois dessa forma, ao tentar compilar seu programa, o
próprio editor informará que a variável não foi declarada.

Obrigado pela observação.
--

Rodrigo Ferreira
Regards from Brazil


"Joao Livio [MVP]" <jli...@online.mvps.org> escreveu na mensagem
news:Oo0hTee1...@TK2MSFTNGP06.phx.gbl...

Joao Livio [MVP]

unread,
Aug 3, 2007, 4:55:04 PM8/3/07
to
Boas!

Aqui tb não funciona. (Excel 2007).

A Macro começa na coluna $G$, quando lá passa manda os valores para a coluna
$D$, e esta heinn?, não tens de dizer o que é "objCol" e "objCell" ?

Não será mais qq deste género?

Sub ApagaColunasBrancas()
Dim x As Long

With ActiveSheet
For x = .Cells.SpecialCells(xlCellTypeLastCell).Row _
To 1 Step -1

If WorksheetFunction.CountA(.Rows(x)) = 0 Then
ActiveSheet.Rows(x).Delete
End If

Next
End With

End Sub


"Rodrigo Ferreira" <cab...@hotmail.com> wrote in message

news:uNtU5if1...@TK2MSFTNGP02.phx.gbl...

Joao Livio [MVP]

unread,
Aug 3, 2007, 5:28:39 PM8/3/07
to
Boas Jordao!, mais uma opinião..será isto que queres?

Tenta

Sub ApagaLinhasBrancas()
Dim x As Long

With ActiveSheet
For x = .Cells.SpecialCells(xlCellTypeLastCell).Row _
To 1 Step -1

If WorksheetFunction.CountA(.Rows(x)) = 0 Then
ActiveSheet.Rows(x).Delete
End If

Next
End With

End Sub


"jordaojunior" <jordao...@discussions.microsoft.com> wrote in message
news:8DFD23CC-AF61-43EC...@microsoft.com...

Rodrigo Ferreira

unread,
Aug 3, 2007, 6:16:49 PM8/3/07
to
Mas esse código apaga a linha e não a coluna e pelo que entendi, ele quer
apagar a coluna

--

Rodrigo Ferreira
Regards from Brazil


"Joao Livio [MVP]" <jli...@online.mvps.org> escreveu na mensagem

news:eOiHCVh1...@TK2MSFTNGP06.phx.gbl...

Rodrigo Ferreira

unread,
Aug 3, 2007, 6:43:09 PM8/3/07
to
Seguindo a linha de raciocinio do Joao, para apagar as colunas em branco
(inclusive as colunas onde o resultado de alguma fórmula for branco) tente o
código abaixo

Sub ApagaColunasBrancas()
Dim x As Long

RowIni = 3
RowFim = 98
CountBlankRows = RowFim - RowIni + 1

With ActiveSheet
For x = .Cells.SpecialCells(xlCellTypeLastCell).Column To 1 Step -1
If WorksheetFunction.CountIf(Range(Cells(RowIni, x).Address _
& ":" & Cells(RowFim, x).Address), "") = CountBlankRows Then
ActiveSheet.Columns(x).Delete
End If

Next
End With

End Sub


--

Rodrigo Ferreira
Regards from Brazil

--

Rodrigo Ferreira
Regards from Brazil


"jordaojunior" <jordao...@discussions.microsoft.com> escreveu na mensagem

news:C01267A0-059D-4F9F...@microsoft.com...

Joao Livio [MVP]

unread,
Aug 4, 2007, 11:37:35 AM8/4/07
to
Upss..lapso..ja vi a modificação que fizestes tá óptimo ;), sendo assim o
teu código anterior funciona também, não sei onde fui buscar esta ideia das
Linhas, afinal era colunas, sorry.

Cpts
Tito

"Rodrigo Ferreira" <cab...@hotmail.com> wrote in message

news:e$Gqiuh1H...@TK2MSFTNGP06.phx.gbl...

venicio.r...@gmail.com

unread,
Aug 13, 2018, 3:08:01 PM8/13/18
to
E se eu quiser que ele apague algum conteúdo tipo "total de contas"?

josinaldo...@gmail.com

unread,
Apr 29, 2019, 2:53:06 PM4/29/19
to
E se ao invés de excluir as colunas, apenas ocultá-las.
0 new messages