Calendário Compacto para 2014
O procedimento a seguir copia somente as células visíveis numa tabela ou lista para uma nova planilha. Este código usa o objeto ListObject para representar a tabela ou lista. Um detalhe adicional deste procedimento é o de que o número de ocorrências são não-contíguas.
O Excel tem um limite de 8.192 áreas não contíguas que pode ser copiada para qualquer tabela. O código pergunta se deseja criar uma tabela com os novos dados sobre na nova planilha. Se cancelar esta caixa de diálogo, será perguntado se deseja copiar apenas os formatos de modo que o intervalo pareça profissional.
Sub CopyListOrTable2NewWorksheet()Dim New_Ws As WorksheetDim ACell As RangeDim CCount As LongDim ActiveCellInTable As BooleanDim CopyFormats As VariantDim sheetName As String'Verifique se a planilha ou pasta de trabalho está protegida.If ActiveWorkbook.ProtectStructure = True Or ActiveSheet.ProtectContents = True ThenMsgBox "Esta macro não funcionará quando a pasta de trabalho ou planilha estiver protegida contra gravação."Exit SubEnd If'Definir uma referência ao ActiveCell. Você sempre pode usar a ACell'ponto para esta célula, não importa onde você está na pasta de trabalho.Set ACell = ActiveCell'Teste para ver se ACell está em uma tabela ou lista. Note-se que, usando ACell.ListObject, você'Não é necessário saber o nome da tabela para trabalhar com ele.On Error Resume NextLet ActiveCellInTable = (ACell.ListObject.Name <> "")On Error GoTo 0'Se a célula está em uma lista ou tabela executar o código.If ActiveCellInTable = True ThenWith ApplicationLet .ScreenUpdating = FalseLet .EnableEvents = FalseEnd With'Testar se existem mais de 8192 áreas separadas. Excel suporta apenas'um máximo de 8.192 áreas não contíguas através de macros VBA e manual.On Error Resume NextWith ACell.ListObject.ListColumns(1).RangeLet CCount = .SpecialCells(xlCellTypeVisible).Areas(1).Cells.CountEnd WithOn Error GoTo 0If CCount = 0 ThenMsgBox "Há mais de 8192 áreas, de modo que não é possívelcopiar os dados visíveis para uma nova planilha. Dica: Classifique os seus dados antes de aplicar o filtro e tente esta macro novamente.", _vbOKOnly, "Copy to new worksheet"Else'Copy the visible cells.ACell.ListObject.Range.Copy'Add a new Worksheet.Set New_Ws = Worksheets.Add(after:=Sheets(ActiveSheet.Index))
'Prompt the user for the worksheet name.Let sheetName = InputBox("Qual é o nome da nova worksheet?", _"Name the New Sheet")
On Error Resume NextNew_Ws.Name = sheetNameIf Err.Number > 0 ThenMsgBox "Altere o nome da Aba : " & New_Ws.Name & _" manualmente após a macro está pronta. O nome da sheet" & _" digitada já existe ou você usou caracteres" & _" que não são permitidos."Err.ClearEnd IfOn Error GoTo 0'Paste the data into the new worksheet.With New_Ws.Range("A1").PasteSpecial xlPasteColumnWidths.PasteSpecial xlPasteValuesAndNumberFormats.SelectLet Application.CutCopyMode = FalseEnd With'Call the Create List or Table dialog.Let Application.ScreenUpdating = TrueApplication.CommandBars.FindControl(ID:=7193).ExecuteNew_Ws.Range("A1").Select
Let ActiveCellInTable = FalseOn Error Resume NextLet ActiveCellInTable = (New_Ws.Range("A1").ListObject.Name <> "")On Error GoTo 0Let Application.ScreenUpdating = False'Se você não criar uma tabela, você tem a opção de copiar os formatos.If ActiveCellInTable = False ThenApplication.GoTo ACellLet CopyFormats = MsgBox("Você também deseja copiar os formatos?", _vbOKCancel + vbExclamation, "Copy to new worksheet")If CopyFormats = vbOK ThenACell.ListObject.Range.CopyWith New_Ws.Range("A1").PasteSpecial xlPasteFormatsLet Application.CutCopyMode = FalseEnd WithEnd IfEnd IfEnd If'Select the new worksheet if it is not active.Application.GoTo New_Ws.Range("A1")With ApplicationLet .ScreenUpdating = TrueLet .EnableEvents = TrueEnd WithElseMsgBox "Selecione uma célula na sua lista ou tabela antes de executar a macro.", _vbOKOnly, "Copy to new worksheet"End IfEnd Sub
Tags: Excel, VBA, cell, activecell, table, list, Copying, copy, Table, List, Worksheet, Workbook, ListObject
Nenhum comentário:
Postar um comentário