กำหนดให้บังคับแถวหากเติมเซลล์แรก


1

ฉันมีไฟล์ Excel ที่ฉันต้องการให้คนกรอกข้อมูลบางอย่าง ฉันต้องการสร้างช่วงของเซลล์ในแถวบังคับถ้าเติมเซลล์แรกในแถวเช่นถ้าเติมเซลล์ A7 แล้วต้องใส่เซลล์ B7-O7 และทำซ้ำตัวเองจนกว่าจะมีเซลล์ ในคอลัมน์ A ที่ไม่ได้กรอกข้อมูล

ฉันลองใช้การเข้ารหัส VBA ไม่ดีที่นี่

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

    If Sheets("Sheet1").Range("A7").Value <> "" And Sheets("Sheet1").Range("B7").Value = "" Or Range("C7").Value = "" Or Range("D7").Value = "" Or Range("E7").Value = "" Or Range("F7").Value = "" Or Range("G7").Value = "" Or Range("H7").Value = "" Or Range("I7").Value = "" Or Range("J7").Value = "" Or Range("K7").Value = "" Or Range("L7").Value = "" Or Range("M7").Value = "" Or Range("N7").Value = "" Or Range("O7").Value = "" Then
        MsgBox "Alla celler i en rad måste vara ifyllda för att du skall kunna spara. Kontrollera detta och spara igen."
        Cancel = True

    ElseIf Sheets("Sheet1").Range("A8").Value <> "" And Sheets("Sheet1").Range("B8").Value = "" Or Range("C8").Value = "" Or Range("D8").Value = "" Or Range("E8").Value = "" Or Range("F8").Value = "" Or Range("G8").Value = "" Or Range("H8").Value = "" Or Range("I8").Value = "" Or Range("J8").Value = "" Or Range("K8").Value = "" Or Range("L8").Value = "" Or Range("M8").Value = "" Or Range("N8").Value = "" Or Range("O8").Value = "" Then
        MsgBox "Alla celler i en rad måste vara ifyllda för att du skall kunna spara. Kontrollera detta och spara igen."
        Cancel = True

    ElseIf Sheets("Sheet1").Range("A9").Value <> "" And Sheets("Sheet1").Range("B9").Value = "" Or Range("C9").Value = "" Or Range("D9").Value = "" Or Range("E9").Value = "" Or Range("F9").Value = "" Or Range("G9").Value = "" Or Range("H9").Value = "" Or Range("I9").Value = "" Or Range("J9").Value = "" Or Range("K9").Value = "" Or Range("L9").Value = "" Or Range("M9").Value = "" Or Range("N9").Value = "" Or Range("O9").Value = "" Then
        MsgBox "Alla celler i en rad måste vara ifyllda för att du skall kunna spara. Kontrollera detta och spara igen."
        Cancel = True

    End If

End Sub

มันทำงานได้จนกว่าฉันจะไปที่:

ElseIf Sheets("Sheet1").Range("A9").Value <> "" And Sheets("Sheet1").Range("B9").Value = "" Or Range("C9").Value = "" Or Range("D9").Value = "" Or Range("E9").Value = "" Or Range("F9").Value = "" Or Range("G9").Value = "" Or Range("H9").Value = "" Or Range("I9").Value = "" Or Range("J9").Value = "" Or Range("K9").Value = "" Or Range("L9").Value = "" Or Range("M9").Value = "" Or Range("N9").Value = "" Or Range("O9").Value = "" Then
    MsgBox "Alla celler i en rad måste vara ifyllda för att du skall kunna spara. Kontrollera detta och spara igen."
    Cancel = True
End If

จากนั้น MsgBox ก็จะปรากฏขึ้นแม้ว่าจะไม่ได้กรอกข้อมูล A9

ฉันรู้ว่านี่ไม่ใช่วิธีที่ดีที่สุดในการบรรลุสิ่งที่ฉันต้องการ แต่เป็นสิ่งที่ฉันคิดขึ้นมา ข้อเสนอแนะสำหรับรหัสที่ดีกว่า?


เพียงข้อเสนอแนะ: แทนที่จะใช้Sheets("Sheet1").Range("B9").Value = "" Or Range("C9").Value = "" Or Range("D9").Value = "" Or Range("E9").Value = "" Or Range("F9").Value = "" Or Range("G9").Value = "" Or Range("H9").Value = "" Or Range("I9").Value = "" Or Range("J9").Value = "" Or Range("K9").Value = "" Or Range("L9").Value = "" Or Range("M9").Value = "" Or Range("N9").Value = "" Or Range("O9").Value = ""คุณสามารถWorksheetfunction.countif(Sheets("Sheet1").Range("B9:O9"),"=")=0
MátéJuhász

อีกสิ่งหนึ่ง: คุณใช้Sheets("Sheet1")เพื่อการอ้างอิงครั้งแรกเท่านั้นซึ่งมีความเสี่ยงมากเนื่องจากผู้อื่นอาจเปลี่ยนบริบท
MátéJuhász

ทำไมคุณไม่ลองใช้การตรวจสอบข้อมูลได้ง่ายกว่ามาก !!
Rajesh S

@RajeshS ขออภัย ไม่ได้พูดถึงว่าฉันใช้การตรวจสอบความถูกต้องของข้อมูลเพื่อควบคุมว่าเนื้อหาในเซลล์เป็นไปตามเกณฑ์หรือไม่ ฉันสามารถมีการตรวจสอบข้อมูลมากกว่าหนึ่งรายการในเซลล์เดียวได้หรือไม่
Stax82

@ Stax82 เนื่องจากคุณกำลังทำงานทีละแถวแต่ละแถวต้องมีการตรวจสอบแยกต่างหาก
Rajesh S

คำตอบ:


2

คุณพบข้อผิดพลาดในเงื่อนไขโซ่:

cond1 And cond2 Or cond3 Or cond4มักจะมีการประเมินการTrueอย่างใดอย่างหนึ่ง (หรือทั้งสอง) ของcond3หรือมีcond4 Trueนี้เป็นเพราะจะมีการประเมินก่อนAnd Orดูเอกสารประกอบสำหรับข้อมูลเพิ่มเติม

คุณสามารถใช้วงเล็บเพื่อปรับลำดับการประเมินผล:

cond1 And (cond2 Or cond3 Or cond4)

สำนวนนี้จะประเมินTrueเฉพาะในกรณีที่cond1 และใด ๆ ของมีcond2, cond3, cond4True


ในกรณีของคุณฉันขอแนะนำการปรับปรุงรหัสของคุณดังต่อไปนี้:

  • ก่อนอื่นอ่านเกี่ยวกับลูปใน VBA For ... NextและDo ... Loop เป็นสองประเภทที่คุณต้องรู้
  • จากนั้นในการทำให้สิ่งต่าง ๆ ชัดเจนขึ้น (นั่นคือให้ความตั้งใจของคุณสามารถมองเห็นได้ในโค้ด) ใส่รหัสการตรวจสอบลงในรูทีนย่อย / ฟังก์ชันของตัวเอง
  • และในที่สุดเพื่อให้ชัดเจนยิ่งขึ้นว่าเกิดอะไรขึ้นคุณสามารถแยกเงื่อนไขโซ่ยาวเหล่านี้ออก

ถ้าเราดูWorkbook_BeforeSaveขั้นตอนตอนนี้มันไม่ชัดเจนว่ามันกำลังทำอะไรอยู่ (อาจเป็นเพราะคุณเพิ่งใส่รหัสที่นั่นและมันสดใหม่ในใจของคุณ - แต่กลับมาที่แผ่นนี้ใน 3/6 / 12 เดือนและคุณต้องเข้าใจก่อนว่ามันทำอะไรอยู่) มาแก้ไขกันเถอะว่า:

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

    Cancel = IsUserInputMissing

End Sub

Private Function IsUserInputMissing() as Boolean

    ' Validation code goes in here

End Function

ตอนนี้ทุกคนที่ดูรหัสสามารถบอกได้ทันทีว่าจะเกิดอะไรขึ้นเมื่อบันทึกสมุดงาน

สายนี้

If Sheets("Sheet1").Range("A7").Value <> "" And Sheets("Sheet1").Range("B7").Value = "" Or Range("C7").Value = "" Or Range("D7").Value = "" Or Range("E7").Value = "" Or Range("F7").Value = "" Or Range("G7").Value = "" Or Range("H7").Value = "" Or Range("I7").Value = "" Or Range("J7").Value = "" Or Range("K7").Value = "" Or Range("L7").Value = "" Or Range("M7").Value = "" Or Range("N7").Value = "" Or Range("O7").Value = "" Then

ในสายตาไม่ค่อยเป็นมิตร If FirstCellIsNotEmpty And AnyFollowingCellIsEmpty Thenคำต่อคำที่มันพูดว่า ลองโค้ดด้วยวิธีนี้

Dim FirstCellIsEmpty as Boolean
FirstCellIsEmpty = Sheets("Sheet1").Range("A7").Value = ""

Dim AnyFollowingCellIsEmpty as Boolean
AnyFollowingCellIsEmpty = WorksheetFunction.CountBlank(Sheets("Sheet1").Range("B7:O7")) > 0

If Not FirstCellIsEmpty And AnyFollowingCellIsEmpty Then
    MsgBox "I don't know any Swedish. But please fill out the necessary cells."
End If

หมายเหตุการใช้WorksheetFunction.CountBlankเพื่อหลีกเลี่ยงการพิมพ์ทุกเซลล์เดียวที่จะตรวจสอบ


ในที่สุดฉันจะยกตัวอย่างว่าลักษณะการIsUserInputMissingทำงานของคุณจะเป็นอย่างไร (ยังมีพื้นที่เหลือเฟือสำหรับการปรับปรุง)

Private Function IsUserInputMissing() As Boolean

    ' Easy way to set the beginning of the range
    Const FirstRowToBeChecked As Long = 7
    ' Set a reference to the sheet that needs checking
    Dim Ws As Worksheet
    Set Ws = ThisWorkbook.Worksheets("Sheet1")

    Dim iRow As Long
    iRow = FirstRowToBeChecked

    Do

        Dim FirstCellIsEmpty As Boolean
        FirstCellIsEmpty = Ws.Cells(iRow, 1).Value = vbNullString ' vbNullString is a clearer way of saying ""
        ' Exit loop at the first empty row
        If FirstCellIsEmpty Then Exit Do

        Dim AnyFollowingCellIsEmpty As Boolean
        AnyFollowingCellIsEmpty = WorksheetFunction.CountBlank(Ws.Range(Ws.Cells(iRow, 2), Ws.Cells(iRow, 15))) > 0

        If AnyFollowingCellIsEmpty Then
            ' Any time the requirements are not met, notify user and abort checking and saving
            ' This is not as elegant as checking the whole range and collecting info about all missing inputs
            ' But it's way easier to code :)
            MsgBox "I don't know any Swedish. But please fill out the necessary cells. Tack!"
            IsUserInputMissing = True
            Exit Function
        End If
        ' Don't forget to increment the counter, otherwise you've got yourself an endless loop
        iRow = iRow + 1

    Loop

    ' If execution reaches this line, all rows fulfil the requirement
    ' IsUserInputMissing will have its Default value: False
End Function

ใช้เวลาของคุณและทำงานผ่านมัน ฉันพยายามทำให้สิ่งต่าง ๆ ชัดเจนที่สุด แต่ถ้าบางสิ่งไม่ชัดเจน อย่าลังเลที่จะถาม :)


ขอขอบคุณสำหรับความช่วยเหลือของคุณ. ตอนนี้ฉันจะพัฒนารหัสนี้เพื่อเพิ่มอีกนิด
Stax82
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.