VBA Excel : 如果文本框发生变化,添加第二组命令

VBA Excel : Adding a second set of commands if Textbox is changed

我正忙于使用 VBA 和 Excel 构建轮班轮换时间表 现在我遇到了一个问题 在我的用户表单中,我有 434 个文本框,它们给出了每个座席的班次分配 如下所示:

现在为了改变这些颜色,我在每个文本框中都有一个代码(命名为 A1、A2.....A31,然后是 B1、B2、、、、、、B31 等) 代码如下:

Private Sub A1_Change()
 If A1.Text = "A" Then
A1.BackColor = &H602000
 ElseIf A1.Text = "B" Then
A1.BackColor = &HC07000
  ElseIf A1.Text = "C" Then
A1.BackColor = &HEED7BD
  ElseIf A1.Text = "D" Then
A1.BackColor = &HF0B000
  ElseIf A1.Text = "W" Then
A1.BackColor = &HFF&
  ElseIf A1.Text = "M" Then
A1.BackColor = &H808080
  ElseIf A1.Text = "S" Then
A1.BackColor = &HA6A6A6
  ElseIf A1.Text = "P" Then
A1.BackColor = &H7D7DFF
  ElseIf A1.Text = "L" Then
A1.BackColor = &HD9D9D9
  End If

End Sub

我现在正在尝试允许用户手动编辑轮班,一旦完成,他们将能够单击一个设置按钮,该按钮会将特定代理行中的数据复制到基于例如选择的月份:

Private Sub CommandButton2_Click()

If Sheets(3).Range("B5").Text = "2018-01-01" Then
Worksheets("LAYOUT").Activate
Sheets("LAYOUT").Range(B4).Text = A1.Value
Sheets("LAYOUT").Range(C4).Text = A2.Value
Sheets("LAYOUT").Range(D4).Text = A3.Value
Sheets("LAYOUT").Range(E4).Text = A4.Value
Sheets("LAYOUT").Range(F4).Text = A5.Value
.
.
.
.
Sheets("LAYOUT").Range(AD4).Text = A29.Value
Sheets("LAYOUT").Range(AE4).Text = A30.Value
Sheets("LAYOUT").Range(AF4).Text = A31.Value

ElseIf Sheets(3).Range("B5").Text = "2018-02-01" Then
Worksheets(1).Activate
Sheets("LAYOUT").Range(AG4).Text = A1.Value
.
.
.
.
.
Sheets("LAYOUT").Range(BJ4).Text = A30.Value
Sheets("LAYOUT").Range(BK4).Text = A31.Value

ElseIf Sheets(3).Range("B5").Text = "2018-03-01" Then
Worksheets(1).Activate
Sheets("LAYOUT").Range(BI4).Text = A1.Value
Sheets("LAYOUT").Range(BJ4).Text = A2.Value

ect 

现在,当我进行更改并单击命令按钮 2 时 它什么都不做...我哪里错了?

哇,那是……嗯……真的很棒。对于 Determination,您会得到一个 'A',但是对于 [=63],您会得到一个“C-” =]学习技巧。 (我的意思是尽可能以最友善的方式!):)

很多 种方法可以创建像这样的动态多色表单(用户没有可用的敏感代码),而您几乎选择了最困难和最复杂的方法.不幸的是,使简单的任务复杂化往往会使它们在未来更有可能因为一个小原因而中断,然后可能需要永远解决问题,如果你是婴儿不会完全崩溃,丢失所有数据。

我想我以前从未见过 太多变量 错误! (甚至 Excel 也希望您简化。)如果这不能作为答案,我深表歉意,但我认为您最好以正确的方式重新开始格式化。

omg, "5208 lines of code left") 如果您确切地知道您还剩下多少行代码,那么您 way 太重复了! Excel 或 VBA 或一般编码的全部要点是让 计算机 完成工作!

如果您担心学习新的 Excel 功能,请不要担心。你显然有一定的技能和组织能力,可以做到这一点!在 Excel...

中,您应该自学一些基本知识

有些东西要尽快学习(你会很高兴你做到了!)

祝你好运...这些颜色选择不错!

解决此问题的最佳方法是开始为您想要执行的每个 "action" 创建模块,例如确保文本框中的颜色创建一个模块并将其命名为 "Colour_Text"例如,看起来像这样

Public Sub Colour_Text1()
If PA1.Text = "S1" Then
PA1.BackColor = RGB(0, 32, 96)
PA1.ForeColor = RGB(255, 255, 255)
PA1.Font.Bold = True
ElseIf PA1.Text = "S2" Then
PA1.BackColor = RGB(0, 112, 192)
PA1.ForeColor = RGB(255, 255, 255)
PA1.Font.Bold = True
 ElseIf PA1.Text = "S3" Then
PA1.BackColor = RGB(189, 215, 238)
PA1.ForeColor = RGB(0, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "S4" Then
PA1.BackColor = RGB(0, 176, 240)
PA1.ForeColor = RGB(0, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "W" Then
PA1.BackColor = RGB(60, 60, 60)
PA1.ForeColor = RGB(255, 255, 255)
PA1.Font.Bold = True
 ElseIf PA1.Text = "P" Then
PA1.BackColor = RGB(166, 166, 166)
PA1.ForeColor = RGB(0, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "A" Then
PA1.BackColor = RGB(255, 0, 0)
PA1.ForeColor = RGB(0, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "S" Then
PA1.BackColor = RGB(169, 208, 142)
PA1.ForeColor = RGB(0, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "L" Then
PA1.BackColor = RGB(0, 176, 80)
PA1.ForeColor = RGB(0, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "F" Then
PA1.BackColor = RGB(112, 48, 160)
PA1.ForeColor = RGB(0, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "N" Then
PA1.BackColor = RGB(255, 125, 125)
PA1.ForeColor = RGB(0, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "UL" Then
PA1.BackColor = RGB(0, 176, 80)
PA1.ForeColor = RGB(169, 208, 142)
PA1.Font.Bold = True
 ElseIf PA1.Text = "US" Then
PA1.BackColor = RGB(169, 208, 142)
PA1.ForeColor = RGB(255, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "UN" Then
PA1.BackColor = RGB(255, 125, 125)
PA1.ForeColor = RGB(255, 0, 0)
PA1.Font.Bold = True
 ElseIf PA1.Text = "H" Then
PA1.BackColor = RGB(255, 192, 0)
PA1.ForeColor = RGB(255, 0, 0)
PA1.Font.Bold = True
End If
End Sub

然后对所有其他文本框执行相同操作,然后可以在更改文本框时调用该模块,如下所示:

Private Sub PA1_Change()
Call Module1.Colour_Text1
End Sub

这样您只需调用小的更改,从而释放您的内存:)