Como adicionar uma folha em uma planilha no VBA

Novembro 2016

Existem duas maneiras de proceder, dependendo do resultado esperado: o método da Cópia, para obter uma cópia de uma folha existente, ou o método Add, para adicionar uma nova folha em branco ao seu arquivo.

Na programação, devemos verificar se o nome da nova folha está conforme, ou seja, o nome da folha não deve ser idêntico ao de uma folha já existente, assim como não deve conter certos caracteres proibidos. Em ambos os casos, os controles devem ser os mesmos.

Método da Copia

Este método realiza uma cópia conforme a folha que você copia. O formato e os dados serão idênticos na nova folha criada.

Sintaxe

Expressão: Copy (Before, After).
Expressão representa uma Sheet (planilha) ou Worksheet (planilha de trabalho).

Os parâmetros ("Before e After") são opcionais. Você poderá especificar apenas um desses dois parâmetros. Eles são tipo Variante e representam a folha antes ou depois daquela que você quer copiar. Se o parâmetro for omitido, a folha é automaticamente copiada em uma nova planilha.

O que acontece

Ao criar uma nova folha por esse método, ela:
É criada no lugar desejado (antes ou depois de outra folha da pasta),
É nomeada pelo nome da folha copiada (ex:: Sheet1 > Sheet1 (2)),
É idêntica à folha copiada,
E torna-se a planilha ativa.

Se a folha for copiada em uma nova pasta, esta se torna a planilha ativa.

Exemplos de uso

Copie a "Plan1" depois da "Plan3"
Worksheets("Plan1").Copy After:=Worksheets("Plan3")

Copie a "Plan4" antes da "Plan2":
Sheets("Plan4").Copy Before:=Sheets("Plan2")

Copie a planilha de "recop" em uma nova pasta:
Worksheets("recop").Copy

Copie a planilha de índice 1 na última posição do arquivo, independentemente do nome da última planilha:
Sheets(1).Copy After:=Sheets(Sheets.Count)

Copie a planilha de índice 10 na primeira posição do arquivo, independentemente do nome da primeira planilha:
Sheets(10).Copy Before:=Sheets(1)

Se quiser copiar várias planilhas de sua planilha ativa em um novo arquivo:
Sheets(Array("Plan1", "Plan3", "Plan5")).Copy

Método Add

Crie uma nova planilha de cálculo, de gráfico ou de macro. A nova planilha se tornará a planilha ativa. E, sendo uma nova folha, esta será virgem de qualquer dado e de qualquer formato.

Sintaxe

Expressão: .Add (Before, After, Count, Type).
Expressão representa um objeto Sheet ou Worksheet.
Os parâmetros (Before, After, Count e Type) são opcionais.

Você deve especificar apenas um dos parâmetros Before e After. Estes são do tipo Variante e representam a planilha antes ou depois da qual você deseja colocar a sua nova planilha.

O parâmetro Count (opcional) é do tipo Variante. Ele representa o número de planilhas que você deseja adicionar. O parâmetro tipo representa o tipo de planilha a ser adicionada. Trata-se de:

xlWorksheet, adiciona uma planilha,
xlChart, adiciona uma planilha de gráfico,
xlExcel4MacroSheet, adiciona uma planilha do Excel4,
xlExcel4IntlMacroSheet, adiciona uma planilha de macros do Excel,
xlDialogSheet, adiciona uma planilha de caixa de diálogo.

Atenção: todos estes parâmetros devem ser nomeados. Convém, então, nomeá-los. Esta sintaxe reenviará um erro:

ActiveWorkbook.Sheets.Add Before:=Worksheets(Worksheets.Count), , 1, xlChart

Exemplos de uso

Coloque uma planilha depois da última planilha do arquivo:

Sheets.Add After:=Worksheets(Worksheets.Count)


Adicione três planilhas na primeira posição do arquivo ativo:
 ActiveWorkbook.Sheets.Add Before:=Worksheets(1), Count:=3


Atenção: as três planilhas aparecem sucessivamente, a ordem poderá ser invertida. A planilha ativa é a última a ser criada.

Adiciona uma planilha de gráfico de um arquivo chamado "Wbk18" (Open!), depois a planilha com o nome "Plan4".

WorkBooks("Wbk18").Sheets.Add After:=Worksheets("Plan4"), Type:=xlChart
.

Atenção: A localização da planilha criada pode reservar algumas pequenas surpresas...

As funções de verificação

Se a planilha já existe em uma pasta

'Verifique se a planilha já existe. 

Function Planilha_Exist(strWbk As String, strWsh As String) As Boolean

'Gerenciador de erro
On Error Resume Next
     "Teste"
     Planilha_Exist = 
<code basic>'Verifique se a planilha já existe
Function Planiha_Exist(strWbk As String, strWsh As String) As Boolean 


===Se o nome desejado tiver um caractere proibido===


<code Basic> 'Verifique se a string contém um caractere a ser evitado
Função valid_name (strName As String, strchr As String) As Boolean
Dim i As Byte, Tb_Car () As String, strProhib As String
strProhib = "/\:*?""<>|" ' Lista dos caracteres a serem evitados  
Tb_Car = Split(StrConv(strProhib, vbUnicode), Chr$(0))
'Loop sobre todos os caracteres a serem evitados.
  'Atenção: o -1 se deve ao split da string pelo separador Chr(0)
  'Na verdade, na string que termina por um Chr(0) convém excluir este último caractere.  
For i = LBound (Tb_Car) To 
UBound (Tb_Car) - 1
     'Verifique se a string contém um caractere proibido
     If InStr(strName, Tb_Car (i))> 0 Then
 'Se sim: Return False
        Valid_Name = False
 'E retorna o caractere proibido 
        strChr = Tb_Car(i)
        Exit Function
    End If
Next i
'Se OK: Return True
Valid_Name = True
End Function

Código de chamada das funções de verificação

Em ambos os métodos, o código é o mesmo. Na verdade, a planilha criada leva um nome determinado pelo Excel e torna-se a planilha ativa. Como não se pode saber com antecedência o nome da nova planilha (Sheet1 (3), por exemplo), vamos usar o fato de que ela seja a planilha ativa, ou seja: ActiveSheet.

Sub Principal()
Dim strNewName As String, strCara As String

strNewName = "NewSheet"
If Valid_Name(strNewName, strCara) = False Then
    MsgBox "O nome: " & strNewName & " é invalido." & vbCrLf & _
            "Um nome de planilha não pode 
conter o caractere : " & strCara, vbCritical
    Exit Sub
End If
If Planilha_Exist(ThisWorkbook.Name, strNewName) = True Then
    MsgBox "O nome: " & strNewName & " é invalido." & vbCrLf & _
            "Este nome de planilha já é usado nesta pasta.", vbCritical
    Exit Sub
End If
ThisWorkbook.Sheets.Add 'Ou: ThisWorkbook.Sheets("Plan1").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = strNewName
End Sub

Complementos úteis do Office 2013

O pacote Office 2013 traz dois métodos complementares. Trata-se da cópia de um intervalo de células de uma planilha para várias planilhas e do método Add2 para os NewLayouts das coleções de objetos gráficos.

Cópia parcial

Este método só está disponível a partir das versões do Office 2013. Você só quer copiar um intervalo de células da planilha "Plan1" para as planilhas "Plan3", "Plan5" e "recop". Para isso, você pode usar o método FillAcrossSheets:

Planilhas = Array("Plan3", "Plan5", "Plan7")
Sheets (Folhas).FillAcrossSheets Worksheets("Plan1").Range("A1:C5")


Os parâmetros deste método são:
Range (Intervalo): obrigatório
Tipo: opcional. Ele indica como copiar o intervalo e pode ter três valores:
xlFillWithAll: copia o conteúdo e os formatos.
xclFillWithContents: copia o conteúdo.
xlFillWithFormats: copia os formatos.

Método Add2

Disponível a partir do Office 2013. Este método está disponível apenas para as coleções de objetos gráficos e retorna um erro "Run Time" quando é usado com objetos "Sheets e WorkSheets". Não existe mais informação no site "Microsoft.com", exceto a sintaxe:

Expressão: .Add (Before, After, Count, NewLayout).

Expressão representa um objeto Worksheet.

Os parâmetros são idênticos aos do método Add, fora a substituição do Tipo pelo parâmetro NewLayout. Se NewLayout tem o valor true, o gráfico é inserido com as novas regras de layout dinâmico (o título e a legenda aparecem somente se houver várias séries.).

Veja também :
Este documento, intitulado « Como adicionar uma folha em uma planilha no VBA »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.