Page 1 of 1

ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 11:01 am
by zern
ปัญหา QSR.jpg
ปัญหา QSR.jpg (76.88 KiB) Viewed 461 times

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 1:21 pm
by DhitiBank
ก็ต้องตามกฎข้อ 5 ด้านบนครับ หากเป็น VBA ต้องลองเขียนมาเองก่อน :)

ลองดูตัวอย่างคร่าวๆ ที่ลิ้งค์ด้านล่างครับ
Store combo box's value to cell

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 1:58 pm
by zern
ถ้าดูจากลิงค์ที่คุณ Dhitibank ให้มาแล้ว คิดว่าน่าจะเป็น
Sub HtmlSelect()
sheets("Sheet2").Range("A1") = Shapes.Range(Array("HTMLSelect1")).Value
End Sub
แต่มันไม่ใช่ คือไม่รู้ว่าการเลือกค่าในกล่องเหล่านี้ต้องใช้คำสั่งอะไรน่ะครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 2:50 pm
by DhitiBank
ลองแนบไฟล์ที่มี object และโค้ดที่ได้ลองเขียนแล้วมาในกระทู้เลยครับ อาจารย์และเพื่อนๆ จะได้ช่วยแนะนำได้สะดวกครับ :)

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 3:18 pm
by zern
แนบไฟล์ .xlsm เพิ่มให้ทั้่งในโพสนี้แล้วนะครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 8:27 pm
by snasui
:D ตัวอย่าง Code ครับ

Code: Select all

Sub HtmlSelect()
    'Sheets("Sheet2").Range("A1") = Shapes.Range(Array("HTMLSelect1")).Value
    Dim obj As Object, i As Integer, j As Integer
    Dim a As Variant, b As Variant, c(0, 2) As Variant
    With Sheets(1)
        For Each obj In .Shapes
            If Left(obj.Name, 4) = "HTML" Then
                a = Split(obj.DrawingObject.Object.DisplayValues, ";")
                b = Split(obj.DrawingObject.Object.Selected, ";")
                i = Application.Match("True", b, 0) - 1
                With Sheets("Sheet2")
                    If j = 0 Then
                        If .Range("a1") = "" Then
                            .Range("a1").Value = a(i)
                        Else
                            .Range("a" & .Rows.Count).End(xlUp).Offset(1, 0).Value = a(i)
                        End If
                    Else
                        c(0, j - 1) = a(i)
                    End If
                End With
                j = j + 1
            End If
        Next obj
        With Sheets("sheet2")
            .Range("a" & .Rows.Count).End(xlUp).Offset(1, 0).Resize(1, 3).Value = c
        End With
    End With
End Sub
กรณีนี้จะเห็นว่ายุ่งยากกว่าการใช้ ComboBox ที่เป็น Form Control หรือ ActiveX Control

ช่วยตอบว่านำมาจากที่ใดและเหตุใดจึงใช้ Control แบบนี้โดยไม่เลือกใช้ Form Control หรือ ActiveX Control ครับ :?:

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 10:00 pm
by zern
เอามาจกโปรแกรมการสั่งของของบริษัทน่ะครับ ผมต้องการแปลงข้อมูลให้อยู่ในรูปเอกเซล และนำไปใช้ต่อไป ทีนี้มัน export ออกมาได้แค่ pdf กับ html ผมเลยเลือก html แล้วนำมาเปิดโดยใช้ vba และดึงข้อมูลมา
ซึ่งข้อมูลก็มีครบถ้วนทุกอย่างที่ผมต้องการ ขาดแค่ ชื่อสาขา และวันที่ส่งสินค้าที่อยู่ในกล่องแบบนั้น ผมอยากให้มันอัตโนมัติเลยโดยคนไม่ต้องทำการคีย์ข้อมูลใดๆเพิ่มทั้งสิ้น จึงมาสอบถามดูว่ามีวิธีอื่นหรือไม่น่ะครับ

ว่าแต่ไม่คิดเลยว่าโค้ดจะซับซ้อนขนาดนี้ มีโค้ดที่ไม่เคยใช้ตั้งเยอะ พรุ่งนี้จะลองไปทำดูครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 10:09 pm
by zern
ว่าแต่ไม่มีวิธีอื่นที่ซับซ้อนน้อยกว่านี้แล้วใช่หรือเปล่าครับ เห็นโค้ดก็แอบหนักใจแล้ว

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Thu Jul 07, 2016 10:31 pm
by snasui
:D หลักการตอบปัญหาโดยทั่วไป จะตอบที่ง่าย กระชับ รัดกุมและยืดหยุ่น เท่าที่คิดได้ขณะนั้นอยู่แล้วในทุก ๆ กระดานถามตอบไม่ใช่เฉพาะที่นี่ครับ :mrgreen:

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Fri Jul 08, 2016 9:21 am
by DhitiBank
:shock: นี่มัน object อะไรนั่น อาจารย์ครับ ถ้าจะหาคำอธิบายโค้ดเกี่ยวกับ object พวกนี้ ต้องหาอ่านจากไหนครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Fri Jul 08, 2016 11:00 am
by zern

Code: Select all

Sub HtmlSelect()
    Dim obj As Object, i As Integer, j As Integer
    Dim a As Variant, b As Variant, c(0, 2) As Variant
    With Sheets(1)
        For Each obj In .Shapes
            If Left(obj.Name, 4) = "HTML" Then
                a = Split(obj.DrawingObject.Object.DisplayValues, ";")                      '1 Display value if Data is value Q:What is ";"
                b = Split(obj.DrawingObject.Object.Selected, ";")                           '2 Detect Object is Selected or Data value Q:What is .selected
                i = Application.Match("True", b, 0) - 1                                     '3 Convert True to 0 false to 1 Q:Why match false not error
                With Sheets("Sheet2")
                    If j = 0 Then                                                           '4 If J is unidentify represent to 0, right?
                        'If .Range("a1") = "" Then                                          'not use
                        .Range("a1").Value = a(i)                                           '5 a is array in object 1, right
                        'Else
                            '.Range("a" & .Rows.Count).End(xlUp).Offset(1, 0).Value = a(i)  'not use
                        'End If
                    Else
                        c(0, j - 1) = a(i)
                    End If
                End With
                j = j + 1
            End If
        Next obj
        With Sheets("sheet2")
            .Range("a" & .Rows.Count).End(xlUp).Offset(1, 0).Resize(1, 3).Value = c
        End With
    End With
End Sub
ผมอ่านโค้ดแล้วสรุปมาได้ดังนี้น่ะครับ ใน code ผม note ไว้เป็นภาษาอังกฤษแบบงูๆปลาๆ ในบรรทัดที่สงสัย ผมเลยขออธิบายเป็นไทยไว้ตรงข้างล่างด้วยน่ะครับ
1 ให้แสดงค่า ถ้า object นั้นเป็นแบบ value Q:";" หมายถึงอะไร
2 ตรวจสอบว่า obj นั้นเป็นแบบ selected หรือเปล่า Q: โค้ด .selected มีความหมายว่าอะไร
3 เปลี่ยนค่า b จาก true เป็น 0 และ fase เป็น 1 Q:ทำไม match false แล้วไม่ error แถม -1 แล้วยังกลายเป็น 1 อีก
4 ถ้า J ไม่ได้ระบุค่า ให้แสดงค่า 0 ใช่หรือเปล่า
5 a เป็น array ของ object 1 ใช่หรือเปล่า
และมีบาง code ที่ตัดออกได้ เพราะผมไม่ได้จะเก็บข้อมูลเรียงลงมาน่ะครับ ทำให้โค้ดสั้นลงได้อีกนิด :D
หลังจากข้อ 5 แล้วผมก็ไม่รู้เรื่องจนยังนึกไม่ออกแล้วน่ะครับว่าจะถามยังไงดี :roll:

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Fri Jul 08, 2016 4:40 pm
by snasui
:D ที่แปลมานั้นไม่ถูกต้องครับ

หากจะใช้ Code ลักษณะนี้ซึ่งผมถือว่าเป็นเชิงลึก จะต้องผ่านการศึกษา Object Oriented Programming ของ Excel มาอย่างดี ต้องทราบ Data Type, Array, Function ของ VBA, Function ของ Excel ที่สามารถใช้ใน VBA เป็นต้น

หลักการของ Code นั้นเป็นการดูว่าจากตัวเลือกทั้งหมดที่สามารถมีได้ใน Object นั้นๆ ปัจจุบันรายการใดถูกเลือกอยู่ก็ให้นำออกมาใช้งาน

สำหรับการ Loop ก็เพื่อให้เข้าถึง Object ทุกตัวที่มีชื่อขึ้นต้นว่า "HTML" ครับ

เนื่องจากรายการใน Object เหล่านี้ไม่ได้แยกต่างหากจากกัน แต่เป็นรายการที่เป็นข้อความเดียวแต่แบ่งด้วยเครื่องหมาย ";" จึงต้องแบ่งรายการทั้งหมดให้แยกออกจากกันด้วยเครื่องหมาย ";" แล้วนำไปเก็บในตัวแปร

ท่อนใดของข้อความที่นำมาแสดงจะถูกระบุว่าท่อนนั้นเป็น True เราจึงต้องตรวจสอบว่า True อยู่ในตำแหน่งที่เท่าใดของชุดข้อมูลทั้งหมด แล้วนำลำดับนั้นในตัวแปรมาแสดง เช่นนี้ครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Fri Jul 08, 2016 6:42 pm
by snasui
DhitiBank wrote: :shock: นี่มัน object อะไรนั่น อาจารย์ครับ ถ้าจะหาคำอธิบายโค้ดเกี่ยวกับ object พวกนี้ ต้องหาอ่านจากไหนครับ

:D เป็น Object ของ HTML ครับ กรณีนี้ผมเขียนโดยอาศัย Property Window, Locals Window มาช่วยแสดง Properties ของ Object เพื่อให้ทราบว่ามี Properties อะไร เป็น Data Type แบบใด และจะเขียนเพื่อดึงค่าออกมาแสดงได้อย่างไรครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Sat Jul 09, 2016 5:17 pm
by DhitiBank
snasui wrote: :D เป็น Object ของ HTML ครับ กรณีนี้ผมเขียนโดยอาศัย Property Window, Locals Window มาช่วยแสดง Properties ของ Object เพื่อให้ทราบว่ามี Properties อะไร เป็น Data Type แบบใด และจะเขียนเพื่อดึงค่าออกมาแสดงได้อย่างไรครับ
:o ขอบคุณครับ เอาเป็นว่าผมพยายามใช้ฟอร์มที่โปรแกรมให้มาแบบเดิมดีกว่า แค่นี้ผมก็คิดว่ายากมากแล้วนะ :flw:

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Mon Jul 11, 2016 10:41 am
by zern
คงต้องฝึกวิชาอื่นอีกเยอะก่อนถึงจะเข้าใจได้สินะครับ ขอบคุณมากครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Mon Aug 01, 2016 5:11 pm
by zern
ขอกลับมาถามใหม่อีกรอบหน่อยครับ
1. If j = 0 Then
่j=0 เป็นการเช็คอะไรเหรอครับ เพราะผมไม่เจอการประกาศเลยว่า j คืออะไร เจอแต่ j as integer
2. c(0, j - 1) = a(i)
c(0, j - 1) มันคืออะไรเหรอครับ ผมไม่เจอการประกาศ c เช่นกัน เจอแต่ c(0, 2) as variant ไม่เข้าใจว่ามันมีความหมายยังไง
คือผมลองเพิ่ม object เข้าไปแล้วมัน debug น่ะครับ
ถ้าแก้สองโค้ดนี้ออกน่าจะเอาไปปรับใช้ในงานได้ ถึงแม้จะเขียนไม่ได้ แต่ก็พอจะแก้ไขเล็กๆน้อยๆได้น่ะครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Mon Aug 01, 2016 5:31 pm
by zern
ยังไม่รู้ความหมาย แต่พอจะแกะได้แล้วครับว่า ถ้าจะเพิ่ม object ก็ต้องเปลี่ยนเลขจาก
Resize(1, 2). เป็น Resize(1, 7). และ
c(0, 2) As Variant เป็น c(0, 7) As Variant
เป็นต้น

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Mon Aug 01, 2016 7:35 pm
by snasui
zern wrote:ขอกลับมาถามใหม่อีกรอบหน่อยครับ
1. If j = 0 Then
่j=0 เป็นการเช็คอะไรเหรอครับ เพราะผมไม่เจอการประกาศเลยว่า j คืออะไร เจอแต่ j as integer
2. c(0, j - 1) = a(i)
c(0, j - 1) มันคืออะไรเหรอครับ ผมไม่เจอการประกาศ c เช่นกัน เจอแต่ c(0, 2) as variant ไม่เข้าใจว่ามันมีความหมายยังไง
คือผมลองเพิ่ม object เข้าไปแล้วมัน debug น่ะครับ
ถ้าแก้สองโค้ดนี้ออกน่าจะเอาไปปรับใช้ในงานได้ ถึงแม้จะเขียนไม่ได้ แต่ก็พอจะแก้ไขเล็กๆน้อยๆได้น่ะครับ
:D ทุกตัวแปรประกาศตัวแปรไว้เรียบร้อยแล้วครับ

หากปรากฎอยู่ในส่วนของ Dim (ในส่วนที่แจ้งมาว่าไม่เข้าใจ) คือการประกาศตัวแปรทั้งสิ้น การประกาศตัวแปรเป็นการจองหน่วยความจำ เพื่อให้โปรแกรมใช้ Memory เท่าที่จำเป็น ตัวแปรแต่ละชนิดใช้ Memory ไม่เท่ากัน การไม่ประกาศตัวแปร ทุกตัวแปรจะเป็น Variant หากเป็นโปรแกรมขนาดใหญ่จะเกิดปัญหา Memory ไม่พอได้ครับ

ส่วนประกาศแล้วจะ Assign ค่าให้หรือไม่อยู่ที่ความจำเป็น กรณียังไม่ Assign ค่าใดให้ก็ต้องมาดูว่าเป็น DataType ใด การ Assign ค่าจะใช้เครื่องหมาย = โดยกำหนดให้ค่าตัวแปรเท่ากับค่าด้านขวาของตัวแปร

หาก DataType เป็น Integer เช่นที่ผมโพสต์ไป แสดงว่ามีค่าตั้งต้นที่ 0
หาก DataType เป็น String ค่าเริ่มต้นจะเป็น "" เช่นนี้เป็นต้น

ตามด้านบนตัวแปร c เป็น Array จึงประกาศเป็น Variant

Code เหล่านี้ไม่ง่ายนักเพราะไม่ได้เป็น Object ของ Excel อาจจะค้นหาตัวอย่างใน Google ได้น้อยหรืออาจจะไม่มีเลยก็เป็นได้ครับ

Re: ต้องการ copy ข้อมูลจาก field นี้ไปยังตารางเอกเซลด้วย VBA ต้องทำยังไงครับ

Posted: Tue Aug 02, 2016 11:24 am
by zern
หาก DataType เป็น Integer เช่นที่ผมโพสต์ไป แสดงว่ามีค่าตั้งต้นที่ 0
หาก DataType เป็น String ค่าเริ่มต้นจะเป็น "" เช่นนี้เป็นต้น
อ๋อ ผมก็เดาว่า j น่าจะเริ่มที่ 0 เพราะวิเคราะห์จากผลลัพธ์ที่ได้ ถ้างั้น j ก็น่าจะเป็นแค่การเช็คว่าจะวนลูปกี่รอบ
ใช่ครับเข้าใจยากมาก จะหาใน google ก็ไม่รู้เลยว่าสิ่งที่เจอมันคือสิ่งที่เรากำลังสงสัยหรือเปล่า
แต่ขอบคุณอาจารย์มากครับ ทำให้เห็นโลกของ excel กว้างขึ้นอีกเยอะเลย :shock: