Page 1 of 1
การอ่านข้อมูลแบบวน Loop
Posted: Mon Jan 23, 2012 10:36 am
by pepper_dog
พี่ครับ

วันนี้่ขอรบกวนแต่เช้าหน่อยครับ
ผมอยากทราบวิธีการอ่านค่าข้อมูล excel แบบวน loop ใน vba นะครับ
จากไฟล์ตัวอย่างนะครับ
sheet "paymentbycus" ถ้า cell D1 = "001" แล้วทำการกดปุ่ม "พิมพ์รายงาน" ให้โปรแกรมทำงานดังนี้ครับ
1. code vba CommandButton2_Click ให้โปรแกรมไปอ่าน sheet "data_day"
2. ให้อ่านตั้งแต่ แถวที่ 2 ให้ทำการเลือกรหัสลูกค้าที่ = "001"
3. ถ้ารหัสลูกค้า = "001" ก็ให้เอา data แถวนั้นไปวางที่หน้า sheet "paymentbycus"
4. อ่านวน loop จนจบทุกแถวนะครับ
ขอขอบคุณมากครับ
Re: การอ่านข้อมูลแบบวน Loop
Posted: Mon Jan 23, 2012 10:53 am
by bank9597

สามารถใช้สูตรได้เลยครับ
ว่าแต่ชีท PaymentByCus เป็นชีทที่ใช้พิมพ์รายงานไหมครับ แล้วปุ่มชื่อ "พิมพ์รายงาน" ใช้ดึงข้อมูลจาก DataDay หรือให้แสดงตัวอย่างการพิมพ์ครับ
ช่วยอธิบายเพิ่มอีกนิดครับ

Re: การอ่านข้อมูลแบบวน Loop
Posted: Mon Jan 23, 2012 11:23 am
by pepper_dog
ปุ่มชื่อ "พิมพ์รายงาน" ผมต้องการให้ดึงข้อมูลจาก dataday มาโชว์ที่หน้า PaymentByCus นะครับ เพื่อพิมพ์รายงาน แต่ผมคงต้องประยุกต์ใหม่อีกทีครับ เลยอยากได้การอ่านข้อมูลแบบ vba นะครับ
อย่างเช่นถ้าเลือกรหัส 001 ก็ให้ดึงข้อมูลมากจาก dataday ที่เป็นรหัส 001 เท่านั้นนะครับ
Re: การอ่านข้อมูลแบบวน Loop
Posted: Mon Jan 23, 2012 11:28 am
by pepper_dog

สอบถามเพิ่มเติมครับผม
ถ้าใช้สูตรเวลาเลือก List รหัสลูกค้า ใช้สูตรยังงัยครับผม เผื่อเป็นทางเลือกที่ดีกว่าครับ
Re: การอ่านข้อมูลแบบวน Loop
Posted: Mon Jan 23, 2012 11:52 am
by bank9597

สำหรับความคิดผมแล้ว การใช้สูตรคือสิ่งที่เหมาะสมที่สุดในการใช้งานเอ็กเซลล์ครับ และคิดว่าอาจารย์คนควนก็เห็นเช่นเดียวกัน เพราะว่าสูตรเราสามารถแก้ไขปัญหาได้เองบ้าง แต่ VBA จะต้องเรียนรู้ให้รู้จริงๆ ถึงจะทำได้ หากไม่รู้เลย เวลาเกิดปัญหาก็จะแก้ไขอะไรเองไม่ได้เลยครับ อย่างไรก็ตาม VBA ก็ใช้งานได้ดีมากสำหรับผู้ใช้เป็นเช่น ระดับอาจารย์คนควน เป็นต้น ครับ
สูตรที่ว่านั้น สามารถทำได้ แต่สูตรอาจจะยาวหน่อยครับ
ลองตามนี้ครับ
ที่เซลล์ E1 คีย์ =COUNTIF(data_day!$B$2:$B$7,D1) เพื่อนนับรหัสที่เราเลือกครับ
ที่เซลล์ A5 คีย์ =IF(ROWS(A$5:$B5)>$E$1,"",INDEX(data_day!A$2:A$20,SMALL(IF(data_day!$B$2:$B$20=paymentbycus!$D$1,ROW(data_day!A$2:A$20)-ROW(data_day!A$2)+1),ROWS(A$5:$B5)))) กดแป้น Ctrl+Shift+Enter พร้อมกันจะได้เครื่องหมาย{} คร่อมสูตรไว้ ไม่กดปุ่ม Enter เพียงปุ่มเดียวครับ
จากนั้นก็คัดลอกไปทางขวามือจนถึงคอลัมน์ L แล้วคัดลอกลงมาด้านล่างครับ
เบื้องต้นลองดูสูตรก่อนน่ครับ ส่วน VBA ผมค่อยมาตอบให้ในกระทู้ถัดไป ตามสะดวกครับ

Re: การอ่านข้อมูลแบบวน Loop
Posted: Mon Jan 23, 2012 5:38 pm
by snasui
bank9597 wrote:
สำหรับความคิดผมแล้ว การใช้สูตรคือสิ่งที่เหมาะสมที่สุดในการใช้งานเอ็กเซลล์ครับ และคิดว่าอาจารย์คนควนก็เห็นเช่นเดียวกัน เพราะว่าสูตรเราสามารถแก้ไขปัญหาได้เองบ้าง แต่ VBA จะต้องเรียนรู้ให้รู้จริงๆ ถึงจะทำได้ หากไม่รู้เลย เวลาเกิดปัญหาก็จะแก้ไขอะไรเองไม่ได้เลยครับ อย่างไรก็ตาม VBA ก็ใช้งานได้ดีมากสำหรับผู้ใช้เป็นเช่น ระดับอาจารย์คนควน เป็นต้น ครับ

สำหรับผมแล้วขึ้นอยู่กับงานที่ทำ ผมเน้นว่าให้รู้ความสามารถ Excel ให้มากที่สุดเท่าที่จะมากได้ก่อน เพราะว่าหลายงานไม่จำเป็นต้องใช้ VBA แต่ไม่ได้หมายความว่าสูตรจะเหมาะกว่า VBA เสมอไปครับ
Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 10:36 am
by pepper_dog

พี่ครับ ตอนนี้ผมหาวิธีการอ่าน แบบวน loop ได้แล้วครับ และนำเอามาประยุกต์ แต่ติดปัญหาอยู่นิดหน่อย ขอสอบถามเพิ่มเติมครับ
ถ้าโปรแกรมเข้าเงื่อนไขที่ต้องการ จะทำการ copy ทั้งแถวตั้งแต่ A ที่ i ถึง L ที่ i ใช้คำสั่งอะไรครับ
Private Sub CommandButton2_Click()
Dim rs As Range, rt As Range, i As Integer
With Worksheets("data_day")
Set rs = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
For i = 1 To rs.Count
If .Range("B" & i) = "1" Then
Set rs = จะทำการ copy ทั้งแถวตั้งแต่ A ที่ i ถึง L ที่ i ใช้คำสั่งอะไรครับ
Set rt = Worksheets("paymentbycus").Range("A" & Rows.Count - 3) _
.End(xlUp).Offset(1, 0)
rs.Copy
rt.PasteSpecial Paste:=xlPasteValues, Transpose:=True
Application.CutCopyMode = False
End If
Next
End With
ขอบคุณมากครับผม
Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 10:43 am
by bank9597

ผมได้ลองทำไว้ให้ครับ โดยสร้างปุ่มใหม่มา 1 ปุ่มไว้ดึงข้อมูลมาแสดง
ลองศึกษาตามไฟล์แนบครับ
Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 10:51 am
by pepper_dog
ขอบคุณมากครับผม

Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 12:53 pm
by pepper_dog
พี่ครับ
ตอนนี้ติดปัญหาตรงที่ช่อง combobox กรณีรหัสลูกค้า = 101 พอทำการเลือก จะได้ค่า = 5
แก้อย่างไรให้ได้ค่าตามที่เลือกครับ
รบกวนหน่อยครับ ติดตรงนี้มา 2 วันละครับ
ขอบคุณมากๆครับ
Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 1:17 pm
by bank9597

อันนี้พูดถึงไฟล์ที่ผมแนบไปให้ล่าสุด หรือไฟล์หรือครับ

Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 1:27 pm
by pepper_dog
ใช่ครับ ไฟล์ล่าสุดก็เป็นนะครับ
ผมทดลอง ใส่รหัส 101 ที่ไฟล์ data_day นะครับ
ผมแนบไฟล์ทดสอบมาให้ดูด้วยครับ เมื่อกี้ลืมแนบไฟล์มานะครับ
Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 1:54 pm
by bank9597

คุณ pepper_dog ลองทำตามนี้ไฟล์แนบได้ไหมครับ ผมคิดว่าน่าจะง่ายกว่า
ส่วนใน Combobox ผมยังหาสาเหตุไม่เจอ ต้องเรียนถามอาจารย์อีกครั้งน่ะครับ

Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 3:43 pm
by pepper_dog

ขอถามเพิ่มเติมครับ
ถ้าที่ data validation
source สามารถใช้ สูตร offset ได้หรือไม่ครับ ผมลองแล้วได้แค่ cell เดียวครับ
ตามตัวอย่างไฟล์นะครับ
ขอบคุณครับ
Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 3:55 pm
by bank9597

ทำได้ครับ
ที่ Range Name ชื่อ Code เปลี่ยนในแถบสูตรเป็น =OFFSET(paymentbycus!$O$2,0,0,COUNTA(paymentbycus!$O:$O)-1)
ก็จะได้ Range Name แบบไดนามิค

Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 4:33 pm
by pepper_dog

โอเคเลยครับผม ลดขั้นตอนลงไปได้พอสมควรครับ

ขอบคุณนะครับ

Re: การอ่านข้อมูลแบบวน Loop
Posted: Tue Jan 24, 2012 6:04 pm
by snasui

มาตอบเสริมส่วนที่ยังไม่ได้คำตอบนะครับ
pepper_dog wrote:Set rs = จะทำการ copy ทั้งแถวตั้งแต่ A ที่ i ถึง L ที่ i ใช้คำสั่งอะไรครับ
สามารถใช้ Code นี้ได้ครับ
Code: Select all
set rs = .range("A" & i),.range("L" & i))
pepper_dog wrote:พี่ครับ
ตอนนี้ติดปัญหาตรงที่ช่อง combobox กรณีรหัสลูกค้า = 101 พอทำการเลือก จะได้ค่า = 5
แก้อย่างไรให้ได้ค่าตามที่เลือกครับ
รบกวนหน่อยครับ ติดตรงนี้มา 2 วันละครับ
ขอบคุณมากๆครับ
อันนี้คือไฟล์ไหนครับ ตอนนี้ทำงานถูกต้องแล้วยังครับ