2014-10-02 63 views
1

我創建了一個VB程序來自動更新組項目的甘特圖。但現在球隊想要添加一個新球隊。問題是添加一個新列會改變我的代碼並使其無法使用。可以在不更改代碼的情況下添加行,但是如果添加新列,我將不得不更新所有代碼。我怎樣才能添加一個列而無需編寫我的VB代碼?在不改變VB代碼的情況下在Excel中添加新列

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 
+0

你不能。您修改代碼。 – 2014-10-02 10:17:16

+0

它實際上可能只是在插入一些額外的列後調整'Date_Week_Column = 8'來匹配右列。另外'如果單元格(StartDate_Row,7)'第7列'當前是硬編碼的 - 也可能需要調整。 – 2014-10-02 10:32:41

+0

你可以給你的數據庫在Excel中的截圖。比重新創建場景更容易 – ZAT 2014-10-02 10:36:15

回答

0

答案總之就是你必須改變你的代碼。隨着代碼變得越來越複雜,這成爲越來越大的問題。因此,儘可能動態思考用於指定單元位置的方法。

E.g.您可以在腳本中構建用戶輸入,以便用戶指定包含所需信息的列。這樣,如果用戶向表中添加更多列,該腳本仍將正確運行(只要用戶選擇了正確的列)。

'ask user to select the column containing the data which they would like to utilise 

Dim colRng As Range 

On Error Resume Next 
    Set colRng = Application.InputBox("Select a cell from anywhere in the column which contains the programme start dates.", Default:="", Type:=8) 
On Error GoTo 0 

If colRng Is Nothing Then 
    'notify user that the process cannot continue as selection was invalid 
    MsgBox "You must select a cell to enable this process to continue!" 
    'exit the sub 
    Exit Sub 
End If 

'output the column number (as selected by the user) 
debug.print colRng.column 

希望有幫助!

1

湯姆的建議是一種可能性,但是對於用戶來說,每次運行宏都有很多麻煩。

可能的技術1

我從來指的行或列的數字,原因有二:當你發現

  • 列和行可以移動。
  • 閱讀代碼的人必須知道第5列或第6列的含義。

最好使用常量。佛例如:

​​

我不知道你的行和列,所以我已經使用ColXxxxRowYyyy姓名。你會用名字替換我的名字,告訴讀者行和列是什麼。

這樣的代碼需要花費一些時間來編寫,但(1)它是自我記錄和(2)如果列或行移動,您只需更改Const語句來解決問題。

注:我已經使用數據類型Long。數據類型Integer定義了一個16位變量,它需要在32位和64位計算機上進行特殊(慢速)處理。

可能的技術2

技術1需要用戶知道他們要添加一列或移動行的程序員。如果他們忘記在修改工作表的runnibg宏之前告訴程序員,該宏可能會損壞工作表而無法修復。

另一種技術是在行1中搜索知道的列標題並記錄存在的位置。也許你有一個專欄標題「開始日期」。 「開始日期」可以在宏的一次運行的第5列中,在下一次的第6列中可以是「開始日期」,並且您的代碼將正常工作。

如果這種技術很有趣,我會添加示例代碼。

0

如果定義您的工作表(使用Formulas > Define Name)命名範圍,該名稱將被更新爲指向,即使行和列的插入或刪除同一單元格。

在您的代碼中,您可以使用(例如)MySheet.[MyRangeName].Row來獲取名爲MyRangeName的範圍的第一行的行號,依此類推。

相關問題