我想编写一个 VBA 例程,可以“每天”
- 创建新工作表
- 给新工作表命名为日月年(带前导零),基于今天的日期(例如,
25.07.18
) - 将工作表 A 和 B 列的值复制
DataInput
到新工作表中。
我所说的“每日”是什么意思?如果当前时间 = 或 > 一天中的指定时间,则创建工作表,否则忽略。
我觉得这并不难。我尝试组合一些公式来将它们放在一起,但它们总是出错。
我在想一些事
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
答案1
错误在这里:
Sheets("szTodayDate").Select
szTodayDate
不是工作表的名称;它是一个局部变量,包含表示工作表名称的字符串……但你使用它作为字符串字面量,因此 VBA 尝试取消引用工作表对象字面上地名为“szTodayDate”...并且由于找不到它,因此出现运行时错误 9。
删除双引号:
Sheets(szTodayDate).Select
现在你将取消引用以的价值字符串szTodayDate
变量,这可能就是您想要的。
下一步...
将创建工作表的逻辑放入其自己的单独程序中;编写小型的专门程序,专做一件事并做好它,将使您的生活变得更加轻松。
您可以利用函数的返回值:Worksheets.Add
返回对已创建的工作表对象的引用 - 通过将该引用捕获到本地对象变量中,您无需对它进行操作Select
,然后就可以继续工作ActiveSheet
。
您还可以提供目的地参数Range.Copy
,使得整个选择-复制-选择-粘贴操作一行。
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