Page 1 of 1

รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Thu Aug 06, 2015 3:35 pm
by jex
รบกวนถามค่ะ จะทำอย่างไรให้ cursor ไปอยู่อีกบรรทัดหลังจากบรรทัดที่มีข้อมูล ไม่ว่าก่อนหน้านี้ cursor จะอยู่ตรงไหนในชีทแต่กด run macro ให้ไปอยู่ในตำแหน่งหลังจากบรรทัดที่มีข้อมูลค่ะ เช่น มีข้อมูลอยู่ที่ A1 ถึง A10 แต่ cursor ปัจจุบันอยู่ที่ K5 แล้วพอรัน macro ให้มาอยู่ที่ตำแหน่ง A11 ค่ะ หรือถ้ามีข้อมูลที่มากกว่านี้ ไปถึง A50 แล้ว cursor อยู่ที่ A1 ก็ให้รัน macro นำ cursor มาอยู่ที่ตำแหน่ง A51 ค่ะ ขอบคุณค่ะ

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Thu Aug 06, 2015 3:54 pm
by DhitiBank
หากเป็นคำถามเกี่ยวกับ VBA จะต้องลองทำมาเองก่อนตามกฎข้อ 5 ด้านบนครับ :)
หากลองทำแล้วก็รบกวนแนบไฟล์มาได้เลย อาจารย์และเพื่อนๆ สมาชิกจะได้ช่วยแนะให้ได้ครับ

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Thu Aug 06, 2015 4:23 pm
by jex
เพิ่มเติมค่ะ ตอนทำค่ะ ทำแบบ record macro ค่ะ แต่พอเรามีข้อมูลเพิ่มมาค่ะ cursor ก็ไม่ตามไปที่ข้อมูลล่าสุดค่ะ

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Thu Aug 06, 2015 4:50 pm
by DhitiBank
ลองปรับโค้ดใน Module1 เป็นแบบนี้ครับ

Code: Select all

Sub Macro1()
    Dim l As Long
    With ActiveSheet
        'หาว่าแถวว่างที่ถัดลงมาจากแถวสุดท้ายที่มีข้อมูลคือแถวเท่าไร
        l = .Range("a" & .Rows.Count).End(xlUp).Row + 1
        'สั่งให้ select ที่เซลล์นั้น
        .Range("a" & l).Select
    End With
End Sub

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Thu Aug 06, 2015 4:53 pm
by snasui
:D อีกตัวอย่างครับ

Code: Select all

Sub Macro1()
    'ไปยังบรรทัดว่างหลังจากมีข้อมูลในคอลัมน์ A
    'R1C1 คือ บรรทัดที่ 1 คอลัมน์ที่ 1 หรือ A1
    'C1 คือ คอลัมน์ที่ 1 คือ คอลัมน์ A
    Application.Goto Reference:="OFFSET(R1C1,COUNTA(C1),0)"   
End Sub

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Thu Aug 06, 2015 5:03 pm
by DhitiBank
โอ้ ขอบคุณมากครับ คำสั่งคล้ายๆ ที่อาจารย์อัดวีดีโอแปะไว้ในเฟสบุ๊คใช่ไหมครับ ที่สอนการบันทึกมาโครส่งข้อมูลที่คีย์ไปต่อท้ายใน database

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Thu Aug 06, 2015 5:12 pm
by snasui
:D ใช่แล้วครับ :mrgreen:

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Fri Aug 07, 2015 8:33 am
by jex
:thup: ได้แล้วค่ะ ขอบคุณมากๆ เลยค่ะ

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Fri Aug 07, 2015 12:56 pm
by jex
สอบถามเพิ่มเติมค่ะ ถ้าต้องการเพิ่มเติมในแนวนอนค่ะ ต้องทำอย่างไรคะ ลองประยุกต์แล้วทำมาแบบนี้ค่ะ แต่ถ้ามีข้อมูลเพิ่มในแนวนอนก็ไม่ได้ที่ต้องการค่ะ

Code: Select all

Sub macro()
    Dim l As Long
    With ActiveSheet
       
        l = .Range("K" & .Rows.Count).End(xlToRight).Rows + 1
        
        .Range("K" & l).Select
    End With
End Sub
ส่วน code

Code: Select all

Sub Macro1()
    'ไปยังบรรทัดว่างหลังจากมีข้อมูลในคอลัมน์ A
    'R1C1 คือ บรรทัดที่ 1 คอลัมน์ที่ 1 หรือ A1
    'C1 คือ คอลัมน์ที่ 1 คือ คอลัมน์ A
    Application.Goto Reference:="OFFSET(R1C1,COUNTA(C1),0)"   
End Sub
ลองประยุกต์ดูไม่ยังไม่ได้แนวนอนค่ะ ยังไม่ค่อยเข้าใจ รบกวนแนะนำด้วยค่ะ ขอบคุณมากค่ะ

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Fri Aug 07, 2015 1:37 pm
by snasui
:D ให้ Post Code ที่ได้ลองมาเองแล้วด้วย จะได้ช่วยดูต่อไปจากนั้นครับ

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Fri Aug 07, 2015 1:52 pm
by jex
codeนี้ค่ะที่ประยุกต์เพิ่มเติม แต่ถ้ามีข้อมูลเพิ่มก็ไม่ได้ตามที่ต้องการค่ะ รบกวนด้วยค่ะ

Code: Select all

Sub macro2()

    Dim l As Long
    With ActiveSheet
       
        l = .Range("K" & .Rows.Count).End(xlToRight).Rows + 1
        
        .Range("K" & l).Select
    End With

End Sub

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Fri Aug 07, 2015 2:34 pm
by DhitiBank
:) ก่อนอื่นคุณ jex ต้องเข้าใจก่อนครับว่าคำสั่งดังกล่าวกำลังสั่งให้ทำอะไร

Code: Select all

Sub macro2()
    Dim l As Long
    With ActiveSheet
        l = .Range("K" & .Rows.Count).End(xlToRight).Row + 1
        .Range("K" & l).Select
    End With
End Sub
คำสั่งด้านบนตอนแรกออกแบบเพื่อให้หาแถวถัดจากแถวสุดท้ายที่มีข้อมูล ดังนั้น หากต้องการหาคอลัมน์ที่ถัดจากคอลัมน์สุดท้ายที่มีข้อมูลแล้วไปเปลี่ยนแค่ที่ End(...) จึงไม่เพียงพอครับ

ลองปรับโค้ดเป็นแบบนี้ครับ

Code: Select all

Sub macro2()
    Dim l As Long
    With ActiveSheet     
        l = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1       
        .Cells(1, l).Select
    End With
End Sub
หรือหากเป็นคำสั่งที่อาจารย์ให้มาก็ปรับเป็นแบบนี้ครับ

Code: Select all

Sub macro2()
    Application.Goto reference:="OFFSET(R1C1,0,COUNTA(R1))"
End Sub

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Fri Aug 07, 2015 2:55 pm
by jex
:thup: ขอบคุณมาก ๆค่ะ พึ่งเริ่มศึกษาค่ะ ยังไม่ค่อยเข้าใจเท่าไหร่ค่ะ ขอบคุณค่ะ

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Sat Aug 08, 2015 12:22 am
by DhitiBank
ไม่เป็นไรครับ ค่อยๆ ทำความเข้าใจกันไป ถ้าอย่างนั้นผมขออธิบายให้ละเอียดขึ้นอีกหน่อย

เริ่มจากของอาจารย์ก่อน เพราะกระชับและหากทำความเข้าใจที่ฟังก์ชัน Offset ได้แล้วก็จะเอาไปใช้ได้ง่ายครับ ลองศึกษาเกี่ยวกับ offset ที่ลิงค์ด้านล่างนี้
OFFSET

ส่วนที่ของผม อธิบายไล่บรรทัดเลยนะครับ
Dim l As Long
:arrow: ประกาศตัวแปร l เป็นชนิด Long ซึ่งจะรองรับเลขจำนวนเต็มที่มีค่าระหว่าง -9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807 เพราะตอนแรกจะให้ l แทนเลขแถวที่มีโอกาสมากสุดคือเลข 1,048,576 (โปรแกรมรุ่น 2007 ขึ้นไป)

With ActiveSheet
:arrow: ใช้ with เพื่อจะละคำที่อยู่หลัง with ไว้ คำสั่งจะได้สั้นลงครับ หากไม่ละ อีก 2 บรรทัดถัดลงมาก็จะยาวขึ้น เดี๋ยวจะเขียนบอกหลังจากนี้ การใช้ with ต้องจบด้วย end with

l = ActiveSheet.Range("K" & ActiveSheet.Rows.Count).End(xlToRight).Row + 1
:arrow: อันนี้คือแบบไม่ละ ActiveSheet
:arrow: ตรง .rows.count จะสั่งให้นับจำนวนแถวทั้งหมดในชีทนี้ (ได้ 1048576) จากนั้นจะตั้งต้นที่เซลล์ K1048576 แล้วนึกภาพว่ากดปุ่ม Ctrl + ลูกศรขวา (คือ .End(xlToRight)) การทำแบบนี้จะทำให้ cursor วิ่งไปทางขวาและจะไปหยุดที่เซลล์แรกที่พบว่ามีอักขระบรรจุอยู่ หรือหากไม่มีเลยก็จะไปหยุดที่เซลล์ขวาสุด
:arrow: พอเคอเซอร์หยุดแล้วก็สั่งให้ l มีค่าเท่ากับเลขของแถวนั้น +1 (จะได้ 1048577)

ActiveSheet.Range("K" & l).Select
:arrow: สั่งให้เลือกเซลล์ K1048577 หากรันคำสั่งนี้จริงๆ จะทำให้เกิดการผิดพลาดเพราะเซลล์นี้ไม่มีอยู่จริงครับ (เลยแผ่นงาน)

ส่วนโค้ดใหม่ที่ปรับไปก็คล้ายๆ กันครับ วิธีติดตามการทำงานของคำสั่งที่ผมใช้อยู่คือ รันโค้ดทีละบรรทัด (กด F8) และใช้ immediate window กับ watch window ครับ

Re: รบกวนถามการกำหนด cursor ให้กลับมาตำแหน่งที่ต้องการค่ะ

Posted: Fri Aug 14, 2015 3:44 pm
by jex
:thup: :D ขอบคุณมาก ๆ เลยค่ะ เดี๋ยวลองทำความเข้าใจก่อนค่ะ ขอบคุณค่ะ