将工作簿VBA模块转换为personal.xlsb会导致只读问题

时间:2018-06-01 10:54:54

标签: excel vba excel-vba

我让我的宏工作了几天。作为我的新手,我在工作簿级编码,现在我把它变成了个人宏。当我在其他工作簿中运行完全相同的代码作为个人宏时,我遇到了一些问题。第一个问题我设法修复了一些更好但不够好的重新格式化:

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"规模而不仅仅是工作簿级别?

提前感谢您提供给我的任何提示!

3 个答案:

答案 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"

右?

另外,您的信息ActiveWorkbookThisWorkbook不同。前者是激活的工作簿,而后者是编写VBA代码的工作簿