Excel ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row返回错误的行

Excel ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row返回错误的行,excel,vba,Excel,Vba,我正在使用一个小宏在受保护的工作表中添加和删除行。为此,每行都有一个“删除”按钮。添加新行时,复制最后一行(包括“删除”按钮),然后清除其内容 为了删除行,我移交了一些参数,包括“删除”按钮的行(以及项目的行)。为此,我使用: RowToDelete = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row 此代码适用于现有行,但适用于自上次打开工作簿以来添加的所有行(最后一行除外)。对于所有其他行,它将删除添加的下一行,而不是“真实”行

我正在使用一个小宏在受保护的工作表中添加和删除行。为此,每行都有一个“删除”按钮。添加新行时,复制最后一行(包括“删除”按钮),然后清除其内容

为了删除行,我移交了一些参数,包括“删除”按钮的行(以及项目的行)。为此,我使用:

RowToDelete = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row
此代码适用于现有行,但适用于自上次打开工作簿以来添加的所有行(最后一行除外)。对于所有其他行,它将删除添加的下一行,而不是“真实”行

我猜这是一个缓存问题,因为“Application.Caller”包含正确的字符串,但返回已复制形状中不再包含该名称的行

是否有办法清除相关缓存或强制Shapes()不使用缓存


非常感谢您的帮助。

我找到了一个我不太满意的解决方法,但现在必须解决这个问题。我使用随机shapeName来避免错误的返回值。似乎在查找工作开始之前,形状名称不存在

shp.Name = "Shape" & Format(i, "0000") & (Rnd * 999)

一定是缓存问题,因为保存并重新打开工作簿后按钮工作正常。

我也有同样的问题。这些按钮是由像您这样的其他按钮创建的。然而,它只是在创建按钮的代码中,我开始向它添加名称时才开始这样做。因此,另一种不太令人满意的处理方法是不使用“shp.name=”行。当我把它拿出来的时候,它就停止了。我的猜测是,在命名按钮的自然方式中,它自然避免了这种情况。就像您有一张工作表,删除它,然后添加另一张工作表一样,它仍然会记住旧工作表,并将新工作表命名为更高的数字。 一个删除缓存的代码就好了。我相信如果问题被问得不同,有人知道该怎么做。搜索结果将提供: Application.Restart()
但是我还没有尝试过。

创建形状时,请为它们指定所附着行的名称(name属性)。对于在现有行之间添加的任何行,只需运行一个循环到最后一行并更改它们的名称,将+1添加到形状的数字部分。这或多或少是我所做的,问题是,“ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row将返回错误形状的行。假设我们从A行和Shape1开始,添加2行B和C行,其中Shape2(Shape1的副本)和Shape3(Shape2的副本)如果单击Shape2,则上述代码将返回Shape3的行而不是Shape2。如果您的按钮是ActiveX控件,则不会在删除行的同时删除该行(添加
ActiveSheet.Shapes(Application.Caller)。在这种情况下,删除
)。使用表单控制按钮,按钮会在与行相同的时间自动删除。我的意思是,如果是缓存问题,您可能会有多个按钮堆叠在同一位置(也有旧按钮),在尝试之前进行简单的保存就可以了,或者使用火炮方法:保存、关闭、重新打开、尝试。