Questão Excel nova folha automática com cópia de coluna e data de hoje


Eu quero escrever uma rotina VBA que "diariamente"

  • criar uma nova folha
  • dê essa nova folha um nome do formulário DD.MM.YY (com zeros à esquerda), com base na data de hoje (por exemplo, 25.07.18)
  • copiar os valores das colunas A e B da minha DataInput Folha na nova folha.

O que quero dizer com "diariamente"? Apenas se a hora atual for = ou> uma hora do dia especificada, crie a planilha, senão simplesmente ignore.

Eu não acho que seja difícil de administrar. Eu tentei combinar algumas fórmulas para juntá-las, mas elas me dão um erro o tempo todo.

Eu estava pensando em algo

Option Explicit
Sub ReportSheet_Today()
    Dim szTodayDate As String

    szTodayDate = Format(Date, "dd.mm.yy")
    On Error GoTo MakeSheet
    Sheets(szTodayDate).Activate
    If Time < TimeValue("9:00:00") Then
        'MakeSheet:
        Sheets.Add , Worksheets(Worksheets.Count)
        ActiveSheet.Name = szTodayDate
        Sheets("DataInput").Select
        Range("A:A").Copy
        Sheets("szTodayDate").Select
        Range("A:A").Select
        ActiveSheet.Paste
    End IF
End Sub

0


origem


Então, qual linha é o erro? Qual é a mensagem de erro? - DavidPostill♦
@DavidPostill ignorando o erro de compilação do rótulo de linha comentado, que seria o erro de tempo de execução 9 da tentativa de desreferencia Sheets("szTodayDate")que não existe. O OP precisa remover as aspas duplas que estão transformando sua variável em um literal de string. - Mathieu Guindon
Como eu sou um novato em vba, e é um hobby para mim aprender "codificação" eu não consigo ver através destes significados de variáveis ​​/ strings. Eu sabia que algo estava errado aqui, mas não vi. - SarXes


Respostas:


O erro está aqui:

Sheets("szTodayDate").Select

szTodayDate não é o nome da folha; é uma variável local que contém uma string representando o nome da planilha ... mas você a está usando como um literal de string, então o VBA está tentando cancelar a referência a um objeto de pasta literalmente chamado "szTodayDate" ... e como não pode encontrá-lo, boom, erro em tempo de execução 9.

Remova as aspas duplas:

Sheets(szTodayDate).Select

Agora você estará desreferenciando um objeto de pasta com o nome o valor de a szTodayDate variável de string, o que é provável o que você pretendia.


Próximos passos...

Puxe a lógica de criação de folha em seu próprio procedimento separado; escrevendo pequenos procedimentos especializados que fazer uma coisa e fazê-lo bemvai facilitar muito a sua vida.

Você pode aproveitar os valores de retorno das funções: Worksheets.Add retorna uma referência ao objeto de planilha que foi criado - ao capturar essa referência em uma variável de objeto local, você remove a necessidade de Select e depois para trabalhar fora ActiveSheet.

Você também pode fornecer um destino parâmetro para Range.Copy, fazendo todo o selecionar-copiar-selecionar-colar operação um one-liner.

Public Function CreateReportSheet(ByVal reportDate As Date) As Worksheet

    Dim reportSheet As Worksheet
    Set reportSheet = AddNamedWorksheet(ThisWorkbook, Format$(reportDate, "dd.mm.yy"))

    'only needed if the sheet doesn't exist at compile-time.
    'if it *does* exist at compile-time, just set the sheet's (Name) property to "inputSheet".
    'that identifier will then be globally available anywhere in the project.
    'Dim inputSheet As Worksheet
    'Set inputSheet = ThisWorkbook.Worksheets("DataInput")

    inputSheet.Range("A:A").Copy reportSheet.Range("A:A")
    Set CreateReportSheet = reportSheet

End Function

Public Function AddNamedWorksheet(ByVal wb As Workbook, ByVal sheetName As String) As Worksheet
    Dim sheet As Worksheet
    Set sheet = wb.Worksheets.Add
    On Error Resume Next ' naming the sheet will throw if name already exists
        sheet.Name = sheetName
    On Error GoTo 0 ' restore error handling
    Set AddNamedWorksheet = sheet
End Function

0



Vejo que você tem um End Sub na primeira fase, mas não consigo ver nenhuma referência "Sub" para que ele não seja executado? .Também como eu defini para criar essa folha se não existe em 1 um relógio e ignorar antes de 1. Eu sei que é fácil para você, mas para um novato é como encontrar algo no oceano.Vejo o que você escreveu aqui e Eu tento entender. Esse tempo = ou> é definido pela variável booleana para ver se o estado IF é verdadeiro ou falso? Essa declaração não consigo entender, mesmo se você descreveu. 'Dim inputSheet As Worksheet' Definir inputSheet = ThisWorkbook.Worksheets ("DataInput") - SarXes
@SarXes typo, que deveria ter sido End Function - fixo Eu meio que deliberadamente pulei a parte do tempo. IMO uma macro deve fazer exatamente o que você diz para fazer; se você precisar que ele seja executado em um horário específico, você deve implementá-lo em outro lugar e invocar esse procedimento a partir daí. Dessa forma, você pode sempre testar tudo e executá-lo novamente com vários parâmetros, independentemente da hora do dia. - Mathieu Guindon
Implementar a macro no código que você escreveu? Sim, eu sei que você já viu quando você escreve o comentário, mas eu apenas olho para ele como wth? A macro deve estar com uma função Sub talvez .. - SarXes
Procure por algo como "vba invocando um procedimento em um horário específico", você obterá muitos resultados em Estouro de pilha; basicamente você vai querer lidar com o Workbook_Open evento (em ThisWorkbook) e configuração Application.OnTime para invocar o procedimento no horário especificado. Eu meio que não gosto dessa abordagem, porque faz com que o Excel finja ser algum tipo de agendador de tarefas, e requer que ele esteja aberto naquele horário específico, então, durante a noite, o Windows Update reiniciando sua máquina. Mas sim, é viável e não envolve nenhum tipo especial de lógica condicional. - Mathieu Guindon
Para simplificar, não quero executá-lo todo o tempo apenas para verificar a hora atual com a hora definida depois que a pasta de trabalho foi aberta e, em seguida, criar essa folha de relatório automaticamente. Isso eliminaria o problema se eu esquecesse ou apenas ignorasse por qualquer motivo. Novato noob perguntando como atribuir um botão para fazer essa folha, criando um botão. Quero dizer como seria o comando para atribuir uma macro para ele, como agora, se eu quiser executá-lo não consigo ver entre as macros já reated. - SarXes