[英]Excel VBA Macro Help - Mandatory Cells
新用戶,被友好的團隊成員推薦到您有用的網站。
問題:試圖強制 Excel 中的用戶在填充 IL 列中的單元格之前填充列(O 列)中的單元格。 問題在於並非列中的每個單元格都需要填寫。我發現了一個 VBA 代碼,它有點幫助,但問題是如果在只有一個文本之前填充了 O 列,仍然會出現彈出窗口IL 列中的單元格的數量(因此除非填充了該行中的所有 4 個單元格,否則會發生錯誤)。 如前所述,目標是(例如)在填充 I、J、K 或 L264 列中的任何單元格之前先填充 O264。
進一步加劇這個問題的是,我需要將它應用於多行,相信這是范圍適合的地方。但是,在 excel 中使用范圍線並不能按照我嘗試的方式工作。
代碼如下:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("I:L")) Is Nothing Then
If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
If Target.Offset(, -1).Value = "" Then
MsgBox "You must first enter feedback in column ""O"""
Target.Value = ""
Target.Offset(, -1).Select
End If
End If
End Sub
在這種情況下,您可能需要更多地幫助用戶。 您可以通過隱藏從屬單元格、鎖定它們、將它們變灰等來實現這一點。我的感覺是,每當用戶以錯誤的順序輸入數據時顯示一個消息框有點過於被動。
在下面的示例中,目標單元格被鎖定並呈灰色,直到在“O”列中輸入內容。 如果您有多個目標行,您還需要創建一個目標行列表。
在相應工作表后面的代碼中,下面的骨架代碼應該可以幫助您入門。 我已經包含了幾個輔助函數,讓你的代碼更清晰一點:
Option Explicit
Private Const SHEET_PASSWORD As String = "xyz" 'whatever password you choose.
Private Const TARGET_ROWS As String = "2,4,6" 'your target rows, separated by commas.
Private Const TARGET_COLUMN As String = "O"
Private Const DEPENDENT_COLUMNS As String = "I:L"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, cell As Range
Set rng = Intersect(Target, Me.Columns(TARGET_COLUMN))
'Exit routine if we're not in the target column.
If rng Is Nothing Then Exit Sub
'Process the target column cells.
For Each cell In rng.Cells
If IsTargetRow(cell.Row) Then
SetDependentStates cell
End If
Next
End Sub
Private Sub SetDependentStates(cell As Range)
Dim DependentRange As Range
'Define the Dependent range based on passed cell row.
Set DependentRange = Intersect( _
cell.EntireRow, _
Me.Range(DEPENDENT_COLUMNS) _
)
'Lock/unlock and paint Dependent rows, based on
'contents of passed cell.
Application.EnableEvents = False 'prevent capture of change event.
Me.Unprotect SHEET_PASSWORD
With DependentRange.Cells
If Len(cell.Value) = 0 Then
.ClearContents
.Locked = True
With .Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.249977111117893
.PatternTintAndShade = 0
End With
Else
.Locked = False
With .Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End If
End With
Me.Protect SHEET_PASSWORD
Me.EnableSelection = xlUnlockedCells
Application.EnableEvents = True
End Sub
Private Function IsTargetRow(rowNum As Long) As Boolean
Dim v As Variant
'Tests if the pass row number is in the target row list.
For Each v In Split(TARGET_ROWS, ",")
If CLng(v) = rowNum Then
IsTargetRow = True
Exit Function
End If
Next
End Function
Public Sub InitialiseDependentStates()
Dim v As Variant
Dim cell As Range
'Define your unlocked cells.
'This is a simple example, adjust as you wish.
With Me
.Unprotect SHEET_PASSWORD
.Cells.Locked = False
.Protect SHEET_PASSWORD
.EnableSelection = xlUnlockedCells
End With
For Each v In Split(TARGET_ROWS, ",")
Set cell = Me.Range(TARGET_COLUMN & v)
SetDependentStates cell
Next
End Sub
您可能希望在打開工作簿時初始化依賴狀態。 在 Workbook 后面的代碼中執行此操作:
Private Sub Workbook_Open()
Sheet1.InitialiseDependentStates 'use whichever sheet you're using.
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.