รหัส VBA เพื่อลบเซลล์ว่าง


0

มีความคิดว่าทำไมสิ่งนี้ถึงใช้งานไม่ได้ ฉันได้รับข้อผิดพลาดรันไทม์ 1004: ข้อผิดพลาดที่กำหนดโดยแอปพลิเคชันหรือวัตถุที่กำหนด ฉันกำลังพยายามลบส่วนทั้งหมดของแถวถ้าเซลล์แรกนั้นว่างเปล่าแล้วถ้ามันไม่ว่างเปล่าให้ลบแถวที่ว่างเปล่าทั้งหมดจนกระทั่งมีแถวที่มีค่า เป็นเพียงการล้างสเปรดชีตอย่างง่ายดาย ฉันแนบรหัสแล้ว ป้อนคำอธิบายรูปภาพที่นี่

Private Sub checkRows()

'H or 8
If IsEmpty(Range("A827").Value) = True Then
    Rows("825:925").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("827:925").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

'G or 7
If IsEmpty(Range("A725").Value) = True Then
    Rows("723:823").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("725:823").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

'F or 6
If IsEmpty(Range("A623").Value) = True Then
    Rows("621:721").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("623:721").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

'E or 5
If IsEmpty(Range("A521").Value) = True Then
    Rows("519:619").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("521:619").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

'D or 4
If IsEmpty(Range("A419").Value) = True Then
    Rows("417:517").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("419:517").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

'C or 3
If IsEmpty(Range("A317").Value) = True Then
    Rows("315:415").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("317:415").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

'B or 2
If IsEmpty(Range("A215").Value) = True Then
    Rows("213:313").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("215:313").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

'A or 1
If IsEmpty(Range("A113").Value) = True Then
    Rows("111:211").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("113:211").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

'RP
If IsEmpty(Range("A9").Value) = True Then
    Rows("7:107").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("9:107").Select
    Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

End Sub

หน้าต่าง VBA


ขอบคุณสำหรับหัวขึ้น. ฉันใส่มันเป็นข้อความทันที ตัวอย่างข้อมูลนั้นเก่ากว่าเล็กน้อยและฉันเข้าใจผิดไปแล้วแต่ยังไม่ต้องการทำงาน
S. Price

ตอนนี้โปรดบอกเราว่าข้อผิดพลาดเกิดขึ้นที่บรรทัดใด
Scott Craner

เพียงแค่ FYI: สิ่งอื่นของคุณจะลบแถวทั้งหมดระหว่าง 827 ถึง 925 เว้นแต่คุณจะมีข้อมูลที่เติมทุกคอลัมน์ในแถวเหล่านั้นคอลัมน์ทั้งหมด 16,000+ รายการ
Scott Craner

มันไม่ให้บรรทัดที่ข้อผิดพลาดอยู่ ฉันเพิ่งได้รับป๊อปอัปที่ระบุว่าข้อผิดพลาด 1,007 ฉันจะทำให้มันลบเฉพาะแถวที่ไม่มีอะไร ขอโทษฉันไม่ได้มีประสบการณ์กับ VBA มากเกินไป
S. Price

1
เมื่อคุณเห็นข้อผิดพลาดนั้นจะมีตัวเลือกสำหรับ Debug กดปุ่มนั้นและบรรทัดที่ละเมิดจะถูกเน้น
Scott Craner

คำตอบ:


1

คุณไม่สามารถใช้ Rows() ด้วยการอ้างอิงคอลัมน์ เพียงเปลี่ยนส่วนแรกของคุณเป็นแถวเท่านั้น

If IsEmpty(Range("A827").Value) = True Then
    Rows("825:925").EntireRow.Delete XlDeleteShiftDirection.xlShiftUp
Else
    Rows("827:925").EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
End If

หรือคุณสามารถทำได้ Range("A825:A925").EntireRow.Delete ...


เปลี่ยนแล้ว แต่ยังไม่ทำงาน!
S. Price

@ S.Price - มันไม่ทำงานอย่างไร คุณได้รับข้อผิดพลาดหรือไม่? แม้จะมีรหัสที่คุณเพิ่มใน OP แต่มันก็ใช้ได้ดี รหัสที่ฉันโพสต์ใช้งานได้ แต่ให้ผลลัพธ์ที่แตกต่างจากที่คุณคาดไว้ใช่หรือไม่ Worksheet_SelectionChange() รหัสอยู่ในวัตถุแผ่นงานใช่มั้ย ไม่ใช่โมดูลสมุดงานหรือ
BruceWayne

มันบอกว่าฉันหมดพื้นที่สแต็กแล้วให้ข้อผิดพลาดในบรรทัดแรก (บรรทัด IsEmpty)
S. Price

@ S.Price - แมโครนี้ถูกบันทึกไว้ที่ไหน มันอยู่ใน วัตถุแผ่นงาน ของแผ่นงานที่คุณต้องการให้ทำงานหรือไม่ มีมาโครอื่น ๆ ที่ทำงานอยู่หรือไม่? หากนี่คือรหัสทั้งหมดที่คุณมีคุณไม่ควรได้รับสิ่งนั้น Stack Space ความผิดพลาด คุณต้องมีรหัสอื่นทำงานอยู่หรือไม่?
BruceWayne

ไม่มีมาโครอื่นทำงานอยู่และอยู่ในวัตถุแผ่นงานสำหรับไฟล์ xlsm ที่ฉันต้องการให้มีขั้นตอนดูเหมือนว่าจะถูกตั้งค่าเป็นตัวเลือกเริ่มต้นบางอย่าง
S. Price

0

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

Private Sub RemoveRows()

  If IsEmpty(ActiveSheet.Range("A827").Value) = True Then ActiveSheet.Range("A827:A925").Clear

End Sub

หากคุณตั้งใจจะผ่านการโต้แย้งช่วงฉันขอแนะนำให้ส่งค่าสตริงของช่วงมากกว่าวัตถุช่วงที่สมบูรณ์

Private Sub RemoveRows(ByVal TargetRange As String)

If IsEmpty(ActiveSheet.Range("A827").Value) = True Then ActiveSheet.Range(TargetRange).Clear

End Sub

จากนั้นเพื่อใช้สิ่งนี้เพียงแค่ส่งการแทนค่าสตริงของช่วงเป็นอาร์กิวเมนต์:

Private Sub CallRemoveRows()

RemoveRows ("A827:A895")

End Sub

ฉันได้แนบรหัสเต็มเพื่อแสดงสิ่งที่ฉันคิดว่าจะทำงานและสิ่งที่ฉันพยายามที่จะบรรลุ แผ่นงานของฉันมี 9 ส่วนแต่ละแถว 100 พวกเขาจัดรูปแบบด้วยเส้นขอบ ฉันคิดว่าถ้าฉันเขียนโค้ดบางอย่างที่เริ่มต้นที่ส่วนล่างและทำงานเป็นไปเรื่อย ๆ การลบสิ่งที่จำเป็นต้องลบการจัดรูปแบบจะไม่เปลี่ยนแปลง บางครั้งส่วนไม่มีอะไรในนั้นดังนั้นในกรณีนั้นฉันต้องการให้ตรวจสอบเซลล์แรกและลบทั้งส่วนถ้าไม่มีสิ่งนั้น แต่ถ้ามันมีบางอย่างมันจะลบแถวขึ้นไปจนถึงบรรทัดสุดท้ายที่มีค่า
S. Price

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