我有一个数据库和一个表单来输入数据。表单将数据添加到表中的下一个空行。我的表单中有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
答案 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来用适当的参数来处理它
解耦不同的任务可以实现更加可持续和快速的代码调试和维护