簡體   English   中英

Excel VBA 宏幫助 - 必填單元格

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM