Vba 在excel中添加新列而不更改VB代码

Vba 在excel中添加新列而不更改VB代码,vba,excel,Vba,Excel,我创建了一个VB程序来自动更新组项目的甘特图。但是现在团队想要添加一个新的柱。问题是,添加一个新列将更改我的代码并使其无法使用。可以在不更改代码的情况下添加行,但如果添加了新列,则必须更新所有代码。如何在不更改VB代码的情况下添加列 Private Sub Worksheet_Change(ByVal Target As Range) Dim StartDate_Row As Integer Dim Total_Weeks As Integer Dim Date_Week_Column As

我创建了一个VB程序来自动更新组项目的甘特图。但是现在团队想要添加一个新的柱。问题是,添加一个新列将更改我的代码并使其无法使用。可以在不更改代码的情况下添加行,但如果添加了新列,则必须更新所有代码。如何在不更改VB代码的情况下添加列

Private Sub Worksheet_Change(ByVal Target As Range)

Dim StartDate_Row As Integer
Dim Total_Weeks As Integer
Dim Date_Week_Column As Integer
Dim Number_of_Weeks As Integer
Dim Date_Week_Column_Color As Integer


StartDate_Row = 10
Date_Week_Column = 8

Range("H9:AN25").Interior.Color = xlNone

Do

For Total_Weeks = 1 To 33

   If Cells(StartDate_Row, 5).Value = Cells(8, Date_Week_Column).Value Then

    Date_Week_Column_Color = Date_Week_Column

        For Number_of_Weeks = 1 To Cells(StartDate_Row, 6).Value
            If Cells(StartDate_Row, 7).Value = 25 Then
                Cells(StartDate_Row, Date_Week_Column_Color).Interior.Color = RGB(204, 255, 299)
            End If
            If Cells(StartDate_Row, 7).Value = 50 Then
                Cells(StartDate_Row, Date_Week_Column_Color).Interior.Color = RGB(153, 255, 204)
            End If
            If Cells(StartDate_Row, 7).Value = 75 Then
                Cells(StartDate_Row, Date_Week_Column_Color).Interior.Color = RGB(102, 255, 178)
            End If
            If Cells(StartDate_Row, 7).Value = 100 Then
                Cells(StartDate_Row, Date_Week_Column_Color).Interior.Color = RGB(50, 200, 100)
            End If
            If Cells(StartDate_Row, 7).Value = 0 Then
                Cells(StartDate_Row, Date_Week_Column_Color).Interior.Color = RGB(149, 179, 215)
            End If


            Date_Week_Column_Color = Date_Week_Column_Color + 1
        Next Number_of_Weeks

    End If

    Date_Week_Column = Date_Week_Column + 1

Next Total_Weeks
Date_Week_Column = 8



StartDate_Row = StartDate_Row + 1
Loop While (Not IsEmpty(Cells(StartDate_Row, 5)))



End Sub

简而言之,答案是您必须更改代码。代码越大越复杂,这就成为一个越来越大的问题。因此,在可能的情况下,尝试动态地考虑用于指定单元格位置的方法

例如,您可以在脚本中构建一个用户输入,允许用户指定包含所需信息的列。这样,如果用户向表中添加更多列,脚本仍将正确运行(前提是用户选择了正确的列)


希望有帮助

Tom的建议是有可能的,但每次运行宏都会给用户带来很多麻烦

可能的技术1

我从不按数字引用列或行,原因有二:

  • 列和行可能会随着您的发现而移动
  • 阅读代码的人必须知道第5列或第6行的含义
最好使用常量。例如:

Const ColXxxx As Long = 5
Const RowYyyy As Long = 8

If Cells(StartDate_Row, ColXxxx).Value = Cells(RowYyyy, Date_Week_Column).Value Then
我不知道您的行和列是什么,所以我使用了
ColXxxx
RowYyyy
作为名称。您可以将我的名字替换为告诉读者行和列是什么的名字

这样的代码编写时间稍长,但(1)它是自文档化的,(2)如果列或行移动,您只需更改Const语句即可解决问题

注意:我使用了数据类型
Long
。数据类型
Integer
定义了一个16位变量,该变量需要在32位和64位计算机上进行特殊(慢速)处理

可能的技术2

技术1要求用户告诉程序员他们想要添加一列或移动一行。如果他们在使用修改过的工作表运行宏之前忘记告诉程序员,宏可能会损坏工作表而无法修复

另一种技术是在第1行中搜索已知的列标题,并记录它们所在的位置。也许你有一个标题为“开始日期”的栏。对于宏的一次运行,“开始日期”可以在第5列中,对于下一次运行,可以在第6列中,您的代码将正常工作


如果这项技术很有趣,我将添加示例代码。

如果您在工作表上定义了命名范围(使用
公式>定义名称)
,则即使插入或删除了行和列,该名称也将更新为指向同一单元格


在代码中,您可以使用(例如)
MySheet。[MyRangeName].Row
获取名为
MyRangeName
的范围的第一行的行号,依此类推

你不能。您可以修改代码。实际上,这可能归结为在插入一些额外的列后,只需调整
日期\周\列=8
,以匹配正确的列。另外
If Cells(StartDate_Row,7)
第7列当前是硬编码的-它可能也需要调整。您能给出excel中数据库的屏幕截图吗。比重现场景更容易
Const ColXxxx As Long = 5
Const RowYyyy As Long = 8

If Cells(StartDate_Row, ColXxxx).Value = Cells(RowYyyy, Date_Week_Column).Value Then