問與答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

程式碼的圖片版如下:

Tags: