問與答67: 如何每3列中同一行只允許一個單元格中能輸入數據?
- 2019 年 10 月 7 日
- 筆記
Q:工作表同一行中每三個單元格同時只能有一個單元格顯示數據。如下圖1所示,在單元格區域B6:D6中,如果在單元格B6中輸入了數據,那麼單元格C6和D6中的內容就會被清除;如果在單元格C6中輸入了數據,那麼單元格B6和D6中的內容會被清除;如果在單元格D6中輸入了數據,那麼單元格B6和C6中的內容就會被清除。同樣,對於單元格區域E6:G6也是如此,H6:J6也是如此……,依此類推。並且,下面的第7行至第20行也都是如此。該如何實現?

圖1
A:對照工作表分析一下列號的規律,列B、C、D、E、F、G、……對應的列號為2、3、4、5、6、7、……,每個數字除以3,依次以每3個為一組,它們的餘數均為2、0、1,這就好辦了!
如果當前輸入的單元格所在列的列號除以3,餘數為2,表明當前單元格在該組3個單元格的第1個單元格,那麼其相鄰的兩個單元格中的內容就要清空。如果當前單元格所在列的列號除以3,餘數為0,表明當前單元格處在3個單元格的中間,那麼其相鄰的左側和右側單元格中的內容要清空。如果當前單元格所在列的列號除以3,餘數為1,表明當前單元格處在3個單元格的最後一個單元格,那麼其前面的兩個單元格中內容要清空。
按照這個思路,在工作表所在的模組中輸入事件過程程式碼:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rng As Range
Set rng =Range("B6:S20")
With Target
If Not Intersect(Target, rng) Is Nothing Then
If (.Column Mod 3) = 2 Then
.Offset(0,1).ClearContents
.Offset(0,2).ClearContents
ElseIf (.ColumnMod 3) = 0 Then
.Offset(0, -1).ClearContents
.Offset(0,1).ClearContents
ElseIf (Target.Column Mod 3) = 1 Then
.Offset(0,-2).ClearContents
.Offset(0,-1).ClearContents
End If
End If
End With
End Sub
如果工作簿中的所有工作表都要實現上述功能,那麼可以將在工作簿模組中編寫事件程式碼:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim rng As Range
Set rng =Range("B6:S20")
With Target
If Not Intersect(Target, rng) Is Nothing Then
If (.Column Mod 3) = 2 Then
.Offset(0,1).ClearContents
.Offset(0,2).ClearContents
ElseIf (.ColumnMod 3) = 0 Then
.Offset(0,-1).ClearContents
.Offset(0,1).ClearContents
ElseIf (Target.Column Mod 3) = 1 Then
.Offset(0,-2).ClearContents
.Offset(0,-1).ClearContents
End If
End If
End With
End Sub
程式碼的圖片版如下:

