:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
golfgall3
Member
Member
Posts: 25
Joined: Fri Jul 08, 2016 10:56 am

ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#1

Post by golfgall3 »

ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง
เป็นมือใหม่ครับเลยลองหัดเขียนดู เลยอยากจะขอคำแนะนำจากพี่ๆในนี้ครับ
ผมได้สร้าง sheet ขึ้นมาสองอัน คือ Data กับ Input ผมต้องการอยากจะดึงค่าที่เป็นตัวเลขจาก Input มาใส่ใน Data
โดยมีเงื่อนไขครับ
1.ถ้า Column H ใน Data เท่ากับ ค่าใน column A ใน Input ให้ดึงข้อมูลตัวเลขมา หรือ Copy ตัวเลขมา โดยให้ข้ามช่องที่เป็นสีเหลือง เนื่องจากผมจะใส่สูตรไว้ครับ
2.อยากให้ VBA สามารถอ้างอิง No1-5 ใน Raw ด้วยครับ


ตอนนี้ผมลองเขียนได้เพียงเท่านี้เอง T_T

Code: Select all

Sub atselect()
Dim itemno As Range
Worksheets("Data").Activate
    For Each itemno In Range("H2:H21")
    itemno.Select
        If ActiveCell = Sheets("Input").Range("A2") Then
            ActiveCell.Offset(0, -6).Value = Sheets("Input").Range("B2")
        Else
            ActiveCell.Offset(0, -6).Value = "NODATA"
        End If
    Next itemno
End Sub
รบกวนพี่ๆ แนะนำด้วยครับ
Attachments
Example VBA.xlsx
(14.39 KiB) Downloaded 24 times
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#2

Post by DhitiBank »

ลองแบบนี้ดูครับ

Code: Select all

Sub test()
    Dim iTemNo As Range, rColA As Range, lCount As Long, _
        rHeadNo1 As Range, rHeadNo2 As Range, rFind As Range, r As Range
    Set rHeadNo1 = ActiveSheet.Range("b1:f1")
    Set rHeadNo2 = Sheets("input").Range("b1:e1")
    Set rColA = Sheets("input").Range("a2:a9")
    For Each iTemNo In Range("h2:h21")
        lCount = Application.CountIf(rColA, iTemNo)
        If lCount > 0 Then
            lCount = Application.Match(iTemNo, rColA, 0) + 1
            For Each r In rHeadNo1
                Set rFind = rHeadNo2.Find(what:=r.Value)
                If Not rFind Is Nothing Then
                    r.Offset(iTemNo.Row - r.Row, 0).Value = _
                                rFind.Offset(lCount - 1, 0).Value
                Else
                    r.Offset(iTemNo.Row - r.Row, 0).Value = "NoData"
                End If
            Next r
        End If
    Next iTemNo
End Sub
golfgall3
Member
Member
Posts: 25
Joined: Fri Jul 08, 2016 10:56 am

Re: ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#3

Post by golfgall3 »

ขอบคุณครับ
อธิบาย การทำงานของ Code คร่าวๆ ได้ไหมครับเพื่อจะได้เป็นแนวทางและนำไปประยุกต์ต่อครับ

และถ้าจะเพิ่มปุ่มให้เพื่อให้ VBA รันที่หน้า Input ผมต้องใส่
Worksheets("Data").Activate ด้วยหรือไม่ครับ
golfgall3
Member
Member
Posts: 25
Joined: Fri Jul 08, 2016 10:56 am

Re: ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#4

Post by golfgall3 »

อยากทราบว่า คำสั่งชุดนี้มันมีหลักการคิดยังไงครับ

Code: Select all

If Not rFind Is Nothing Then
                    r.Offset(iTemNo.Row - r.Row, 0).Value = _
                                rFind.Offset(lCount - 1, 0).Value
                Else
                    r.Offset(iTemNo.Row - r.Row, 0).Value = "NoData"
                End If
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#5

Post by DhitiBank »

Code: Select all

Sub test()
    Dim iTemNo As Range, rColA As Range, lCount As Long, _
        rHeadNo1 As Range, rHeadNo2 As Range, rFind As Range, r As Range
     '~~>สร้างตัวแปรช่วงที่สนใจเพื่อเอามาอ้างอิงสะดวกครับ
    Set rHeadNo1 = ActiveSheet.Range("b1:f1")
    Set rHeadNo2 = Sheets("input").Range("b1:e1")
    Set rColA = Sheets("input").Range("a2:a9")
    '~~>เริ่มลูปจากการไล่ช่วง h2:h21 ทีละเซลล์โดยแทนด้วยตัวแปร iTemNo
    For Each iTemNo In Range("h2:h21")
        '~~> นับดูว่า iTemNo มีในช่วง rColA หรือไม่
        lCount = Application.CountIf(rColA, iTemNo)
        '~~> หากมีก็ให้รันคำสั่งต่อไปนี้ จะได้ลดเวลาการรันคำสั่ง
        '~~> ไม่ต้องไล่หาทุกค่าใน h2:h21 ครับ
        If lCount > 0 Then
            '~~> ดูว่าค่า iTemNo อยู่ในบรรทัดไหนใน rColA
            '~~> เพื่อเอามาใช่เลื่อนแกนในคำสั่ง Offset
            lCount = Application.Match(iTemNo, rColA, 0) + 1
            '~~> เริ่มลูปเพื่อตรวจหัวคอลัมน์ จะได้ดึงข้อมูล
            '~~> ในคอลัมน์ชื่อเดียวกันมาใส่ ผมใช้คำสั่ง Find คล้ายๆ กับ
            '~~> การกด ctrl+f ในเวิร์คชีทครับ
            For Each r In rHeadNo1
                Set rFind = rHeadNo2.Find(what:=r.Value)
                '~~> หากพบค่า r ใน rHeadNo2 ก็จะสามารถ
                '~~> เซ็ต rFind ได้ คือมันจะได้เป็น range ใดก็ตาม
                '~~> ใน rHeadNo2 แต่ถ้าหาไม่พบ rFind ก็จะไม่มีอะไรเลย
                '~~> คือ nothing ครับ... If ด้านล่างนี้เป็นปฏิเสธซ้อน
                '~~> ปฏิเสธ "ถ้า rFind ไม่ใช่ Nothing ก็ให้..."
                If Not rFind Is Nothing Then
                     '~~> คำสั่งจากนี้เป็นการเลื่อนแกนด้วย offset
                     '~~> ลองค่อยๆดูครับ ว่าเอาแถวอะไรลบอะไร
                     '~~> และเอาค่าที่ match ที่หาไว้ก่อนหน้านี้มาใช้
                    r.Offset(iTemNo.Row - r.Row, 0).Value = _
                                rFind.Offset(lCount - 1, 0).Value
                Else
                    r.Offset(iTemNo.Row - r.Row, 0).Value = "NoData"
                End If
            Next r
        End If
    Next iTemNo
End Sub
ลองกดปุ่ม F8 ให้รันทีละบรรทัดก็ได้ครับ อาจดูง่ายขึ้น ส่วนเรื่องการตั้งปุ่มที่ชีท Input ก็อาจเปลี่ยนโค้ดตรง ActiveSheet โดยอ้างชื่อชีทไปเลย จะได้ไม่ต้องสั่ง Activate ครับ (ตอนเขียนผมรันจากชีทแรก)
golfgall3
Member
Member
Posts: 25
Joined: Fri Jul 08, 2016 10:56 am

Re: ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#6

Post by golfgall3 »

ขอบคุณมากคับ ตอนนี้ผมลองไล่กด F8 ศึกษาดูแล้วคับ
ผมมาติดบันทัด

Code: Select all

CODE: SELECT ALL
If Not rFind Is Nothing Then
   r.Offset(iTemNo.Row - r.Row, 0).Value = _
   rFind.Offset(lCount - 1, 0).Value
Else
   r.Offset(iTemNo.Row - r.Row, 0).Value = "NoData"
End If
เช่น
สมมติ itemno = H4 ดังนั้น itemno.row = 4
ส่วน r.row = 1
ดังนั้น r.offset(itemno.row - r.row,0).value = _
จะเท่ากับ r.offset(3,0).value = emtry

และ rFind.offset(ICount-1,0).Value จะได้ค่าที่อยู่ในตาราง Input

ผมเข้าใจถูกต้องไหมคับ
ผมมีข้อสงสัยคับ
1.สัญลักษณ์ _ มีความหมายว่างอย่างไรคับ
2.r.Offset(iTemNo.Row - r.Row, 0).Value = _
rFind.Offset(lCount - 1, 0).Value
มีความสัมพันธ์กันยังไง เมื่อยู่ใน if not ... is nothing then
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#7

Post by snasui »

golfgall3 wrote:ขอบคุณมากคับ ตอนนี้ผมลองไล่กด F8 ศึกษาดูแล้วคับ
ผมมาติดบันทัด

Code: Select all

CODE: SELECT ALL
If Not rFind Is Nothing Then
   r.Offset(iTemNo.Row - r.Row, 0).Value = _
   rFind.Offset(lCount - 1, 0).Value
Else
   r.Offset(iTemNo.Row - r.Row, 0).Value = "NoData"
End If
เช่น
สมมติ itemno = H4 ดังนั้น itemno.row = 4
ส่วน r.row = 1
ดังนั้น r.offset(itemno.row - r.row,0).value = _
จะเท่ากับ r.offset(3,0).value = emtry

และ rFind.offset(ICount-1,0).Value จะได้ค่าที่อยู่ในตาราง Input

ผมเข้าใจถูกต้องไหมคับ
ผมมีข้อสงสัยคับ
1.สัญลักษณ์ _ มีความหมายว่างอย่างไรคับ
2.r.Offset(iTemNo.Row - r.Row, 0).Value = _
rFind.Offset(lCount - 1, 0).Value
มีความสัมพันธ์กันยังไง เมื่อยู่ใน if not ... is nothing then
:D ช่วยโพสต์ใหม่ให้เป็นไปตามกฎการใช้บอร์ดข้อ 1 ด้านบนครับ :roll:
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#9

Post by DhitiBank »

golfgall3 wrote:ผมมาติดบันทัด

Code: Select all

If Not rFind Is Nothing Then
   r.Offset(iTemNo.Row - r.Row, 0).Value = _
   rFind.Offset(lCount - 1, 0).Value
Else
   r.Offset(iTemNo.Row - r.Row, 0).Value = "NoData"
End If
เช่น
สมมติ itemno = H4 ดังนั้น itemno.row = 4
ส่วน r.row = 1
ดังนั้น r.offset(itemno.row - r.row,0).value = _
จะเท่ากับ r.offset(3,0).value = emtry

และ rFind.offset(ICount-1,0).Value จะได้ค่าที่อยู่ในตาราง Input
จริงๆ แล้ว

Code: Select all

r.Offset(iTemNo.Row - r.Row, 0).Value = _
   rFind.Offset(lCount - 1, 0).Value
มันก็คือ r.Offset(iTemNo.Row - r.Row, 0).Value = rFind.Offset(lCount - 1, 0).Value ครับ เป็นการสั่ง r.Offset(.....).value ให้มีค่าเท่ากับ rFind.offset(.....).value การใช้เครื่องหมาย underscore _ เพื่อตัดบรรทัดยาวๆ มองลำบากให้ขึ้นบรรทัดใหม่ โดยที่โปรแกรมถือว่าเป็นบรรทัดเดียวกันครับ
golfgall3
Member
Member
Posts: 25
Joined: Fri Jul 08, 2016 10:56 am

Re: ขอคำปรึกษาเรื่องการเขียน VBA ดึงข้อมูลจากอีก Sheet หนึ่ง

#10

Post by golfgall3 »

ขอบคุณมากครับ ตอนนี้ Code ใช้ได้ดีมากครับ
Post Reply