我正在制作一张包含客户及其车辆记录的工作表。在车辆细节方面,我有一列F表示它的汽油车,G列表示它是柴油车。现在我已经对这两列进行了数据验证以显示Y和N.因此客户可以选择Y或N.如果客户在F列(汽油车)中选择Y,则我想写一个VBA代码然后列G(柴油车)应自动为该客户取值N.如果客户为G列输入Y,则F列应自动变为N.
同样,H列代表Petrocard,I列代表Smartfleet。像上面一样只有他们中的任何一个将取值Y而其他将取值N.这里我也做了数据验证,给出了Y和N的下拉列表
同样,列J表示两轮车,列K表示任何其他车辆。像上面一样,只有它们中的任何一个将取值Y而其他将取值N.这里我也做了数据验证,给出了Y和N的下拉列表。
除此之外,我已经在另一列C(手机号码)中使用了VBA代码,不允许在Excel工作表中重复输入。
从M列到R和从T列到Y重复整个过程。
答案 0 :(得分:0)
Luuklag的解决方案易于实施,并且可以很好地工作,前提是用户永远不会将“Y”放在错误的列中。
考虑:用户在单元格F20中输入“Y”,单元格G20中的公式将显示“N”。然后用户意识到他们犯了错误并在单元格G20中输入“Y”。单元格F20中的公式已被覆盖,因此将继续显示“Y”。
您需要Sheet_Change
或Change event
例程。
创建一个新工作簿并打开Visual Basic编辑器。在左下方你会看到类似的东西:
- VBAProject (Test.xlsm)
- Microsoft Excel Objects
Sheet1 (Sheet1)
Sheet2 (Sheet2)
Sheet3 (Sheet3)
ThisWorkbook
如果其中一个连字符是加号,请单击它以展开列表。
双击Sheet2 (Sheet2)
以显示工作表“Sheet2”的代码区域。将以下内容复制到该代码区域:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Debug.Print Target.Address & "=" & Target.Value
End Sub
切换到Excel并在每个工作表中输入一些值。切换回Visual Basic,立即窗口将包含如下内容:
$E$4=a
$E$7=b
$H$7=g
$H$4=h
您输入“Sheet1”或“Sheet3”的所有值都不会被录制。对于您在“Sheet2”中输入的每个值。您将看到一行显示已更改的单元格的地址及其新值。
Workbook_SheetChange
代码区域中存在类似的ThisWorkbook
,它会记录所有工作表的更改,但我认为稍微简单的Worksheet_Change
例程就足以满足您的需求。
使用Worksheet_Change
例程,您可以指定如果F列中的单元格变为“Y”,则G列中的匹配单元格变为“N”。反之亦然。
有两个并发症:
Worksheet_Change
,Target
是一个范围,如果用户复制了一个块,则可以包含多个单元格。我使用For Each CellCrnt In Target
将范围拆分为单个单元格。 尝试使用我的代码并根据需要返回问题。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim CellCrnt As Range
Dim ColCrnt As Long
Dim ColsA As Variant
Dim ColsB As Variant
Dim Found As Boolean
Dim InxCols As Long
Dim RowCrnt As Long
ColsA = Array(6, 8, 10, 13, 15, 17, 20, 22, 24, 7, 9, 11, 14, 16, 18, 21, 23, 25)
ColsB = Array(7, 9, 11, 14, 16, 18, 21, 23, 25, 6, 8, 10, 13, 15, 17, 20, 22, 24)
For Each CellCrnt In Target
ColCrnt = CellCrnt.Column
Found = False
' Look along ColsA for the column of the cell just changed
For InxCols = LBound(ColsA) To UBound(ColsA)
If ColsA(InxCols) = ColCrnt Then
Found = True
Exit For
End If
Next
If Found Then
' The cell is within a controlled column
If UCase(CellCrnt.Value) = "Y" Or UCase(CellCrnt.Value) = "N" Then
RowCrnt = CellCrnt.Row
' Good value
CellCrnt.Font.Color = RGB(0, 0, 0) ' Set Black in case of earlier error
With Cells(RowCrnt, ColsB(InxCols))
.Font.Color = RGB(0, 0, 0) ' Set Black in case of earlier error
If UCase(CellCrnt.Value) = "Y" Then
.Value = "N"
Else
.Value = "Y"
End If
End With
Else
' Bad value
CellCrnt.Font.Color = RGB(255, 0, 0) ' Set Red to indicate error
End If
End If
Next
End Sub