Page 1 of 1

[VBA] Copy by Button

Posted: Tue Jul 09, 2013 2:13 pm
by poipoi
เรียนอาจารย์ทุกท่านครับ

จากไฟล์แนบครับ มีปัญหาเกี่ยวกับ setup code ให้ทำการ copy โดยใช้ Button Controls ครับ

โดนที่ผมต้องการให้มัน copy ที่ B3:D9 โดยเงื่อนไขคือ ใน B2 จะต้องมีข้อความอยู่ครับ

ในเบื้องต้นผมได้ลองเขียนให้มัน copy ได้ แต่มันจะต้องไปกำหนดที่ B2 ตายตัวครับ

เพราะว่าในอนาคตอาจจะมีการ เพิ่ม โดยการ copy ตารางเหล่านั้นครับ

ปัญหาคือ ผมต้องการเพียง 1 กลุ่มชุดคำสั่งที่จะสามมรถสั่งทำงานในทุกตารางได้โดยใช้แค่การ add sign macro เข้าไปครับ

เพราะเวลา copy ทั้งตาราง Button มันจะติดมาด้วยจะได้ไม่ต้อง as sign macro ให้มันใหม่ครับ

ขอบคุณครับ

หากมีปตรงไหนไม่เข้าใจรบกวนถามได้เลยครับ

Re: [VBA] Copy by Button

Posted: Tue Jul 09, 2013 6:18 pm
by snasui
:D การที่จะเขียน Code ให้ Dynamic ได้จะต้องทราบว่าเงื่อนไขมีอะไรบ้าง ช่วยแจ้งเงื่อนไขมาด้วยครับ

Re: [VBA] Copy by Button

Posted: Fri Jul 12, 2013 11:41 am
by poipoi
1. Button Click

เงื่อนไขคือสามารถ copy ตั้งแต่ Name 1 ที่ Column 11 จนถึง Country ที่ Column 17 ได้ครับโดยไม่สนใจว่าจะมีข้อมูลหรือไม่

ส่วนช่องอื่นก็ทำแบบเดียวกันครับ

คือสิ่งที่ผมทำต้องมานั่ง assign macro เองทุกตัวตามไฟล์แนบครับ

ฉะนั้นจึงอยากขอคำแนะนำจากอาจารย์ครับว่าพอจะมีทางย่อ code ได้หรือไม่ครับ

จากไฟล์แนบที่ Row 10 column C : D จะมี Button click อยู่ 2 อันครับ ลองกดดูได้ครับ

2. Upper Case

ในส่วนการทำ Upper case ที่ได้เคยถามอาจารย์ไปนั้น ผมต้องใส่ช่วงของ range เองจึงอยากถามอาจารย์ว่า

เราสามารถใช้ code เดียวได้หรือไม่ โดยเงื่อนไขคือต้องการให้มัน upper เฉพาะ cells ที่มีสีฟ้าครับ

Code: Select all

    For Each R In Range("B23:D28,B34:D39,B45:D50,B56:D61,B67:D72,B78:D83,B89:D94,B100:D105,B111:D116,B122:D127,B133:D138,B144:D149,B155:D160,F23:I28,F34:I39,F45:I50,F56:I61,F67:I72,F78:I83,F89:I94,F100:I105,F111:I116,F122:I127,F133:I138,F144:I149,F155:I160,C15")
        R = UCase(R)
    Next R
อันนี้คือที่ใช้อยู่ครับ เพราะว่าที่อยู่นั้นมันไม่คงที่มีเพิ่มได้เรื่อยๆครับจึงไม่อยากให้ให้มันอัพเดทได้เอง

3. Drop Down List

ที่ Column C:D Row 17 จะมี drop down สำหรับการเลือกประเทศอยู่ครับ

- ซึ่งมันไม่สามารถใช้ Scroll Mouse ในการเลื่อนขึ้นลงได้ครับ จึงอยากถามว่าพอมีทางไหนบ้างที่จะสามารถจัดการตรงส่วนนี้ได้

- จะมีทางไหนบ้างครับที่เวลาพิมพ์ตัวอักษาลงไปแล้วทั้งคำจะขึ้นมาเองเหมือนเวลาพิมพ์สูตรครับ

; เช่นประเทศ Thailand พิมพ์แค่ T หรือ Th ก็จะมี Thailand ขึ้นมาทั้งคำ ครับ

ขอบคุณครับ

Re: [VBA] Copy by Button

Posted: Fri Jul 12, 2013 9:02 pm
by snasui
:D ตัวอย่างการปรับ Code ให้เลือกเฉพาะสีฟ้าและปรับให้เป็นอักษรตัวใหญ่พร้อม Copyตามด้านล่างครับ

Code: Select all

Sub test()
    Dim rAll As Range, r As Range
    Dim blueRange As Range, bl As Range
    With Sheets("Addresses")
        Set rAll = .Range("a10", .Range("a" & Rows.Count) _
            .End(xlUp))
        Set rAll = Union(rAll, rAll.Offset(0, 4))
    End With
    For Each r In rAll
        If r.Value = "Search Key:" Then
            Set blueRange = r.Offset(1, 1).Resize(7, 3)
            For Each bl In blueRange
                bl = UCase(bl)
            Next bl
        End If
        blueRange.Copy
        'other code
    Next r
End Sub
สำหรับ Dropdown หากต้องการใช้ Scroll Mouse ต้องนำเมาส์ไปชี้ที่ Vertical Scroll Bar ก่อนแล้วค่อย Scroll Mouse ส่วนการคีย์อักษรบางตัวแล้วให้เลือกอักษรทีใกล้เคียงต้องพึ่ง VBA ซึ่งไม่ง่ายครับ

Re: [VBA] Copy by Button

Posted: Mon Jul 15, 2013 8:22 am
by poipoi
สำหรับ Drop down list และ Upper case สามารถใช้งานได้แล้วครับ ขอบคุณครับ

แต่ข้อที่หนึ่งผมยังคงต้องการคำแนะนำอยู่ครับเพราะใน module มันยาวมากๆเลยครับ

Re: [VBA] Copy by Button

Posted: Mon Jul 15, 2013 4:28 pm
by snasui
:D ผมตอบไปแล้วทุกข้อที่ถามมา ไม่ทราบว่าตามที่ตอบไปนั้นในส่วนของข้อ 1 ได้นำไปทดสอบแล้วหรือไม่ ติดขัดตรงไหนครับ :?:

Re: [VBA] Copy by Button

Posted: Mon Jul 15, 2013 4:44 pm
by poipoi
อ่อ สิ่งที่ต้อ
การในข้อ 1 นั้นคือเวลากด button แล้วให้ copy เฉพาะ address นั้นๆครับ

จาก code เหมือนจะไป copy address สุดท้ายเท่านั้นครับ

ขอบคุณครับ

Re: [VBA] Copy by Button

Posted: Mon Jul 15, 2013 4:57 pm
by snasui
snasui wrote:ตัวอย่างการปรับ Code ให้เลือกเฉพาะสีฟ้าและปรับให้เป็นอักษรตัวใหญ่พร้อม Copyตามด้านล่างครับ
:D ลองแนบไฟล์ที่ลองทำมาแล้วและช่วยอธิบายว่าต้องการคำตอบเป็นอย่างไร Code ที่ผมเขี่ยนไปนั้นผมเขียนไว้ชัดเจนแล้วว่าต้องการจะทำอะไร

ในส่วนของ 'other code คือ Code ทีคุณต้องเขียนการวางเอาเองครับ

Re: [VBA] Copy by Button

Posted: Mon Jul 15, 2013 5:55 pm
by poipoi
เรียนอาจารย์

Code: Select all

Sub copy_000()
    ActiveSheet.Range("B10").Select
    Selection.Offset(1, 0).Select
    Range(Selection, Selection.Offset(6, 0)).Select
    Selection.Copy
End Sub

Sub copy_001()
    ActiveSheet.Range("B22").Select
    Selection.Offset(1, 0).Select
    Range(Selection, Selection.Offset(6, 0)).Select
    Selection.Copy
End Sub

Sub copy_002()
    ActiveSheet.Range("F22").Select
    Selection.Offset(1, 0).Select
    Range(Selection, Selection.Offset(6, 0)).Select
    Selection.Copy
End Sub

Sub copy_003()
    ActiveSheet.Range("B33").Select
    Selection.Offset(1, 0).Select
    Range(Selection, Selection.Offset(6, 0)).Select
    Selection.Copy
End Sub

code ข้างต้นนี้คือ code ที่อบู่ในไฟล์แนบครับ

คือผมต้องรัน code ตัวนี้ตั้งแต่ 000 - 100 ก็คือต้องมีแบบนี้ถึง 100 ตัว

ผมจึงคิดว่ามันจะยาวไปครับ จึงอยากขอคำแนะนำจากอาจารย์ครับ

ขอบคุณครับ

Re: [VBA] Copy by Button

Posted: Mon Jul 15, 2013 6:15 pm
by snasui
:lol: กำลังจะวนมาที่เดิมครับ ผมตอบไปแล้วตามนี้ครับ
snasui wrote::D ตัวอย่างการปรับ Code ให้เลือกเฉพาะสีฟ้าและปรับให้เป็นอักษรตัวใหญ่พร้อม Copyตามด้านล่างครับ

Code: Select all

Sub test()
    Dim rAll As Range, r As Range
    Dim blueRange As Range, bl As Range
    With Sheets("Addresses")
        Set rAll = .Range("a10", .Range("a" & Rows.Count) _
            .End(xlUp))
        Set rAll = Union(rAll, rAll.Offset(0, 4))
    End With
    For Each r In rAll
        If r.Value = "Search Key:" Then
            Set blueRange = r.Offset(1, 1).Resize(7, 3)
            For Each bl In blueRange
                bl = UCase(bl)
            Next bl
        End If
        blueRange.Copy
        'other code
    Next r
End Sub
สำหรับ Dropdown หากต้องการใช้ Scroll Mouse ต้องนำเมาส์ไปชี้ที่ Vertical Scroll Bar ก่อนแล้วค่อย Scroll Mouse ส่วนการคีย์อักษรบางตัวแล้วให้เลือกอักษรทีใกล้เคียงต้องพึ่ง VBA ซึ่งไม่ง่ายครับ
ไม่ทราบว่าได้นำไปทดสอบแล้วหรือไม่ครับ อย่าลืมที่เขียนว่า 'other code คุณจะต้องเขียนเพิ่มเองว่าให้วางที่ไหนครับ

Re: [VBA] Copy by Button

Posted: Wed Jul 24, 2013 4:21 pm
by poipoi
จากการทดลองพบว่า มันจะไป copy เฉพาะ address สุดท้ายที่เดียวครับ

สิ่งที่ต้องการคือเวลาเราคลิกที่ address ไหนแล้วให้มันเลือกเฉพาะที่ address นั้นครับ

ผมต้องการให้มัน copy อย่างเดียวเพื่อที่จะเอาไปวางในระบบ เพราะเวลาเล็งแล้วคลุมเองมันค่อนข้างเสียเวลาครับ

จึงอยากจะขอคำแนะนำอาจารย์ครับว่าผมควรจะต้องแก้ตรงไหนบ้างครับ

ขอบคุณครับ

Re: [VBA] Copy by Button

Posted: Wed Jul 24, 2013 7:45 pm
by snasui
:D คุณได้ลอง Run ทีละ Step ด้วยการกด F8 แล้วซ้ำ ๆ แล้ววังเกตว่าเป็นการ Copy เฉพาะ Address สุดท้ายอย่างที่เข้าใจหรือไม่

Code ที่ผมเขียนไปนั้นเป็นการ Loop ให้ Copy ทุกพื้นที่ตามเงื่อนไข สิ่งที่คุณต้องเขียนเพิ่มคือการวางในทุกครั้งที่ Copy ครับ

Re: [VBA] Copy by Button

Posted: Thu Jul 25, 2013 10:32 am
by poipoi
เรียนอาจารย์ครับ

ผมได้ลอง run ด้วย F8 ดูแล้วครับสุดท้ายมันก็จะไป copy ที่ช่อง address สุดท้ายอยู่ดีครับ

แล้วจะเป็นไปได้ไหมหากจะแยก upper กับ copy ออกจากกัน (ให้เป็นคนละ Procedure)

ขอบคุณครับ

Re: [VBA] Copy by Button

Posted: Thu Jul 25, 2013 3:31 pm
by snasui
:lol: ผมยืนยันว่าเป็นการ Copy ทุกพื้นที่ตามที่เขียนไปด้านบน

กรณีที่ติดปัญหาจะต้องยก Code ที่นำไปปรับใช้แล้วติดปัญหามาถามกัน ไม่ควรแจ้งปัญหาเดิม ๆ ในแบบที่ไม่เห็นการนำไปปรับใช้

สำหรับการเขียน Code จะต้องปรับเองได้บ้าง ถ้าปรับเองไม่ได้ผมไม่แนะนำให้ใช้ Code ครับ

การแยกหน้าที่กันไม่ใช่ปัญหาในการใช้ VBA ครับ

Re: [VBA] Copy by Button

Posted: Fri Jul 26, 2013 1:12 pm
by poipoi
เรียนอาจารย์ครับ

ผมได้ลองพยายามแก้ไขโค้ดได้ตัวเองแล้วปรากฎว่า มันก้ยังงงไปส่วนสุดท้ายอยู่ดี

แล้วถ้าผมใช้ code แบบนี้ละครับ ??

Code: Select all

Sub test1()
Application.ScreenUpdating = False

Dim r1, r2, rAll, blue As Range
Dim r As Variant

Worksheets("Addresses").Select
    Set r1 = Range("a10", Range("a" & Rows.Count).End(xlUp))
    Set r2 = r1.Offset(0, 4)
    Set rAll = Union(r1, r2)

If  ********************

    For Each r In r1
        If r.Value = "Search Key:" Then
            Set blue = r.Offset(1, 1).Resize(7, 3)
                blue.Select
                Selection.Copy
        End If
    Next r
    
Else
    
    For Each r In r2
        If r.Value = "Search Key:" Then
            Set blue = r.Offset(1, 1).Resize(7, 3)
                blue.Select
                Selection.Copy
        End If
    Next r
    
End If

Application.ScreenUpdating = True
End Sub
ในโค้ดที่ดอกจันทร์เอาไว้ควรจะใส่เป็นอะไรดีครับ

แล้วพอดีผมลองอีกวิธีหนึ่งด้วยการ ให้ cursor ไปไว้ตรง Name 1 แล้วใช้ code ตามนีเครับ

Code: Select all

Sub MultiCopy()
Dim i As Variant

If ActiveCell.Column = 2 Then
    Range(ActiveCell.Offset(i * 11).Address(False, False) & ":" & Cells(ActiveCell.Row, ActiveCell.Column + 2).Offset(i * 11).Offset(6).Address(False, False)).Copy
Else
    Range(ActiveCell.Offset(i * 11).Address(False, False) & ":" & Cells(ActiveCell.Row, ActiveCell.Column + 3).Offset(i * 11).Offset(6).Address(False, False)).Copy
End If
End Sub


พอจะมีทางไหนครับที่ไม่ต้องให้เม้าไปจิ้มที่ name1 เสมอ

แล้วก็มีอีก 1 ปัญหาครับแต่ไม่ได้เกี่ยวข้องกับส่วนนี้ผมขออนูญาติไปเริ่มหัวข้อใหม่ครับ

ขอบคุณครับ

Re: [VBA] Copy by Button

Posted: Fri Jul 26, 2013 7:10 pm
by snasui
:D ควรไปถามต่อตามที่เขียนไว้ครับ [VBA] Looping range

Re: [VBA] Copy by Button

Posted: Sat Jul 27, 2013 1:11 am
by poipoi
รับทราบครับ

ขอบคุณครับ