我一直在尋找將按鈕添加到列中,以便可以將特定的資料行添加到另一張表中。似乎您無法向單元格添加按鈕,因此我通過格式化使列單元格看起來像按鈕,然后添加了單擊功能來確定是否單擊了該行。這可行,但我開始認為如果用戶選擇他們想要的行首先單擊表格右側的單個按鈕以取出所有行并將它們添加到另一張表中會更好。
查看單選按鈕,似乎它們也不能嵌入到列中,而是鏈接到特定的單元格,這樣當它們被單擊時,它可以觸發資料到單元格。他們似乎也無法取消點擊。
有沒有什么東西可以放在一個單元格中,單擊時會將其設定為 1(“添加到作業表”)并再次單擊會將其設定為 0(“不添加”)?然后我可以將其讀入一個函式以確定哪些行應該添加到另一張表中。
uj5u.com熱心網友回復:
最簡單的方法是在用戶輸入 X(或空白)的位置添加一列。您可以為該列添加驗證規則,以便在需要時只允許 X。
不幸的是,單元格沒有 Click-Event,因此您可以對單擊做出反應以切換 X,最好的選擇是雙擊 ( Worksheet_BeforeDoubleClick
),因此用戶也可以雙擊細胞:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 1 Then ' Assuming your selection column is [A]
Target.Value = IIf(Target.Value = "", "X", "")
End If
End Sub
如果您認為這對用戶來說太復雜了,您可以在每個單元格中放置一個控制元件(如復選框)。但是,您要么必須一個一個地手動創建這些控制元件,要么通過代碼創建這些控制元件。您需要了解所有物件,如控制元件、形狀、影像、圖表(等等)都是獨立的物件,它們不鏈接到單元格。您無法訪問具有 Range("A1").shape 等屬性的形狀,這些形狀僅鏈接到作業表。
要在調整單元格大小時強制 Excel 移動形狀,您需要設定屬性“隨單元格移動”,以便在調整行或列大小時,形狀保持在單元格內。但同樣,控制元件沒有鏈接到單元格,Excel 只是移動它的位置(left 和 top 屬性)。
我不是表單控制元件的忠實粉絲,也不會開始討論表單控制元件與 ActiveX 控制元件的優缺點。如果我需要一個按鈕之類的東西,我通常會“誤用”一個簡單的形狀——每個形狀都有一個 OnClick 方法,當單擊該形狀時會呼叫該方法。
下面的一段代碼將一個矩形放置在一個單元格內,該單元格基本上用于捕捉滑鼠點擊。我將這些形狀命名為“XShape”,因為它們用于將 X 設定為單元格。完整的形狀名稱還包含行和列。該例程首先檢查具有該名稱的形狀是否已經存在 - 如果是,則不創建新形狀。
Sub AddShape(c As Range)
Const XShapeName_Prefix = "XShape_"
Const DeltaX = 2
Const DeltaY = 1
Dim ws As Worksheet, sh As Shape
Set ws = c.Worksheet
Dim shapeName As String
shapeName = XShapeName_Prefix & c.row & "_" & c.Column
' Check if shape is already there
On Error Resume Next
Set sh = ws.Shapes(shapeName)
On Error GoTo 0
If Not sh Is Nothing Then Exit Sub ' Shape already there
Set sh = ws.Shapes.AddShape(msoShapeRectangle, c.Left DeltaX, c.Top DeltaY, c.Width - 2 * DeltaX, c.Height - 2 * DeltaY)
sh.Fill.Visible = msoFalse
sh.Line.Visible = msoTrue
sh.Line.Weight = 0.75
sh.Line.ForeColor.RGB = vbBlack
sh.Name = shapeName
sh.OnAction = "XShape_Clicked"
End Sub
(提示:如果將 ForeColor 設定為vbWhite
,則形狀不可見但仍能捕捉到滑鼠點擊)
如您所見,OnAction
-method 設定為 subroutine XShape_Clicked
。您可以對任意數量的形狀使用相同的例程,該例程通過使用來確定單擊了哪個形狀Application.Caller
。它將“X”(或空白)寫入底層單元格。只需格式化單元格,使 X 顯示在形狀內。
Sub XShape_Clicked()
Dim sh As Shape
On Error Resume Next
Set sh = ActiveSheet.Shapes(Application.Caller)
On Error GoTo 0
If sh Is Nothing Then Exit Sub
Dim cell As Range
Set cell = sh.TopLeftCell
If cell Is Nothing Then Exit Sub
cell.Value = IIf(UCase(cell.Value) = "X", "", "X")
End Sub
現在您只需要一個小例程,在資料的每一行中放置一個形狀:
Sub AddShapesToColumn()
Dim row As Long, lastRow As Long
With ActiveSheet ' Replace this with the sheet you want to use
lastRow = .Cells(.Rows.Count, "B").End(xlUp).row
For row = 2 To lastRow
AddShape .Cells(row, "A")
Next row
End With
End Sub
您可以在需要時呼叫此例程 - 例如,如果創建了新行,它將僅為新行創建新形狀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508286.html
上一篇:串列框中的VBA不區分大小寫排序