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
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