根据表单中的“选项按钮”更改工作表中的单元格格式

时间:2016-08-31 10:08:24

标签: excel forms vba colors format

我有一个数据库和一个表单来输入数据。表单将数据添加到表中的下一个空行。我的表单中有4个选项按钮,表示下一个条目的交易类型。我想根据选择的选项按钮格式化B列中单元格的背景,因此当我单击确认时,表单中的数据将插入数据库中,并且B列中单元格的背景颜色设置正确。我无法从此设备上传我的代码,但实际上背景颜色已设置但始终相同,如果我选择其他选项按钮则不会更改。

知道可能是什么问题吗?在应用选项按钮之前,是否需要包含一行来清除之前的格式化?

Private Sub CommandButton1_Click()
Dim L As Integer
Dim Code As String

If MsgBox("Confirm?", vbYesNo, "Confirming new invoice") = vbYes Then
    L = Sheets("FACTURE").Range("D65535").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement _ la premi_re ligne de tableau non vide
    Range("C" & L).Value = (Now)
    Range("D" & L).Value = TextBox2
    Range("E" & L).Value = TextBox3
    Range("F" & L).Value = TextBox4
    Range("G" & L).Value = TextBox5
    Range("K" & L).Value = ComboBox1
    Range("L" & L).Value = ComboBox2
    Range("M" & L).Value = ComboBox3
    Range("N" & L).Value = TextBox9
    Range("O" & L).Value = TextBox10
    Range("R" & L).Value = TextBox39
    Range("P" & L).Value = TextBox40
End If

If OptionButton1.Enabled = True Then
Range("B" & L).Select
 With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .ThemeColor = xlThemeColorAccent3
    .TintAndShade = 0.399975585192419
    .PatternTintAndShade = 0
 End With

 ElseIf OptionButton2.Enabled = True Then
 Range("B" & L).Select
  With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .ThemeColor = xlThemeColorAccent1
    .TintAndShade = 0.399975585192419
    .PatternTintAndShade = 0
 End With

End If

End Sub

1 个答案:

答案 0 :(得分:0)

你必须简单地使用:

If OptionButton1 Then

...

ElseIf OptionButton2 Then

...

End If

因为userform控件的Enabled属性“指定控件是否可以接收焦点并响应用户生成的事件。”

换句话说,灰色黑化用户窗体中的控件,使其相应地不可用或可供用户输入

当您使用“确定或指定是否选择了指定选项按钮的`Value'属性时

由于OptionButton的{​​{1}}属性是默认属性,因此您可以完全省略它

此外,您可能需要考虑以下对代码的重构:

Value

其中:

  • 代码仅在用户确认后执行

  • 我使用了更传统的(和“最先进的”)模式来获取给定工作表列的第一个非空行

    ,与Option Explicit Private Sub CommandButton1_Click() Dim L As Long Dim Code As String Dim TextBox2 As Long If MsgBox("Confirm?", vbYesNo, "Confirming new invoice") = vbYes Then With Worksheets("FACTURE") L = .Range(.Rows.Count, "D").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement _ la premi_re ligne de tableau non vide End With With Me Range("C" & L).Value = (Now) Range("D" & L).Value = .TextBox2 Range("E" & L).Value = .TextBox3 Range("F" & L).Value = .TextBox4 Range("G" & L).Value = .TextBox5 Range("K" & L).Value = .ComboBox1 Range("L" & L).Value = .ComboBox2 Range("M" & L).Value = .ComboBox3 Range("N" & L).Value = .TextBox9 Range("O" & L).Value = .TextBox10 Range("R" & L).Value = .TextBox39 Range("P" & L).Value = .TextBox40 If .OptionButton1.Enabled Then FormatCell Range("B" & L), xlThemeColorAccent3 ElseIf .OptionButton2 Then FormatCell Range("B" & L), xlThemeColorAccent1 End If End With End If End Sub Sub FormatCell(rng As Range, thColor As XlThemeColor) With rng.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .themeColor = thColor .TintAndShade = 0.399975585192419 .PatternTintAndShade = 0 End With End Sub 类型的L声明一起,使其独立于Excel版本,使其能够到达Excel 2003后工作表行的底部

  • 我使用Long块通过 dot With Me)表示法访问用户表单控件

    这不仅有助于您对userform属性和方法的编码(在键入点Intellisense为您提供列表之后),但它也避免了可能的阴影。

    以下代码应解释原因:

    .
  • 我将负责格式化单元格的代码分解为特定的代码 Option Explicit Private Sub CommandButton1_Click() Dim TextBox2 As Long TextBox2 = 2 Range("D3").Value = TextBox2 '<-- you're referring to 'TextBox2' Long variable value Range("D3").Value = Me.TextBox2 '<-- you're referring to the userform control named after "TextBox2" End Sub

    每当你看到一些代码重复时,就可以编写一个Sub或Function来用适当的参数来处理它

    解耦不同的任务可以实现更加可持续和快速的代码调试和维护