簡體   English   中英

Excel VBA TopLeftCell.Row屬性不一致的結果

[英]Excel VBA TopLeftCell.Row property inconsistent results

這是場景。 當在工作表中插入一行時,會發生一個worksheet_change事件,該事件調用一個子項,該子項在插入的行中插入五對按鈕。 單擊這些按鈕之一時,它將運行一個子程序,該子程序發出一個MsgBox,該消息顯示該按鈕的TopLeftCell.Row和Column。 可以插入多行,每行都有五組按鈕(總共十個)。 可以隨時選擇任何行中的任何按鈕。

我看到的是,在打開工作簿並按下其中一個按鈕后,MsgBox始終顯示正確的列,但是無論我單擊的按鈕是哪一行,它似乎都卡在了某一行上如果刪除該行,則該行將卡在另一行(只要它也包含按鈕),則“卡”在該行上,但並非所有按鈕都將卡在同一行。

如果我將兩個相鄰行的按鈕“粘在”同一行中復制到另一個位置,則這些按鈕仍將粘在一起,但在另一行除外。

似乎按鈕集合有問題。 如果我保存工作簿,問題就消失了。 如果我插入新行,並且Add_Buttons例程再次運行,該問題會再次出現,但涉及不同的行。 因此,我的按鈕例程可能會留下一些暫時的東西,當我保存時,這些東西會被清除。

這是構建按鈕的代碼。

Public activeWS As Worksheet
Public activeRG As Range

Public Sub Add_Buttons(ByVal myRow As Long)
'Add the five sets of Submit IM and Submit Webins buttons to a new row. The code
'uses named ranges to locate the cells where the buttons should be added so that
'new columns can be added to the spreadsheet without requiring changes to the code.
'The headings must be labeled 'IM#' and 'Webins#'.

Dim i As Long
Dim t As Range
Dim btn As Button


'In each range, place the button below the column label.
Application.ScreenUpdating = False
For i = 1 To 5

Set activeWS = Sheet1
Set activeRG = activeWS.Range("Scan" & i & "_Hdngs")

'The start of the range plus the position of the specified column in
'the range gives the absolute column location to add the button

'Create the Submit IM button
nCol = activeRG.Cells(1, 1).Column + findCol("IM#", activeRG) - 1
Set t = activeWS.Range(Cells(myRow, nCol), Cells(myRow, nCol))
Set btn = activeWS.Buttons.Add(t.Left, t.Top, t.Width, t.Height)
With btn
    .OnAction = "Create_Primary_IM"
    .Caption = "Submit IM"
    .Name = "BtnIM" & myRow & i
    .Font.Size = 10
End With

'Create the Submit Webins button
nCol = activeRG.Cells(1, 1).Column + findCol("Webins#", activeRG) - 1
Set t = activeWS.Range(Cells(myRow, nCol), Cells(myRow, nCol))
Set btn = activeWS.Buttons.Add(t.Left, t.Top, t.Width, t.Height)
With btn
    .OnAction = "Create_Primary_WAS"
    .Caption = "Submit Webins"
    .Name = "BtnWAS" & myRow & i
    .Font.Size = 10
End With
Next i
Application.ScreenUpdating = True

End Sub

這是按鈕執行的代碼:

Public Sub Create_Primary_IM()
    MsgBox ("Row, Col of pressed button: " & ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row _
        & ", " & ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column)
End Sub

Public Sub Create_Primary_WAS()
    MsgBox ("Row, Col of pressed button: " & ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row _
        & ", " & ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column)
End Sub

我認為是問題的原因,它對電子表格的影響以及解決方案。

原因是按鈕名稱重復。 在創建時,我一直根據按鈕的行和列來命名它們。 問題在於,行及其按鈕可以插入或刪除工作表中的任何位置。 不難發現(除了我有一陣子沒看到),可以插入一行並在同一絕對行中多次創建其按鈕。 這導致按鈕具有相同的.name屬性。

效果是,當我單擊重復的按鈕之一時,它找到了具有該名稱的原始按鈕的TopLeftCell.Row,而不是該按鈕實際位於的行。 當我保存文件(未關閉文件)並單擊相同的按鈕時,該文件已重命名為“ Button nnn”之類,並返回了正確的行。 如果我保存文件並重新打開它,則按鈕名稱重復的條件仍然存在。 因此,當我保存文件時,Excel會替換該集合中的重復名稱,但在關閉文件時不會提交這些更改。

最快的解決方案也是最簡單的。 我讓Excel進行命名。 我真的不需要按鈕來命名。 我需要的只是行號。 另一個解決方案是生成一個唯一的名稱,但是無論如何這將是Excel的意義所在?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM