2016-08-16 28 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

相關問題