Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 是否查找最后添加的工作表(vba)?_Excel_Vba - Fatal编程技术网

Excel 是否查找最后添加的工作表(vba)?

Excel 是否查找最后添加的工作表(vba)?,excel,vba,Excel,Vba,如何获取在excel中创建的最后一张工作表? 我使用了GETABLE。最后,它工作了,但他找到了最后一张表,它是排队的,它是对的,但是如果我的最后一张表没有按照排队的顺序排列,例如它在中间,函数GETABLE。 是否存在一些功能,机器人可以找到或了解最后创建的工作表 谢谢 关于您可以尝试访问工作表的代码名。这是一个序列号的后缀 需要注意的是,如果a)删除工作表,b)关闭然后重新打开工作簿,c)添加新工作表,则可能会为新工作表分配旧的代码名,从而使此方法不可靠 虽然它不像更改工作表的名称那样常见,

如何获取在excel中创建的最后一张工作表? 我使用了GETABLE。最后,它工作了,但他找到了最后一张表,它是排队的,它是对的,但是如果我的最后一张表没有按照排队的顺序排列,例如它在中间,函数GETABLE。 是否存在一些功能,机器人可以找到或了解最后创建的工作表

谢谢
关于

您可以尝试访问工作表的代码名。这是一个序列号的后缀

需要注意的是,如果a)删除工作表,b)关闭然后重新打开工作簿,c)添加新工作表,则可能会为新工作表分配旧的代码名,从而使此方法不可靠

虽然它不像更改工作表的名称那样常见,但也可以手动更改工作表的代码名

function getLastAddedWorksheet()

    dim i as long, mx as long, ws as worksheet

    on error resume next

    for i = 1 to worksheets.count
        if mx < val(mid(worksheets(i).codename, 6)) then
             set ws = worksheets(i)
             mx = val(mid(ws.codename, 6))
        end if
    next i

    getLastAddedWorksheet = ws.name

    on error goto 0

end function
函数getLastAddedWorksheet() 尺寸i为长,mx为长,ws为工作表 出错时继续下一步 对于i=1到worksheets.count 如果mx以编程方式添加工作表时,
Worksheets.add
函数生成对刚刚添加的
工作表
对象的引用:这通常是VBA代码获取“上次创建的工作表”句柄的方式


如果我们谈论的是手动添加的工作表,那么需要更多地……参与其中

假设需要跟踪添加到所有工作簿中的所有工作表,则可以使用Excel加载项处理应用程序范围内的事件,如下所示:

Private WithEvents app As Excel.Application

Private Sub Workbook_Open()
    Set app = ThisWorkbook.Application
End Sub

Private Sub app_WorkbookNewSheet(ByVal Wb As Workbook, ByVal Sh As Object)
    If Not TypeOf Sh Is Excel.Worksheet Then Exit Sub

    Dim ws As Worksheet
    Set ws = Sh

    ws.CustomProperties.Add "DateCreated", Now

End Sub
排除
Application.EnableEvents=False
,我并不100%相信处理程序会在所有可能创建工作表的情况下运行,但我想这总比什么都没有好

然后,您可以使用一个函数,在给定
工作表
实例的情况下,获取
DateCreated
自定义属性:

Public Function GetDateCreated(ByVal ws As worksheet) As Date
    Dim p As CustomProperty
    For Each p In ws.CustomProperties
        If p.Name = "DateCreated" Then
            GetDateCreated = p.Value
            Exit Function
        End If
    Next
    GetDateCreated = 0 ' unknown
End Function

然后,剩下要做的就是编写一个过程,可以根据相关的
DateCreated
自定义属性值对工作表进行排序。

据我所知,工作表不携带此类元数据-您无法知道是先添加还是后添加的工作表,也无法按照创建顺序对其进行排序。我可能错了。你的代码是在创建表单吗?如果是这样,您可以使用
CustomProperties
存储一些
Timestamp
元数据。。。但是,对于不是由宏创建的工作表,这没有帮助。您可以使用
工作表(Worksheets.Count)
。这将为您提供编号最高的工作表的索引号,它应该是最后一个创建的。@DarrellH直到
工作表(Worksheets.Count)
被移动,是的。好的,既然没有其他人提到过,我会咬一口,问您为什么需要知道工作表的添加顺序。听起来好像您试图将工作表本身视为数据,这表明存在设计问题。对于工作表代码名称没有进行更系统的更改,我感到非常遗憾。还有一个ThisWorkbook.Workbook\u NewSheet事件子项。@user10970498是,但这只会在
本工作簿中增加新的工作表。我想这取决于“最新工作簿”要求对多台计算机上的一本工作簿还是一台计算机上的多本工作簿更重要。Excel外接程序并不总是最容易分发的,但是XLSM/XLSB本身带有它的SUB。。。TBH我同意,这很可能不是OP实际需要做的事情——但这是一个值得尝试和解决的有趣问题:)…OP没有指定是关于工作簿还是任何工作簿。。我选择了更广泛的选择
Public Function GetDateCreated(ByVal ws As worksheet) As Date
    Dim p As CustomProperty
    For Each p In ws.CustomProperties
        If p.Name = "DateCreated" Then
            GetDateCreated = p.Value
            Exit Function
        End If
    Next
    GetDateCreated = 0 ' unknown
End Function