Page 1 of 1

การอ่านข้อมูลแบบวน Loop

Posted: Mon Jan 23, 2012 10:36 am
by pepper_dog
พี่ครับ :D วันนี้่ขอรบกวนแต่เช้าหน่อยครับ

ผมอยากทราบวิธีการอ่านค่าข้อมูล 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
:D สามารถใช้สูตรได้เลยครับ

ว่าแต่ชีท 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
:D สอบถามเพิ่มเติมครับผม

ถ้าใช้สูตรเวลาเลือก List รหัสลูกค้า ใช้สูตรยังงัยครับผม เผื่อเป็นทางเลือกที่ดีกว่าครับ

Re: การอ่านข้อมูลแบบวน Loop

Posted: Mon Jan 23, 2012 11:52 am
by bank9597
:lol: สำหรับความคิดผมแล้ว การใช้สูตรคือสิ่งที่เหมาะสมที่สุดในการใช้งานเอ็กเซลล์ครับ และคิดว่าอาจารย์คนควนก็เห็นเช่นเดียวกัน เพราะว่าสูตรเราสามารถแก้ไขปัญหาได้เองบ้าง แต่ 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 ผมค่อยมาตอบให้ในกระทู้ถัดไป ตามสะดวกครับ :lol:

Re: การอ่านข้อมูลแบบวน Loop

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

Re: การอ่านข้อมูลแบบวน Loop

Posted: Tue Jan 24, 2012 10:36 am
by pepper_dog
:D พี่ครับ ตอนนี้ผมหาวิธีการอ่าน แบบวน 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
:D ผมได้ลองทำไว้ให้ครับ โดยสร้างปุ่มใหม่มา 1 ปุ่มไว้ดึงข้อมูลมาแสดง
ลองศึกษาตามไฟล์แนบครับ

Re: การอ่านข้อมูลแบบวน Loop

Posted: Tue Jan 24, 2012 10:51 am
by pepper_dog
ขอบคุณมากครับผม :D

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
:D อันนี้พูดถึงไฟล์ที่ผมแนบไปให้ล่าสุด หรือไฟล์หรือครับ :tt:

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
:D คุณ pepper_dog ลองทำตามนี้ไฟล์แนบได้ไหมครับ ผมคิดว่าน่าจะง่ายกว่า

ส่วนใน Combobox ผมยังหาสาเหตุไม่เจอ ต้องเรียนถามอาจารย์อีกครั้งน่ะครับ :D

Re: การอ่านข้อมูลแบบวน Loop

Posted: Tue Jan 24, 2012 3:43 pm
by pepper_dog
:D ขอถามเพิ่มเติมครับ

ถ้าที่ data validation

source สามารถใช้ สูตร offset ได้หรือไม่ครับ ผมลองแล้วได้แค่ cell เดียวครับ

ตามตัวอย่างไฟล์นะครับ

ขอบคุณครับ

Re: การอ่านข้อมูลแบบวน Loop

Posted: Tue Jan 24, 2012 3:55 pm
by bank9597
:D ทำได้ครับ

ที่ Range Name ชื่อ Code เปลี่ยนในแถบสูตรเป็น =OFFSET(paymentbycus!$O$2,0,0,COUNTA(paymentbycus!$O:$O)-1)

ก็จะได้ Range Name แบบไดนามิค :D

Re: การอ่านข้อมูลแบบวน Loop

Posted: Tue Jan 24, 2012 4:33 pm
by pepper_dog
:D โอเคเลยครับผม ลดขั้นตอนลงไปได้พอสมควรครับ :tt: ขอบคุณนะครับ :mrgreen:

Re: การอ่านข้อมูลแบบวน Loop

Posted: Tue Jan 24, 2012 6:04 pm
by snasui
:D มาตอบเสริมส่วนที่ยังไม่ได้คำตอบนะครับ
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 วันละครับ

ขอบคุณมากๆครับ
อันนี้คือไฟล์ไหนครับ ตอนนี้ทำงานถูกต้องแล้วยังครับ