2016-08-16 40 views
0

我有一张电子表格,其中包含学生姓名,种族/种族,性别,学位,专业,身份,年级开始和毕业后的职业生涯等栏目。非常感谢那些帮助过我的代码的人,他们需要在栏目A中提供学生姓名的种族/族裔,性别和学位等信息。现在我需要做一些额外的工作。如果F列中的状态值是“毕业”,我希望毕业后的职业(H栏)填写。下面列出了我可以提出的最接近的代码,现在我有一个问题。如何在另一个单元格具有特定值时要求输入Excel中的列?

当列F中的状态值为“分级”时,Excel不仅要求用户在H列中填写毕业后职业生涯,而且还要求其他列。我应该如何修改代码,因此只需要列H?

谢谢!

Option Explicit 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Dim rngCell As Range, strBlanks As String 

Application.ScreenUpdating = False 

strBlanks = vbNullString 
For Each rngCell In Worksheets("Sheet1").Range("F2:F20").Cells 
If rngCell.Value = "Graduated" Then 
If WorksheetFunction.CountA(rngCell.Offset(0, 2).Resize(1, 1)) < 1 Then 
strBlanks = strBlanks & IIf(Len(strBlanks) > 0, ",", "") & _ 
Replace(rngCell.Offset(0, 2).Resize(1,1).SpecialCells(xlCellTypeBlanks).Address, "$", "") 
End If 
End If 
Next 

If Not strBlanks = vbNullString Then 
MsgBox "Entries required in cells " & vbCrLf & vbCrLf & strBlanks 
Cancel = True 
Exit Sub 
End If 
End Sub 

回答

0

你可以使用Autofilter避免通过细胞循环,并有一杆操作

Option Explicit 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    Dim toBeFilledAddress As String 

    With Worksheets("Sheet1") '<--| '<-- change "Sheet1" with your actual sheet name 
     With .Range("A1:H" & .Cells(.Rows.Count, 1).End(xlUp).Row) '<--| reference its range in columns A:B from row 1 to column "A" last non empty cell row 
      .AutoFilter field:=6, Criteria1:="Graduated" '<--| filter referenced range on its 6th column with "Graduated" 
      .AutoFilter field:=8, Criteria1:="" '<--|filter referenced range again on its 8th column with blanks 
      If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then toBeFilledAddress = .Offset(1, 7).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible).Address(False, False) '<--| store all matching cells address 
     End With 
     .AutoFilterMode = False '<--| show all rows back 
    End With 

    If toBeFilledAddress <> "" Then '<--| if any cell other than header ones has been filtered... 
     MsgBox "Entries required in cells " & vbCrLf & vbCrLf & toBeFilledAddress 
     Cancel = True 
     Exit Sub '<--| this line could be avoided unless you're planning to add more lines after "End If" 
    End If 
End Sub 
+0

这正是我所需要的!谢谢soooo多! – user6655908

+0

不客气。请接受我的答案作为解决方案。谢谢 – user3598756

+0

这是一个愚蠢的问题,但我如何接受你的答案作为解决方案?我对于stackoverflow很新。 :p – user6655908

0

为什么使用下面的代码?

& vbCrLf & vbCrLf

看来你的代码工作正常,但一些如何这两个变量越来越充满等栏目。

此外,哪些列除H之外还会返回?何时应该提示用户输入值?

+0

谢谢您的回答。我刚刚在网上找到一些代码并对其进行了修改我对VBA很陌生,不知道“&vbCrLf&vbCrLf”是什么。 @bdpolinsky – user6655908

相关问题