Folha nova automática do Excel com cópia da coluna e data de hoje

0

Eu quero escrever uma rotina VBA que "diariamente"

  • crie uma nova planilha
  • dê a essa nova planilha um nome no formato DD.MM.YY (com zeros à esquerda), com base na data de hoje (por exemplo, 25.07.18 )
  • copie os valores das colunas A e B da minha DataInput planilha 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 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
    
por SarXes 25.07.2018 / 20:24

1 resposta

0

O erro está aqui:

Sheets("szTodayDate").Select

szTodayDate não é o nome da planilha; é uma variável local que contém uma string representando o nome da planilha ... mas você a está usando como string literal , então o VBA está tentando cancelar a referência a um objeto de pasta que é literalmente chamado "szTodayDate" ... e como não consegue 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 do valor da variável szTodayDate 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; escrever procedimentos pequenos e especializados que façam uma coisa e façam bem , facilitarão muito a sua vida.

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

Você também pode fornecer um parâmetro destination para Range.Copy , tornando toda a operação select-copy-select-paste uma linha única.

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
    
por 25.07.2018 / 21:43