Page 1 of 1

การตรวจสอบเซลที่มีค่า

Posted: Tue May 27, 2014 9:31 pm
by Bafnet
สวัสดีครับอาจารย์
วันนี้มีเรื่องรบกวนหน่อยครับ หัวข้อกระทู้อาจแปลกหน่อย
เพราะผมไม่ทราบว่าควรตั้งชื่ออย่างไร
มีคำสั่งดังนี้
Dim ri As Range
Dim ry As Range
Dim rx As Range
Dim FileSaveName As String
Application.ScreenUpdating = False
If Sheet29.Range("A2").Value = "" Then
MsgBox "ไม่มีข้อมูลให้ส่งออก", vbOKOnly, "CIM 360"
Exit Sub
End If
Sheet29.Activate
On Error Resume Next
With Workbooks("CIM.xlsm").Worksheets("profit")
Set ri = .Range(.Range("A1"), .Range("H100000") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With

If Sheet29.Range("A2").Value <> "" Then
ri.Select
ri.Copy
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
FileSaveName = Application.GetSaveAsFilename(, FileFilter:="Exel Files (*.xlsx),*.xlsx", Title:=" CIM โปรดระบุชื่อไฟล์และเลือกที่ตั้งเพื่อบันทึก")
End If

If FileSaveName = "False" Then
MsgBox "ยกเลิกการส่งออกข้อมูล ", vbOKOnly, "CIM"
Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("CIM.xlsm").Worksheets("profit").Activate
Application.DisplayAlerts = True
Sheet1.Activate
Exit Sub
Else
ActiveWorkbook.SaveAs Filename:=FileSaveName
MsgBox "ได้บันทึกไฟล์ " & FileSaveName, vbOKOnly, "CIM"
Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("CIM.xlsm").Worksheets("profit").Activate
Application.DisplayAlerts = True
Sheet1.Activate
End If

ประเด็นคือ
การที่ผมใช้
With Workbooks("CIM.xlsm").Worksheets("profit")
Set ri = .Range(.Range("A1"), .Range("H100000") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ทำให้บางกรณีที่มีบางเซลที่มีค่าว่างในช่วงดังกล่าวทำให้มันนำข้อมูลไปไม่หมดเท่าข้อมูลจริงที่มีอยู่
เช่นแถวสุดท้ายที่บางคอลัมม์เป็นค่าวาง (ข้อมูลไม่ต่อเนื่อง)

ตอนนนี้เลยต้องมาปรับใหม่เป็น
Set ri = Sheet29.Columns("A:H")
ซึ่งก็ทำให้ระบบดึงข้อมูลหนัก ตามที่อาจารย์เคยสอนผมไว้เมื่อนานมาแล้ว
ในกรณีบางครั้งรายงานที่กรองมาอาจพบตามเงื่อนไขแค่ สิบรายการ แต่กลับต้อง Copy ตั้งแต่ A:H
อาจารย์พอจะแนะนำได้ไหมครับว่า
With Workbooks("CIM.xlsm").Worksheets("profit")
Set ri = .Range(.Range("A1"), .Range("H100000") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With

ควรปรับเป็นอย่างไรเพื่อให้ Copy ข้อมูลมาครบแม้จะมีข้อมูลบางช่วงของเซลขาดหายไป
ผมคิดเล่นๆว่า กุญแจการปรับเปลี่ยนน่าจะอยู่ที่ .End(xlUp)) เปน .End(xlDown))
แต่ไม่กล้าทำกลัวพังครับ :lol:
ขอคำแนะนำด้วยครับ

Re: การตรวจสอบเซลที่มีค่า

Posted: Tue May 27, 2014 9:34 pm
by snasui
:D ช่วยแก้ไขการโพสต์โดยปรับให้แสดงเป็น Code ด้วยครับ ดูตัวอย่างจากที่ Link นี้ครับ viewtopic.php?f=3&t=1187

Re: การตรวจสอบเซลที่มีค่า

Posted: Tue May 27, 2014 9:42 pm
by Bafnet
ขออภัยครับอาจารย์ ที่ทำผิดหลักเกณฑ์

Code: Select all

Dim ri As Range
Dim ry As Range
Dim rx As Range
Dim FileSaveName As String
Application.ScreenUpdating = False
If Sheet29.Range("A2").Value = "" Then
MsgBox "ไม่มีข้อมูลให้ส่งออก", vbOKOnly, "CIM 360"
Exit Sub
End If
Sheet29.Activate
On Error Resume Next
With Workbooks("CIM.xlsm").Worksheets("profit")
Set ri = .Range(.Range("A1"), .Range("H100000") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With

If Sheet29.Range("A2").Value <> "" Then
ri.Select
ri.Copy
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
FileSaveName = Application.GetSaveAsFilename(, FileFilter:="Exel Files (*.xlsx),*.xlsx", Title:=" CIM โปรดระบุชื่อไฟล์และเลือกที่ตั้งเพื่อบันทึก")
End If

If FileSaveName = "False" Then
MsgBox "ยกเลิกการส่งออกข้อมูล ", vbOKOnly, "CIM"
Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("CIM.xlsm").Worksheets("profit").Activate
Application.DisplayAlerts = True
Sheet1.Activate
Exit Sub
Else
ActiveWorkbook.SaveAs Filename:=FileSaveName
MsgBox "ได้บันทึกไฟล์ " & FileSaveName, vbOKOnly, "CIM"
Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("CIM.xlsm").Worksheets("profit").Activate
Application.DisplayAlerts = True
Sheet1.Activate
End If
ประเด็นคือ
การที่ผมใช้
With Workbooks("CIM.xlsm").Worksheets("profit")
Set ri = .Range(.Range("A1"), .Range("H100000") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ทำให้บางกรณีที่มีบางเซลที่มีค่าว่างในช่วงดังกล่าวทำให้มันนำข้อมูลไปไม่หมดเท่าข้อมูลจริงที่มีอยู่
เช่นแถวสุดท้ายที่บางคอลัมม์เป็นค่าวาง (ข้อมูลไม่ต่อเนื่อง)

ตอนนนี้เลยต้องมาปรับใหม่เป็น
Set ri = Sheet29.Columns("A:H")
ซึ่งก็ทำให้ระบบดึงข้อมูลหนัก ตามที่อาจารย์เคยสอนผมไว้เมื่อหลายปีมาแล้ว
ในกรณีบางครั้งผลรายงานที่กรองมาอาจพบตามเงื่อนไขแค่ สิบรายการ แต่กลับต้อง Copy ตั้งแต่ A:H
อาจารย์พอจะแนะนำได้ไหมครับว่า
With Workbooks("CIM.xlsm").Worksheets("profit")
Set ri = .Range(.Range("A1"), .Range("H100000") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With

ควรปรับเป็นอย่างไรเพื่อให้ Copy ข้อมูลมาครบแม้จะมีข้อมูลบางช่วงของเซลขาดหายไป
ผมคิดเล่นๆว่า กุญแจการปรับเปลี่ยนน่าจะอยู่ที่ .End(xlUp)) เปน .End(xlDown))
แต่ไม่กล้าทำกลัวพังครับ :lol:
ขอคำแนะนำด้วยครับ :roll:

Re: การตรวจสอบเซลที่มีค่า

Posted: Tue May 27, 2014 10:01 pm
by snasui
:D ทำไฟล์ตัวอย่างเล็ก ๆ มาด้วย ชี้ให้เห็นว่าข้อมูลต้นทางเป็นอย่างไร ข้อมูลปลายทางเป็นอย่างไร จะได้เข้าถึงปัญหาได้โดยไว

การทดสอบ Code ไม่ควรกลัวว่าไฟล์จะเสียหาย ไฟล์ที่ใช้ทดสอบจะต้องทดสอบได้ทุกเรื่อง หากกลัวเสียหายก็ให้ทำสำเนาไว้เสมอครับ