我让我的宏工作了几天。作为我的新手,我在工作簿级编码,现在我把它变成了个人宏。当我在其他工作簿中运行完全相同的代码作为个人宏时,我遇到了一些问题。第一个问题我设法修复了一些更好但不够好的重新格式化:
With ThisWorkbook
For k = 1 To ThisWorkbook.Sheets.Count
If .Sheets(k).Name = "reportdata" Then
blnFound = True
Exit For
End If
Next k
If blnFound = False Then
.Sheets.Add
With ThisWorkbook
.Name = "reportdata" 'this is where the problem is at the moment
End With
End If
End With
Set datasheet = ThisWorkbook.Worksheets(1)
Set reportsheet = ActiveWorkbook.Worksheets("reportdata")
reportsheet.Move After:=Worksheets(1)
我想在这里创建另一张名为reportdata的工作表。如果该表已存在,则不会创建该表。
我认为我的问题可能在于ThisWorkbook参考。 for循环中的索引似乎已关闭,因此它可能正在处理除我预期之外的其他内容。我的意图是该宏的用户有一个工作簿,其中包含来自另一个源的数据,该数据库具有始终具有相同名称的工作表。因此用例非常静态。
如何使代码的这一部分中的引用工作在" global"规模而不仅仅是工作簿级别?
提前感谢您提供给我的任何提示!
答案 0 :(得分:2)
With ThisWorkbook
.Name = "reportdata" 'this is where the problem is at the moment
End With
该块扩展为ThisWorkbook.Name =&#34; reportdata&#34;,但是工作簿没有可写的Name属性 - 您应该命名的是您刚刚添加的工作表而不是工作簿。< / p>
答案 1 :(得分:1)
您可以通过使用错误处理而不是循环来实现您尝试执行的操作。看看下面的内容(你也可以在你做的时候缩小一些东西)
Dim reportsheet as worksheet, datasheet as worksheet
With ThisWorkbook
' You can test if the sheet exists by handling the error if it doesnt
On Error Resume Next
Set reportsheet = .Sheets("reportdata")
On Error GoTo 0
' Test if worksheet exists and add if not
If reportsheet Is Nothing Then
Set reportsheet = .Sheets.Add(after:=.Sheets(1))
reportsheet.Name = "reportdata"
End If
Set datasheet = .Worksheets(1)
End With
答案 2 :(得分:0)
应该是
.Sheets(k).Name = "reportdata"
右?
另外,您的信息ActiveWorkbook
和ThisWorkbook
不同。前者是激活的工作簿,而后者是编写VBA代码的工作簿