Page 1 of 1

ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Wed Jun 23, 2010 6:24 pm
by double bass
สวัสดีครับ

ขอรบกวนถามหน่อยครับ

......................

ปกติใน Excel เวลากรอกข้อมูล

ข้อมูลใหม่สุด ต้องไปกรอกอยู่แถวล่างสุดใช่มั้ยครับ


แต่ผมต้องการทำให้ ข้อมูลใหม่สุดอยู่แถวบนสุดครับ

ส่วนข้อมูลที่เก่ากว่า ก็ให้เลื่อนต่ำลงไปเรื่อยๆ

สมมุติ ตัวอย่างตามไฟล์ที่แนบมาครับ

ไม่ทราบว่า มีวิธีที่จะทำได้หรือไม่ครับ

ขอบคุณครับ

...

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Wed Jun 23, 2010 6:40 pm
by snasui
:D การทำเช่นนี้ต้องใช้ VBA เข้ามาช่วยครับ ดูไฟล์แนบประกอบครับ

Code: Select all

Sub ShiftDataDown()
With Worksheets("Sheet1")
    .Range(.Range("A3"), .Range("C65536").End(xlUp)).Copy
    .Range("A4").PasteSpecial xlPasteValues
    .Range("A2:C2").Copy
    .Range("A3").PasteSpecial xlPasteValues
End With
Application.CutCopyMode = False
MsgBox "Paste Finish"
End Sub

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Wed Jun 23, 2010 8:39 pm
by double bass
ผมได้ลองเปิดไฟล์ที่แนบตอบไว้นั้นดูแล้วครับ

ก็ใช้ได้ตามต้องการครับ


คำถามเพิ่มเติมคือ ถ้าผมจะนำวิธีการนี้ไปใช้กับ sheetอื่น

ผมจะต้องทำยังไงครับ

ช่วยอธิบายอย่างละเอียดหน่อยครับ พอดีไม่มีความรู้เกี่ยวกับ VBA เลยครับ

ต้องรบกวนด้วยครับ ขอบคุณครับ

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Wed Jun 23, 2010 9:02 pm
by snasui
:D ลองทำความเข้าใจตามด้านล่างครับ ข้อความด้านหลังคือคำอธิบาย ซึ่งคิดว่าคนที่ไม่คุ้นเคย จะเข้าใจยากสักหน่อยครับ

Code: Select all

Sub ShiftDataDown() 'ชื่อ Procedure
With Worksheets("Sheet1") 'ที่ Sheet1
    .Range(.Range("A3"), .Range("C65536").End(xlUp)).Copy 'ให้ทำการ Copy ช่วงเซลล์ตั้งแต่ A3 จนถึงเซลล์ C ตัวท้ายสุดที่มีข้อมูล
    .Range("A4").PasteSpecial xlPasteValues 'นำมาวางเฉพาะ ค่า (ไม่เอารูปแบบ ไม่เอาสูตร) ที่ A4
    .Range("A2:C2").Copy 'Copy A2:C2
    .Range("A3").PasteSpecial xlPasteValues ' นำมาวางเฉพาะ ค่า (ไม่เอารูปแบบ ไม่เอาสูตร) ที่ A3
End With 'ปิดการทำการกับ Sheet1
Application.CutCopyMode = False 'ปิดการทำงานกับการ Copy --> เหมือนการกด esc
MsgBox "Paste Finish" 'กำหนดให้มีกล่องข้อความแ้จ้งว่าทำการวางข้อมูลเรียบร้อยแล้ว
End Sub 'จบ Procedure

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Sun Jun 27, 2010 6:11 pm
by double bass
สวัสดีครับคุณคนควน

จากรหัสที่คุณเขียนให้ ผมได้ลองใช้ดู

โดยทำตามขั้นตอนในหัวข้อ "โครงสร้างชุดคำสั่ง VBA"
จากลิ้งค์นี้ http://www.excelexperttraining.com/blog ... 000671.php ( ผมอ่านดูแล้วก็ยังไม่ค่อยเข้าใจเท่าไหร่ )


โดยปรับให้แถวแรกอยู่ที่ row20 ( ได้แก้ไขรหัสให้สอดคล้องกันด้วย )

ผลคือ ถ้าเป็น sheet เปล่า ก็สามารถใช้ได้ตามต้องการ




แต่พอเอาไปเป็นส่วนประกอบของหน้า sheet ซึ่งมีสูตรลิงค์ไปยัง sheet อื่นๆอยู่ด้วย( ตามไฟล์ที่แนบมาใหม่ )

ผลคือ ใช้ไม่ได้ มันฟ้องว่า Run-time error '9' : Subscript out of range





จึงต้องขอรบกวนคุณคนควน ให้ช่วยชี้แนะอีกครั้งว่า

จะต้องตั้งค่าอะไร อย่างไร

และอยากให้ช่วยสอนวิธีสร้าง ปุ่ม Paste ให้ด้วยครับ

ขอบคุณมากครับ


Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Sun Jun 27, 2010 6:29 pm
by double bass
ทดสอบ

ลองแปะลิ้งค์ในโพสต์ข้างบนอีกครั้ง http://www.excelexperttraining.com/blog ... 000671.php


..................................


เอ่อ สงสัยว่า โพสต์ข้างบนต้องการแปะลิ้งค์เต็มๆตามนี้ excelexperttraining.com/blogs/archives/z210-CourseManual000671.php (หัวข้อ โครงสร้างชุดคำสั่ง VBA )


แต่ทำไมมันดันไปย่อลิ้งค์ให้สั้นลง จนกลายเป็นหน้าเว็บอื่นที่ไม่ใช่ที่ต้องการอ้างถึงซะนี่



:roll: :lol: :D

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Mon Jun 28, 2010 10:46 am
by snasui
:D ลองทดสอบการใช้งานตามไฟล์แนบครับ

ซึ่งผมได้เขียน Code ให้วางข้อมูลไว้ด้านบนเสมอตามด้านล่างครับ

Code: Select all

Option Explicit

Sub PasteData()
Dim i As Integer, r As Range
Dim rSource As Range, rTarget As Range
Dim rTarget1 As Range, rTarget2 As Range
For Each r In Worksheets("สารบัญ").Range("A3:A16")
    If r <> "" Then
        i = i + 1
    End If
Next r
With Worksheets("สารบัญ")
    Set rSource = .Range(.Range("H3"), .Range("A" & 3 + i - 1))
    Set rTarget = .Range(.Range("H20"), .Range("A65536").End(xlUp))
    Set rTarget1 = .Range("A20").Offset(i, 0)
    Set rTarget2 = .Range("A20")
End With
rTarget.Copy
rTarget1.PasteSpecial xlPasteValues
rSource.Copy
rTarget2.PasteSpecial xlPasteValues
Application.CutCopyMode = False
MsgBox "Paste Finish."
End Sub

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Mon Jun 28, 2010 7:33 pm
by snasui
:D การสร้างปุ่มสำหรับ Run Code ดูตัวอย่างตามภาพด้านล่างครับ

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Tue Jun 29, 2010 7:56 pm
by double bass
เรียนคุณคนควน
คำตอบหลังสุดของคุณในโพสต์ที่ 7 ยังไม่ตรงกับที่ผมต้องการครับ

ต้องขอโทษอย่างแรงครับ คงเป็นเพราะผมอธิบายคำถามในโพสต์ที่ 5 ไม่ชัดเจนเอง
ขออธิบายใหม่นะครับ ตามไฟล์ที่แนบมาใหม่

..............................

อธิบายเพิ่มเติม

( ก )
จากคำตอบแรกของคุณในโพสต์ที่ 2 ที่แนบไฟล์ไว้ คือ Ans_ShiftDataDown
อันนี้ใช่ครับ ตรงกับที่ผมต้องการแล้ว
และเมื่อผมนำ Code ที่คุณตอบไว้ไปลองใช้ดูใน Sheet เปล่า
แต่เปลี่ยน row ที่จะใช้ ShiftDataDown ให้ไปเริ่มที่ row ด้านล่างของหน้า Sheet
โดยไปเปลี่ยนค่า Range ให้สอดคล้องกันด้วย
ผลคือ ก็ใช้ได้ตามต้องการ ( นี่เป็นการทดลองใน Sheet เปล่า )


( ข )
แต่เมื่อผมนำวิธีการในข้อ ( ก ) จะไปวางไว้ที่ส่วนล่างของหน้าสารบัญ ในรายการหนังสือ( ตามไฟล์ที่แนบนี้ )
โดยต้องการให้ ShiftDataDown ทำงานตั้งแต่ row18 ลงไป
ผลคือ กลับใช้ไม่ได้ ระบบมันไม่ทำงานเหมือนกับที่วางไว้ใน Sheet เปล่า( ดังที่บอกไว้ในข้อ ( ก ) )
ผมจึงได้มาถามอีกครั้ง ตามที่เขียนไว้ในโพสต์ที่ 5


( ค )
สิ่งที่ผมต้องการคือ ต้องการให้ข้อมูลที่ป้อนไว้ที่ row18 เลื่อนลงไป 1 row และเป็นเช่นนี้เรื่อยไปเมื่อกดปุ่ม Paste
โดยไม่ต้องไปเกี่ยวข้องใดๆ กับข้อมูลส่วนบนของหน้าสารบัญ( row 15 ขึ้นไปถึง row 1 )เลย


หรืออีกนัยหนึ่ง ShiftDataDown ผมต้องการเอามาใช้กับส่วนที่ระบายสีไว้ในไฟล์ที่แนบ( row 18 ลงไป )
โดย ShiftDataDown ไม่ต้องไปเกี่ยวข้องใดๆ กับข้อมูลที่อยู่ในส่วนที่ไม่ระบายสีเลย( row 15 ถึง row 1 )


( คำตอบของคุณคนควน ในโพสต์ที่ 7 เมื่อกดปุ่ม Paste ข้อมูลในส่วน row 15 ถึง row 1 จะไปโผล่ที่ row 18 ลงไป ซึ่งไม่ใช่สิ่งที่ผมต้องการครับ
สิ่งที่ผมต้องการมันง่ายๆ ไม่ได้ซับซ้อน เพียงแต่ต้องปรับอะไรบางอย่างอีกนิดหน่อย ก็น่าจะใช้ได้แล้ว ใช่มั้ยครับ )



( ง )
ซึ่ง Code จากโพสต์ที่ 2 ที่คุณเขียนไว้ให้
เมื่อปรับใหม่ให้สอดคล้องกับที่เริ่มที่ row18 ก็น่าจะเป็นตามข้างล่างนี้ใช่มั้ยครับ

Sub ShiftDataDown()
With Worksheets("Sheet1")
.Range(.Range("A19"), .Range("G65536").End(xlUp)).Copy
.Range("A20").PasteSpecial xlPasteValues
.Range("A18:G18").Copy
.Range("A19").PasteSpecial xlPasteValues
End With
Application.CutCopyMode = False
MsgBox "Paste Finish"
End Sub


แต่แค่นี้ ผมลองดูแล้วยังใช้ไม่ได้ มันไม่ทำงาน
( ถ้าเอาไปวางไว้ใน Sheet เปล่าที่ไม่มีสูตรใดๆ มันใช้ได้ดังที่บอกไว้ในข้อ( ก )
แต่พอเอามาวางไว้หน้าเดียวกับหน้าสารบัญ ซึ่งมีสูตรอยู่ด้วย มันกลับใช้ไม่ได้ดังที่บอกไว้ในข้อ( ข ) )


ก็เลยต้องมารบกวนถามคุณคนควนอีกครั้งว่าต้องเพิ่ม Code อะไรอีกครับ ช่วยชี้แนะด้วยครับ
ขอบคุณมากครับ

...

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Tue Jun 29, 2010 8:22 pm
by snasui
:D ลองดูไฟล์ที่ผมปรับมาให้ใหม่ตามด้านล่างครับ

Code: Select all

Option Explicit

Sub ShiftDataDown()
With Worksheets("สารบัญ")
    .Range(.Range("A19"), .Range("A65536").End(xlUp).Offset(0, 7)).Copy
    .Range("A20").PasteSpecial xlPasteValues
    .Range("A18:H18").Copy
    .Range("A19").PasteSpecial xlPasteValues
End With
Application.CutCopyMode = False
MsgBox "Paste Finish"
End Sub

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Wed Jun 30, 2010 6:05 pm
by double bass
เรียนคุณคนควน
จากไฟล์ที่แนบในโพสต์ที่ 10
ShiftDataDown ใช้ได้ตามต้องการแล้วครับ
.......................................

แต่มีปัญหาใหม่ตามมาครับ
คือหลังจากทำให้ ShiftDataDown ในส่วนล่างของหน้าสารบัญใช้ได้แล้ว
ลิงค์ที่ส่วนบนในหน้าสารบัญ กลับใช้ไม่ได้ครับ

คือเดิมนั้น เมื่อคลิก “ชั้นA” หรือ “ชั้นB” เป็นต้น ในเซลล์ A2 ถึง A8
มันก็จะลิ้งค์ไปยัง sheetชั้นA หรือ sheetชั้นB ตามสูตรที่เขียนไว้

แต่ตอนนี้ ลิ้งค์มันกลับไม่ทำงานครับ
ไม่ทราบว่า เป็นเพราะสาเหตุใดครับ


....

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Wed Jun 30, 2010 6:10 pm
by double bass
ลิ้งค์มันไม่ทำงาน หลังจากทำให้ ShiftDataDown ใช้การได้

ไม่ทราบว่าจะต้องแก้ไขอย่างไรครับ

ต้องรบกวนอีกรอบครับ ขอบคุณครับ

...

Re: ต้องการให้ข้อมูลใหม่อยู่แถวบนสุด

Posted: Wed Jun 30, 2010 6:25 pm
by snasui
:D ต้องเปลี่ยน [รายการหนังสือ.xlsm] ในสูตร ให้เป็น [Ans_ShiftDataDown.xlsm] หรือเป็นชื่อไฟล์ปัจจุบันก่อนครับ :mrgreen: