Excel VBA-如果选中复选框,则将单元格值添加到总和
我不确定标题是否准确地描述了我的查询,因此我将在这里尽力描述它 我有一张记录费用和收入的工作表,我有一个宏,我用它将复选框插入选定的单元格,将复选框链接到这些单元格,最后,一旦选中复选框,以及再次取消选中复选框,就为条件格式应用条件 下面是实现此目的的代码: Sub:Excel VBA-如果选中复选框,则将单元格值添加到总和,excel,vba,checkbox,Excel,Vba,Checkbox,我不确定标题是否准确地描述了我的查询,因此我将在这里尽力描述它 我有一张记录费用和收入的工作表,我有一个宏,我用它将复选框插入选定的单元格,将复选框链接到这些单元格,最后,一旦选中复选框,以及再次取消选中复选框,就为条件格式应用条件 下面是实现此目的的代码: Sub: Sub Insert_Checkbox_Link_Cell() Dim rngCel, myCells As Range Dim ChkBx As CheckBox Dim cBx As Long
Sub Insert_Checkbox_Link_Cell()
Dim rngCel, myCells As Range
Dim ChkBx As CheckBox
Dim cBx As Long
Set myCells = Selection
myCells.NumberFormat = ";;;"
Application.ScreenUpdating = False
For Each rngCel In myCells
With rngCel.MergeArea.Cells
If .Resize(1, 1).Address = rngCel.Address Then
Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
With ChkBx
.Value = xlOff
.LinkedCell = rngCel.MergeArea.Cells.Address
.Text = ""
.Width = 18
.Top = rngCel.Top + rngCel.Height / 2 - ChkBx.Height / 2
.Left = rngCel.Left + rngCel.Width / 2 - ChkBx.Width / 2
.Select
'Function Call
Selection.OnAction = "Change_Cell_Colour"
End With
End If
End With
Next rngCel
If (Range(ChkBx.LinkedCell) = "True") Then
myCells.Interior.ColorIndex = 43
Else
myCells.Interior.ColorIndex = 48
End If
Application.ScreenUpdating = True
End Sub
Function Change_Cell_Colour()
Dim xChk As CheckBox
Dim clickedCheckbox As String
clickedCheckbox = Application.Caller
Set xChk = ActiveSheet.CheckBoxes(clickedCheckbox)
If xChk.Value = 1 Then
ActiveSheet.Range(xChk.LinkedCell).Interior.ColorIndex = 43
Else
ActiveSheet.Range(xChk.LinkedCell).Interior.ColorIndex = 48
End If
End Function
功能:
Sub Insert_Checkbox_Link_Cell()
Dim rngCel, myCells As Range
Dim ChkBx As CheckBox
Dim cBx As Long
Set myCells = Selection
myCells.NumberFormat = ";;;"
Application.ScreenUpdating = False
For Each rngCel In myCells
With rngCel.MergeArea.Cells
If .Resize(1, 1).Address = rngCel.Address Then
Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
With ChkBx
.Value = xlOff
.LinkedCell = rngCel.MergeArea.Cells.Address
.Text = ""
.Width = 18
.Top = rngCel.Top + rngCel.Height / 2 - ChkBx.Height / 2
.Left = rngCel.Left + rngCel.Width / 2 - ChkBx.Width / 2
.Select
'Function Call
Selection.OnAction = "Change_Cell_Colour"
End With
End If
End With
Next rngCel
If (Range(ChkBx.LinkedCell) = "True") Then
myCells.Interior.ColorIndex = 43
Else
myCells.Interior.ColorIndex = 48
End If
Application.ScreenUpdating = True
End Sub
Function Change_Cell_Colour()
Dim xChk As CheckBox
Dim clickedCheckbox As String
clickedCheckbox = Application.Caller
Set xChk = ActiveSheet.CheckBoxes(clickedCheckbox)
If xChk.Value = 1 Then
ActiveSheet.Range(xChk.LinkedCell).Interior.ColorIndex = 43
Else
ActiveSheet.Range(xChk.LinkedCell).Interior.ColorIndex = 48
End If
End Function
因此,这是如何工作的,我选择我想有复选框的单元格范围,然后我运行宏,它插入复选框,如上所述
现在我想补充一点,我不确定这是否可能 在下图中,我列出了收入,底部是总收入。因此,当钱进来时,复选框被选中 我想做的是:
Sub Insert_Checkbox_Link_Cell()
Dim rngCel, myCells As Range
Dim ChkBx As CheckBox
Dim cBx As Long
Set myCells = Selection
myCells.NumberFormat = ";;;"
Application.ScreenUpdating = False
For Each rngCel In myCells
With rngCel.MergeArea.Cells
If .Resize(1, 1).Address = rngCel.Address Then
Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
With ChkBx
.Value = xlOff
.LinkedCell = rngCel.MergeArea.Cells.Address
.Text = ""
.Width = 18
.Top = rngCel.Top + rngCel.Height / 2 - ChkBx.Height / 2
.Left = rngCel.Left + rngCel.Width / 2 - ChkBx.Width / 2
.Select
'Function Call
Selection.OnAction = "Change_Cell_Colour"
End With
End If
End With
Next rngCel
If (Range(ChkBx.LinkedCell) = "True") Then
myCells.Interior.ColorIndex = 43
Else
myCells.Interior.ColorIndex = 48
End If
Application.ScreenUpdating = True
End Sub
Function Change_Cell_Colour()
Dim xChk As CheckBox
Dim clickedCheckbox As String
clickedCheckbox = Application.Caller
Set xChk = ActiveSheet.CheckBoxes(clickedCheckbox)
If xChk.Value = 1 Then
ActiveSheet.Range(xChk.LinkedCell).Interior.ColorIndex = 43
Else
ActiveSheet.Range(xChk.LinkedCell).Interior.ColorIndex = 48
End If
End Function
当复选框未选中时,我不希望单元格中的值添加到底部的总计数中
选中时,单元格中的值应添加到底部的总计数中
图1:无复选框
图2:添加复选框
图3:选中一个复选框
图4:选中2个复选框
您可以使用条件格式和
SUMIF
公式来实现这一点
我使用了以下条件格式规则(您需要为您的范围更改此规则)
条件格式应用于单元格填充和字体文本颜色(使为True
/为False
不可见)
在单元格C6(合并范围)中,我有一个公式
=SUMIF($D$3:$D$5,TRUE,$C$3:$C$5)
其中D
范围内的单元格包含复选框的链接单元格的值(即True
,False
),而C
范围内的单元格是要求和的值
这是一种比任何VBA解决方案都简单得多的方法,就我个人而言,我会从上面的VBA中删除单元格的格式,只使用条件格式
如果您正在寻找一种VBA
方法来启动此操作(除了SUMIF
公式),我已经更新了下面的代码以添加条件格式
Sub Insert_Checkbox_Link_Cell()
Dim rngCel, myCells As Range
Dim ChkBx As CheckBox
Dim cBx As Long
Set myCells = Selection
myCells.NumberFormat = ";;;"
Application.ScreenUpdating = False
For Each rngCel In myCells
With rngCel.MergeArea.Cells
If .Resize(1, 1).Address = rngCel.Address Then
Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
With ChkBx
.Value = xlOff
.LinkedCell = rngCel.MergeArea.Cells.Address
.Text = ""
.Width = 18
.Top = rngCel.Top + rngCel.Height / 2 - ChkBx.Height / 2
.Left = rngCel.Left + rngCel.Width / 2 - ChkBx.Width / 2
End With
End If
End With
Next rngCel
With myCells
' Set default value
.Value2 = False
' Add conditional formatting for False value
With .FormatConditions
.Add Type:=xlExpression, Formula1:="=" & myCells.Cells(1).Address(False, True) & "=False"
End With
With .FormatConditions(.FormatConditions.Count)
.SetFirstPriority
With .Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 9868950
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Font
.Color = -6908266
.TintAndShade = 0
End With
End With
' Add conditional formatting for True value
With .FormatConditions
.Add Type:=xlExpression, Formula1:="=" & myCells.Cells(1).Address(False, True) & "=True"
End With
With .FormatConditions(.FormatConditions.Count)
.SetFirstPriority
With .Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 52377
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Font
.Color = -16724839
.TintAndShade = 0
End With
End With
End With
Application.ScreenUpdating = True
End Sub
您可以使用条件格式和
SUMIF
公式来实现这一点
我使用了以下条件格式规则(您需要为您的范围更改此规则)
条件格式应用于单元格填充和字体文本颜色(使为True
/为False
不可见)
在单元格C6(合并范围)中,我有一个公式
=SUMIF($D$3:$D$5,TRUE,$C$3:$C$5)
其中D
范围内的单元格包含复选框的链接单元格的值(即True
,False
),而C
范围内的单元格是要求和的值
这是一种比任何VBA解决方案都简单得多的方法,就我个人而言,我会从上面的VBA中删除单元格的格式,只使用条件格式
如果您正在寻找一种VBA
方法来启动此操作(除了SUMIF
公式),我已经更新了下面的代码以添加条件格式
Sub Insert_Checkbox_Link_Cell()
Dim rngCel, myCells As Range
Dim ChkBx As CheckBox
Dim cBx As Long
Set myCells = Selection
myCells.NumberFormat = ";;;"
Application.ScreenUpdating = False
For Each rngCel In myCells
With rngCel.MergeArea.Cells
If .Resize(1, 1).Address = rngCel.Address Then
Set ChkBx = ActiveSheet.CheckBoxes.Add(.Left, .Top, .Width, .Height)
With ChkBx
.Value = xlOff
.LinkedCell = rngCel.MergeArea.Cells.Address
.Text = ""
.Width = 18
.Top = rngCel.Top + rngCel.Height / 2 - ChkBx.Height / 2
.Left = rngCel.Left + rngCel.Width / 2 - ChkBx.Width / 2
End With
End If
End With
Next rngCel
With myCells
' Set default value
.Value2 = False
' Add conditional formatting for False value
With .FormatConditions
.Add Type:=xlExpression, Formula1:="=" & myCells.Cells(1).Address(False, True) & "=False"
End With
With .FormatConditions(.FormatConditions.Count)
.SetFirstPriority
With .Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 9868950
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Font
.Color = -6908266
.TintAndShade = 0
End With
End With
' Add conditional formatting for True value
With .FormatConditions
.Add Type:=xlExpression, Formula1:="=" & myCells.Cells(1).Address(False, True) & "=True"
End With
With .FormatConditions(.FormatConditions.Count)
.SetFirstPriority
With .Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 52377
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Font
.Color = -16724839
.TintAndShade = 0
End With
End With
End With
Application.ScreenUpdating = True
End Sub
您可以为在颜色更改函数中添加复选框的单元格指定一个值(例如:1表示选中,0表示未选中)。保持单元格的字体颜色与单元格的填充颜色相同,以便肉眼看不到该值。然后在total sum部分中,可以使用sumif函数
您可以为在颜色更改函数中添加复选框的单元格指定一个值(例如:1表示选中,0表示未选中)。保持单元格的字体颜色与单元格的填充颜色相同,以便肉眼看不到该值。然后在total sum部分中,可以使用sumif函数
“现在我想再添加一点,我不确定是否可能”是的,是的。有许多方法来完成这项任务;您的首选路径是什么?您在上述方向上做了哪些工作?如果您需要提示(这可能不是正确的论坛),我建议使用VBA循环并求和X(其中X是您的值),如果复选框为.value=true,则y=X+y,其中y是您循环时X的和。@Cyril感谢您的评论。我问1)这是否可能,因为我不确定我已经创建的宏是否仍然可以将此函数/功能添加到单元格中2)来自经验更丰富的用户的一点指导(如您所说,可能不是正确的形式),3)希望有人能给我一个代码片段开始。在阅读了Tom最初的评论之后,我意识到我没有清晰地思考,因为我已经在牢房里有了一个条件检查,我可以修改它,很高兴你找到了答案;当我输入我的建议时,我不得不选择SUMIFS或Loop,然后选择Loop(如果有自由浮动控件,Loop将能够关联,而SUMIFS非常简单)。“干杯,祝你有一个美好的一天。”现在我想补充一点,我不确定这是否可能“是的,是的。有许多方法来完成这项任务;您的首选路径是什么?您在上述方向上做了哪些工作?如果您需要提示(这可能不是正确的论坛),我建议使用VBA循环并求和X(其中X是您的值),如果复选框为.value=true,则y=X+y,其中y是您循环时X的和。@Cyril感谢您的评论。我问1)这是否可能,因为我不确定我已经创建的宏是否仍然可以在单元格中添加此函数/功能2)从更多用户那里获得一些指导