Page 1 of 1

ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 15, 2015 5:23 pm
by kio2002
เรียนทุกท่านครับ
ผมต้องการลบแถวในคอลัมน์A5-A10 โดยให้หาตัวเลขที่เป็น0หรือไม่มีตัวเลขใดๆทิ้งไป โดยใช้ VBA
พอดีผมลองเขียน Code แล้ว มันลบทิ้งทั้งหมดเลยตั้งแต่A5-A10
รบกวนทุกท่านช่วยดูให้หน่อยครับ ว่าจะปรับ code ยังไงดีครับ

Code: Select all

 Sub RoundedRectangle1_Click()
    Sheets("Sheet1").Range("A5", "A10").Select
    Cells.Find ("")
    Selection.EntireRow.Delete
End Sub
ขอบคุณครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 15, 2015 5:27 pm
by snasui
:D ตัวอย่างการปรับ Code ครับ

Code: Select all

Sub RoundedRectangle1_Click()
    Dim rng As Range
    For Each rng In Sheets("Sheet1").Range("A5", "A10")
        If rng.Value = 0 Then
            rng.EntireRow.Delete
        End If
    Next rng
End Sub

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 15, 2015 6:01 pm
by bank9597
"คอลัมน์A5-A10" แบบนี้ไม่เข้าใจครับ

ต้องใช้ "เซลล์" เรียก ระหว่าง A5 ถึง A10 (A5-A10) หรือ A5 และ A10 (A5,A10)

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 8:36 am
by kio2002
ขอบคุณ คุณ Bank9597 ครับที่อธิบายให้เข้าใจ

เรียนท่านอาจารย์ Snasui ครับ
ผมลองนำ Code ไปใช้แล้วครับ สามารถใช้ได้ตามที่ต้องการครับ
แต่ถ้ากรณีค่า 0 ในเซลล์เยอะมากใน Sheet2 ระหว่าง C6,C54 มันลบไม่หมดในเวลาที่เราคลิ๊กครั้งเดียวครับ

ผมได้แนบไฟล์ตัวอย่างมาให้ด้วยครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 9:12 am
by DhitiBank
หรือลองอีกแบบหนึ่งครับ

Code: Select all

Sub RoundedRectangle1_Click()
    Dim rng As Range, l As Long, i As Long
    With Sheets("Sheet2")
        l = .Range("c" & .Rows.Count).End(xlUp).Row
        For i = l To 6 Step -1
            If .Cells(i, "c").Value = 0 Then
                .Rows(i).Delete
            End If
        Next i
    End With
End Sub

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 3:04 pm
by kio2002
เรียน คุณDhitiBank
Code นี้ใช้ลบค่าที่เป็น 0 ใน column C ได้เหมือนกันครับ และลบค่าที่เป็น 0 ได้หมดด้วย
แต่ผมอยากจะให้ลบเฉพาะค่า 0 ที่อยู่ในเซลล์ ระหว่าง C6,C54 ครับ

ขอบคุณล่วงหน้าครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 4:10 pm
by DhitiBank
อ๋อ ผมเข้าใจผิดนึกว่าให้ลบทั้งแถว หากค่าในคอลัมน์ C เป็น 0
ถ้าอย่างนั้น ลองปรับโค้ดตรง .Row(i).Delete เป็น .Cells(i,"c").ClearContents ครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 5:26 pm
by kio2002
DhitiBank wrote:อ๋อ ผมเข้าใจผิดนึกว่าให้ลบทั้งแถว หากค่าในคอลัมน์ C เป็น 0
ถ้าอย่างนั้น ลองปรับโค้ดตรง .Row(i).Delete เป็น .Cells(i,"c").ClearContents ครับ
เรียน คุณDhitiBankครับ
คุณDhitiBank เข้าใจถูกแล้วครับ ให้ลบแถวที่มีค่า 0 ทิ้งไปเลยครับ พอดีผมอธิบายไม่หมด
เพราะถ้าปรับใหม่เป็น
.Cells(i,"c").ClearContents
จะเป็นการ ClearContents เฉยๆ
แต่ผมอยากให้ลบแถวทิ้งเลยครับ

ขอบคุณครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 5:47 pm
by snasui
kio2002 wrote:เรียน คุณDhitiBank
Code นี้ใช้ลบค่าที่เป็น 0 ใน column C ได้เหมือนกันครับ และลบค่าที่เป็น 0 ได้หมดด้วย
แต่ผมอยากจะให้ลบเฉพาะค่า 0 ที่อยู่ในเซลล์ ระหว่าง C6,C54 ครับ

ขอบคุณล่วงหน้าครับ
:D ตัวอย่างการปรับ Code ครับ

Code: Select all

Sub RoundedRectangle1_Click()
    Dim rng As Range
    For Each rng In Sheets("Sheet1").Range("A5", "A10")
        If rng.Value = 0 Then
            rng.value = ""  
        End If
    Next rng
    Sheets("Sheet1").Range("A5", "A10").specialcells(xlcelltypeblanks).EntireRow.Delete
End Sub
ปรับช่วงเซลล์ใน Code ด้านบนให้ตรงกับที่ต้องการใช้จริง

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 5:54 pm
by DhitiBank
Sheets("Sheet1").Range("A5", "A10").specialcells(xlcelltypeblanks).EntireRow.Delete

:o ขอบคุณอาจารย์ครับ specialcells ทีเดียวอยู่เลย ถ้าหากผมต้องการลบเฉพาะเซลล์นั้นๆ แล้วให้เด้งขึ้นหลังลบแล้ว ผมก็ปรับเป็น
Sheets("Sheet1").Range("A5", "A10").specialcells(xlcelltypeblanks).Delete Shift:=xlUp
ใช่หรือเปล่าครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 5:59 pm
by snasui
DhitiBank wrote: ขอบคุณอาจารย์ครับ specialcells ทีเดียวอยู่เลย ถ้าหากผมต้องการลบเฉพาะเซลล์นั้นๆ แล้วให้เด้งขึ้นหลังลบแล้ว ผมก็ปรับเป็น
Sheets("Sheet1").Range("A5", "A10").specialcells(xlcelltypeblanks).Delete Shift:=xlUp
ใช่หรือเปล่าครับ
:thup: ใช่แล้วครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 10:18 pm
by kio2002
Code นี้แหละครับที่ผมต้องการเลย ตรงคำถามเลย
ขอบคุณท่านอาจารย์ Snasui ครับ เว็บของอาจารย์ทำให้ผมได้มีความรู้เรื่อง Excel เยอะเลยครับ
และขอบคุณ คุณDhitiBankครับที่เข้ามาช่วยอีกแรง เดี๋ยวผมจะเอาไปใช้จริงก่อน ถ้าติดตรงไหนจะมาถามอีกครับ

แต่ Code ตามด้านล่างนี้ที่อาจารย์เขียนมาให้ก็ใช้ดีเหมือนกันนะครับ แต่พอมีค่า 0 ในเซลล์เยอะๆ มันลบแถวไม่หมดในครั้งเดียว

Code: Select all

Sub RoundedRectangle1_Click()
    Dim rng As Range
    For Each rng In Sheets("Sheet1").Range("A5", "A10")
        If rng.Value = 0 Then
            rng.EntireRow.Delete
        End If
    Next rng
End Sub
ตามที่ผมเข้าใจนะครับ ผมจะลองแปลความหมายก่อน
Dim rng As Range ก็คือให้ตัวแปร rng เป็น Range
แต่ For Each ยังไม่เข้าใจความหมาย
ส่วน rng In Sheets("Sheet1").Range("A5", "A10") ถ้ามีตัวแปร rng อยู่ใน Sheets1 ให้ Range เซลล์ระหว่าง A5,A10
if rng.value = 0 Then ให้ rng แทนค่าด้วย 0
rng.EntireRow.Delete ให้ทำการลบแถวที่มีตัวแปร rng ที่มีค่าเป็น 0
end if ยังไม่เข้าใจความ
Next rng ก็ยังไม่เข้าใจความหมายเหมือนกัน

ผมแปลความหมายถูกหรือไม่ครับ ถ้าแปลไม่ถูกรบกวนช่วยอธิบายให้ผมกระจ่างด้วยครับ
ขอบคุณครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 10:35 pm
by snasui
:D ตัวอย่างคำอธิบายตามด้านล่างครับ

Code: Select all

'เริ่ม Procedure ที่ชื่อว่า RoundedRectangle1_Click
Sub RoundedRectangle1_Click()
    'ประกาศตัวแปร ให้ rng เป็น Range
    Dim rng As Range
    'Loop แต่ละเซลล์ในช่วง A5:A10
    For Each rng In Sheets("Sheet1").Range("A5", "A10")
        'ถ้าเซลล์มีค่าเป็น 0 แล้ว
        If rng.Value = 0 Then
            'ให้ลบเซลล์นั้นทั้งบรรทัด
            rng.EntireRow.Delete
        'จบ if
        End If
    'ไปยังเซลล์ถัดไป
    Next rng
'จบ Procedure
End Sub
Code นี้เป็นเพียงตัวอย่างการลบเท่านั้น โอกาสจะลบไม่หมดมีมากเพราะเป็นการลบจากบนลงด้านล่าง ซึ่งเมื่อมีการลบบรรทัดแล้วโปรแกรมจะขยับบรรทัดล่างขึ้นมาแทนบรรทัดที่ลบไป จึงเป็นเหตุที่ทำให้ลบไม่หมด หากจะลบให้หมด สามารถลบจากด้านล่างขึ้นด้านบน หรือสร้างตัวแปรเก็บ Range ที่เข้าเงื่อนไขแล้วลบทีเดียวหรือกำหนดให้ค่าที่เข้าเงื่อนไขเป็นค่าว่างแล้วค่อยลบทีเดียวเช่นนี้เป็นต้น

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 11:17 pm
by kio2002

Code: Select all

Sub RoundedRectangle1_Click()
    Dim rng As Range
    For Each rng In Sheets("Sheet1").Range("A5", "A10")
        If rng.Value = 0 Then
            rng.value = ""  ส่วนตัวนี้ก็คือ กำหนดให้ค่าที่เข้าเงื่อนไขเป็นค่าว่าง
        End If
    Next rng
    Sheets("Sheet1").Range("A5", "A10").specialcells(xlcelltypeblanks).EntireRow.Delete  ส่วนคำสั่งนี้ก็คือให้ลบทีเดียว และ xlcelltypeblanks ก็คือให้ลบค่าว่างจากล่างขึ้นบน
End Sub
ความหมายประมาณนี้ใช้ไมครับ

Re: ต้องการลบแถว(row)ในคอลัมน์Aที่มีค่าเป็น0หรือไม่มีค่าทิ้งไป

Posted: Sat Aug 29, 2015 11:25 pm
by snasui
:D ความหมายของ Sheets("Sheet1").Range("A5", "A10").specialcells(xlcelltypeblanks).EntireRow.Delete คือให้ลบเซลล์ว่างทุกเซลล์ในช่วง A5:A10 โดยลบทั้งบรรทัดพร้อมกันทีเดียว ไม่มี Code ใดที่บอกว่าเป็นการลบจากล่างขึ้นบน ในกรณีลบทั้งบรรทัดโปรแกรมจะขยับบรรทัดล่างขึ้นด้านบนให้เองอัตโนมัติครับ