2017-10-04 1 views
0

列(C)のセルが満たされている場合、必須(E I J L M)を埋める5つの列を作成する問題があります。いくつかの列を強制的に1つの他の列に基づいて

私はこのコードを書かれているが、私は本当に困ったものに、列Cをリンクを持つ:(

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ 
Cancel As Boolean) 


Dim rngCell As Range 
Dim lngLstRow As Long, lngTCols As Long 
Dim lngRowCheck(1 To 5) As String 


lngRowCheck(1) = "E" 
lngRowCheck(2) = "I" 
lngRowCheck(3) = "J" 
lngRowCheck(4) = "L" 
lngRowCheck(5) = "M" 

lngLstRow = ActiveSheet.UsedRange.Rows.Count 

For i = 1 To UBound(lngRowCheck) 
    For Each rngCell In Range(lngRowCheck(i) & "2:" & lngRowCheck(i) & lngLstRow) 
     If rngCell.Value = "" Then 
      MsgBox ("Please enter an input in cell " & rngCell.Address) 
      rngCell.Select 
     End If 
    Next 
Next i 

End Sub 
+0

あなたはより具体的だろうか?期待される出力を置くことができれば。 – sirandy

答えて

1

あなたが列Cが列にループに行く前に空であるかどうかを確認する必要があります。

以下のコードはあなたの後に何をしているのですか?なぜワークブックが保存される前にチェックするのですか?それらの列がその特定のワークシートに対応している場合、ワークシートイベント(Workheet_Activate,Workheet_SelectionChange)行をlectedと選択が行を変更したときに、このチェックを必要とし、ワークシート上などのカラムC、のためのコードについては

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 

    Dim rngCell As Range 
    Dim lngLstRow As Long, lngRow As Long 
    Dim arrColsToCheck As Variant, oItem As Variant 

    arrColsToCheck = Array("E", "I", "J", "L", "M") 

    With ActiveSheet ' Only 1 sheet in workbook? 
     lngLstRow = .UsedRange.SpecialCells(xlLastCell).Row 
     For lngRow = 1 To lngLstRow 
      ' Check if column C is filled (not empty) 
      If Not IsEmpty(.Cells(lngRow, "C")) Then 
       ' Check the mandatory columns 
       For Each oItem In arrColsToCheck 
        Set rngCell = .Cells(lngRow, oItem) 
        If IsEmpty(rngCell) Then 
         rngCell.Select 
         MsgBox ("Please enter an input in cell " & rngCell.Address(0, 0)) 
        End If 
        Set rngCell = Nothing 
       Next 
      End If 
     Next lngRow 
    End With 

End Sub 

を確認してください。

Option Explicit 

Private ActiveRow As Long 

Private Sub Worksheet_Activate() 
    ActiveRow = ActiveCell.row 
End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Target.row <> ActiveRow Then 
     ' Call the Column C check for Madatory fields, passing the ActiveRow to it 
     ' You implement this Sub with a "Long" as argument 
    End If 
End Sub 
+0

ありがとう! 私は寝返りしたシートで働いています。 私は実際にワークブックに6枚あります。 –

+0

@SPSydPierrこれらの6つのワークシートのすべてが同じチェックを必要とする場合は、通常のモジュールで汎用サブを作成し、2番目の部分を各ワークシートモジュールに貼り付け、Subを呼び出します(行の代わりにターゲット範囲を渡します)。一般的なサブは、範囲からワークシートを取得できます。 – PatricK

関連する問題