2014-09-04 117 views
0

因此,我试图在Excel中创建一种日常食物日记,我知道我想要它做什么,我只是在努力实现所述想法...
我已经创建一个我希望用户每天进入的模板,但我不希望用户每天都必须创建一个新的工作表才能实现此目的,我想创建一个在Excel打开后将运行的宏,并且将检查最后一张输入工作表的填写日期,如果它少于当前日期,请创建一个新的工作表并显示要填写的工作表!Excel宏,每天添加新工作表

这是我发现并尝试到目前为止,但它没有做任何事情,并提出错误。

Private Sub Workbook_Open() 
Dim sh As Worksheet 
Dim shName As String 

'name of the sheet template 
shName = "Food Diary.xltm" 

'Insert sheet template 
With ThisWorkbook 
    If .Range("A1") < Date Then 
     .Range("A1") = Date 
     Set sh = Sheets.Add(Type:=Application.TemplatesPath & shName, _ 
          after:=.Sheets(.Sheets.Count)) 
     'Give the sheet a name, today's date in this example 
     On Error Resume Next 
     sh.Name = "Day" & " " & Worksheets.Count 
     If Err.Number > 0 Then 
      MsgBox "Change the name of Sheet : " & sh.Name & " manually" 
      Err.Clear 
     End If 
     On Error GoTo 0 
    End If 
    End With 

End Sub 

希望你能看到我试图用这个来实现。
如果今天的日期大于表格中的最新日期,请创建一个名为日期[张数]的新日期,我不确定日期事件,就好像日期输入到“A1”并且一天过去一样工作簿打开时不会更新?

我也发现了一件似乎是关于在创建新工具时隐藏工作表的东西,这是相当不错的,只有当前工作表才会显示,但其他人应该仍然可以通过每个按下后滚动浏览每个按钮的按钮来访问,我认为我可以执行按钮编码,但我不确定这些工作表的可见性以及隐藏后是否可以取消隐藏它们对此的帮助也会很大。

+0

*想出错误。*哪些错误以及哪些行? – 2014-09-04 14:54:50

+1

'With ThisWorkbook'然后'.Range(...'是一个错误,因为你没有合格*工作表*。范围属于表单,而不是工作簿:) – 2014-09-04 14:55:22

+0

@DavidZemens好的,我已经改变{ThisWorbook }到{ActiveSheet},现在它正在工作,但较旧的工作表的日期不会保持原样,它会更改为今天的日期...任何想法? – MrPhooky 2014-09-04 15:10:24

回答

1

问题是您在添加新工作表之前是否正在分配给A1。因此,您正在写入ActiveSheet,而不是您要创建的工作表(尚未创建!)。

就像这样,如果我理解正确。应该查询活动工作表范围A1,与当前日期进行比较,并添加新工作表,隐藏旧工作表等。

Private Sub Workbook_Open() 
Dim thisSheet as Sheet 
Dim sh As Worksheet 
Dim shName As String 

'name of the sheet template 
shName = "Food Diary.xltm" 

'#### I like to use variables for worksheets: 
Set thisSheet = ThisWorkbook.ActiveSheet 

'Insert sheet template 
With thisSheet 
    If .Range("A1") < Date Then 
     Set sh = Sheets.Add(Type:=Application.TemplatesPath & shName, _ 
          after:=.Sheets(.Sheets.Count)) 
     '#### Put today's date in the new sheet: 
     sh.Range("A1") = Date 

     'Give the sheet a name, today's date in this example 
     On Error Resume Next 
     sh.Name = "Day " & Worksheets.Count 
     If Err.Number > 0 Then 
      MsgBox "Change the name of Sheet : " & sh.Name & " manually" 
      Err.Clear 
     End If 
     On Error GoTo 0 

     '#### Hide the old sheet 
     .Visible = xlSheetHidden 

    End If 
End With 

End Sub 
+0

这很好,谢谢,更快的问题,我将如何取消隐藏它?有了VBA代码当然,是不是像 .Visible = True? – MrPhooky 2014-09-04 15:41:17

+0

'工作表().Visible = xlSheetVisible'或'= -1'或'= True'应该工作:) – 2014-09-04 16:00:18