防止子运行

在sheet1(我称之为“MainSheet”)中,我在我的VBA脚本中有一个子部分,用于检查单元在此工作表中更改时某些单元的值。 (当一个单元格被改变时将会发生的主要动作之一是修改它的颜色,单元格的值为绿色,空单元格为红色)

但是现在我还有一些其他的sub也会改变单元格(在主表单中),但是在这种情况下,我不需要(也不想)VBA来检查单元格,并在每个单元格后将颜色调整为它们的值更改。 (编辑大量单元格时很烦人)。

(我已经试图把这个子文件放在VBA的“ThisWorkbook”部分,而不是Sheet1(MainSheet)部分,但不幸的是这并没有什么不同)。

问题一:是否有可能防止这一点?

我也有一个相关的问题,在另一个值得一提的问题,我认为:在这一个新的工作表创build,命名和填充文本从.txt文件。 然后工作表将被保存为新的工作簿,工作表将被删除。 (纸张的名称等于它保存时将得到的名称,并且不断变化)当我将.txt行逐一复制到此表中时,我提到的第一个子(编辑单元格的颜色) 叫做。 在这个子部分发生的第一件事之一就是调用我的MainSheet。 当薄子完成后,行复制子将继续,但将开始粘贴我的主表中的行。 我试图在这个子文件中input行,select带有variables名称的工作表,但是一直跳到MainSheet。

问题二:如何防止跳转到MainSheet?

(这两个问题可能都有相同的解决scheme。)

修改单元格颜色的子:

Private Sub Worksheet_Change(ByVal Target As Range) Dim j As Integer 'Collor all cells green containing values, collor empty cells red. ''Starts automaticly after every cell change within this sheet 'Huidige Cell onthouden If Not Intersect(Target, Range("A9:A29")) Is Nothing Then On Error GoTo bm_Safe_Exit3 Application.EnableEvents = False If Intersect(Target, Range("A9:A29")).Cells.Count > 1 Then Application.Undo MsgBox "Please edit one cell at a time!" Else Dim newVal3 As Variant newVal3 = Target.Value Range("A9:A29").ClearContents Target.Value = newVal3 End If End If bm_Safe_Exit3: Application.EnableEvents = True Set myActiveCell = ActiveCell Set myActiveWorksheet = ActiveSheet Set myActiveWorkbook = ActiveWorkbook Sheets("MainSheet").Select Range("C5").Select j = 0 Do While j < 6 If ActiveCell.Offset(0, j).Value = "" Then ActiveCell.Offset(-1, j).Interior.Color = RGB(255, 0, 0) Else: ActiveCell.Offset(-1, j).Interior.Color = RGB(0, 255, 0) End If j = j + 1 Loop 'Terug naar de voormalig active cell myActiveWorkbook.Activate myActiveWorksheet.Activate myActiveCell.Activate End Sub 

使用.Select.Activate在最好的时候是低效的; 在一个Worksheet_Change事件macros,它可以真正污染水域。

 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo bm_Safe_Exit Application.EnableEvents = False If Not Intersect(Target, Range("A9:A29")) Is Nothing Then If Intersect(Target, Range("A9:A29")).Cells.Count > 1 Then Application.Undo MsgBox "Please edit one cell at a time!" 'intentionally throw an error; no more code run; sent to bm_Safe_Exit Err.Raise 0 Else Dim newVal3 As Variant newVal3 = Intersect(Target, Range("A9:A29")).Cells(1).Value Range("A9:A29").ClearContents Intersect(Target, Range("A9:A29")).Cells(1) = newVal3 End If End If Dim j As Integer With Worksheets("MainSheet").Range("C5") For j = 0 To 6 If Not CBool(Len(.Offset(0, j).Value)) Then .Offset(-1, j).Interior.Color = RGB(255, 0, 0) Else .Offset(-1, j).Interior.Color = RGB(0, 255, 0) End If Next j End With bm_Safe_Exit: Application.EnableEvents = True End Sub 

目前还不清楚这是运行在哪个工作表。 我希望它不是MainSheet,因为我已经使用该工作表上的单元格直接引用。

请参阅如何避免使用Excel中的selectVBAmacros来获取更多的方法来摆脱依靠select和activate来实现您的目标。