Page 1 of 1

จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Fri May 23, 2014 4:19 pm
by djnotza
คือจะนำข้อมูลจากชีท2 และ3 มาเรียงในชีท1 คือแต่ละชีทข้อมูลอาจจะเพิ่มลดได้แล้วแต่ว่าโปรแกรมจะป้อนไปเท่าไหร่ครับ จะเขียนยังไงดีครับ

Re: จะต้องเขียนโค๊ดยังไงครับช่วยแนะนำให้ด้วยนะครับ

Posted: Fri May 23, 2014 4:56 pm
by snasui
:D Code ทีเขียนมาแล้วอยู่ใน Procedure ใด ติดขัดบรรทัดใดครับ

อ่านกฎการใช้บอร์ดข้อ 5 ด้านบนประกอบด้วยครับ :roll:

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Fri May 23, 2014 10:04 pm
by djnotza
คือ ต้องการ เคลียร์ข้อมูลในหน้าแรกก่อน range(x,y).clearcontents
จากนั้นก็ไปวนลูปอ่านมาจากหน้า 1 เฟส ด้วยลูป Do while....Loop
ในคอลัมน์ G1 ลงไปเรื่อยๆจนกว่าจะพบช่องว่าง
ถ้าพบแล้วก็เลิกอ่าน ให้ไปอ่านที่ชีท 3 เพสต่อ โดยเริ่มจาก L1 ลงไปเรื่อยๆ
การอ่านค่ามาใส่จะใช้โค้ดแบบนี้ range(a,b).value = range(x,y).value

แต่คือผมพึ่งหัดทำ เลยไม่รู้ว่าจะเริ่มต้นยังไงดี ส่วนตัวปุ่ม 1 เฟส กับ 3เฟส ผมเปิดจากหนังสือช่วยเอา จนเหลือมาติดตรงนี้อ่าครับ
มีคนแนะนำให้ลองสร้างปุ่มเคลียแล้วนำข้อมุลมาลง แต่ผมไม่รู้จะเริ่มต้นยังไงครับ

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Fri May 23, 2014 10:13 pm
by djnotza
คือประมาณว่า เอาค่าที่โปรแกรมคำนวนได้ในหน้า1เฟส และ 3เฟส มาเรียงใส่หน้าแรกตามหัวข้ออะครับ

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Fri May 23, 2014 10:22 pm
by snasui
:D ควรตอบในสิ่งที่ผมถามก่อนเพื่อจะได้เข้าถึงปัญหาโดยไว Code จะต้องเขียนมาเองก่อน ติดตรงไหนแล้วค่อยถามกันครับ :ard:
snasui wrote: Code ทีเขียนมาแล้วอยู่ใน Procedure ใด ติดขัดบรรทัดใดครับ
คำว่า "อ่าครับ", "อ่ะครับ" ให้ใช้ครับว่า "ครับ" แทนครับ

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Fri May 23, 2014 11:20 pm
by djnotza
ผมลองเขียนใส่ปุ่มแบบนี้ครับ
Sub Button5_Click()
For i = 2 To 25
If Cells(i + 1, 1).Value > 0 Then
Sheets("สูตรการคำนวน 1 เฟส").Range("'สูตรการคำนวน 1 เฟส'!$G$2:'สูตรการคำนวน 1 เฟส'!$G$25").Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("โปรแกรมและตารางแสดงผล!$K$4").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
Sheets("สูตรการคำนวน 3 เฟส").Range("'สูตรการคำนวน 3 เฟส'!$L$2:'สูตรการคำนวน 3 เฟส'!$L$25").Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("โปรแกรมและตารางแสดงผล!$K$4").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
End If
Next i
Application.CutCopyMode = False
End Sub

ถ้าสร้างปุ่มที่หน้า โปรแกรมและตารางแสดงผล โปรแกรมจะไม่คำนวนครับ (Button7)หน้า1
แต่ถ้าสร้างที่หน้า สูตรการคำนวน 1 เฟส โปรแกรมถึงจะคำนวนครับ (Button8)หน้า2
และถ้าใช้โค๊ดนี้ ข้อมุล สูตรการคำนวน 1 เฟส จะหายไปจะได้ สูตรการคำนวน 3 เฟสมาแทนครับ

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Sat May 24, 2014 12:13 am
by snasui
:D ตัวอย่าง Code ตามด้านล่างครับ

ให้คลุมเซลล์ว่างในชีท โปรแกรมและตารางแสดงผล คอลัมน์ K แล้วกดแป้น Delete ทิ้งไปก่อน

การ Copy เอาค่าว่างที่ได้จากสูตรมาวางด้วยจะทำให้เซลล์นั้นไม่เป็นเซลล์ว่างจริง ๆ การนำค่าใด ๆ มาวางต่อท้ายเซลล์ที่มีข้อมูลจะต้องเขียน Code Loop เรื่อยไป ทำให้เป็นภาระกับโปรแกรม

เมื่อลบค่าว่างที่ไม่ว่างจริงทิ้งไปแล้วค่อย Run Code ด้านล่าง ซึ่งเขียนให้เลือกเฉพาะเซลล์ที่มีข้อมูลมาวางเท่านั้น

สำหรับการวาง Code ในกล่องความเห็นนี้ควรโพสต์ให้แสดงเป็น Code เพื่อสะดวกในการอ่านและการ Copy ไปทดสอบ ดูตัวอย่างจาก Link นี้ครับ viewtopic.php?f=3&t=1187

Code: Select all

Sub Button7_Click()
    Dim lng1 As Long, lng2 As Long
    With Application
        lng1 = .CountIf(Sheets("สูตรการคำนวน 1 เฟส").Range("G2:G25"), "*?")
        lng2 = .CountIf(Sheets("สูตรการคำนวน 3 เฟส").Range("L2:L25"), "*?")
    End With
    Sheets("สูตรการคำนวน 1 เฟส").Range("G2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K4").End(xlDown) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("L2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K4").End(xlDown) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Sat May 24, 2014 12:16 pm
by djnotza
ผมลองเขียนดูแล้วครับ ถ้าใส่

Code: Select all

Sub Button7_Click()
    Dim lng1 As Long, lng2 As Long
    With Application
        lng1 = .CountIf(Sheets("สูตรการคำนวน 1 เฟส").Range("G2:G25"), "*?")
        lng2 = .CountIf(Sheets("สูตรการคำนวน 3 เฟส").Range("L2:L25"), "*?")
    End With
    Sheets("สูตรการคำนวน 1 เฟส").Range("G2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K4").End(xlDown) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("L2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K4").End(xlDown) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub
จะได้ค่าของหน้า 3 เฟส แต่ถ้าลบโค๊ดนี้ออก

Code: Select all

Sub Button7_Click()
    Dim lng1 As Long, lng2 As Long
    With Application
        lng1 = .CountIf(Sheets("สูตรการคำนวน 1 เฟส").Range("G2:G25"), "*?")
        lng2 = .CountIf(Sheets("สูตรการคำนวน 3 เฟส").Range("L2:L25"), "*?")
    End With
    Sheets("สูตรการคำนวน 1 เฟส").Range("G2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K4").End(xlDown) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub
จะได้ค่าของหน้า 1เฟสครับอาจารย์
และถ้าเขียน

Code: Select all

Sheets("โปรแกรมและตารางแสดงผล").Range("K4").End(xlDown) _
        .Offset(1, 0).PasteSpecial xlPasteValues

ผลจะแสดงด้านล่างคำว่ารวมครับ ผมเลยลองเปลี่ยนจาก K4 เป็น K1

Code: Select all

Sub Button7_Click()
    Dim lng1 As Long, lng2 As Long
    With Application
        lng1 = .CountIf(Sheets("สูตรการคำนวน 1 เฟส").Range("G2:G25"), "*?")
        lng2 = .CountIf(Sheets("สูตรการคำนวน 3 เฟส").Range("L2:L25"), "*?")
    End With
    Sheets("สูตรการคำนวน 1 เฟส").Range("G2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K1").End(xlDown) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("L2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K1").End(xlDown) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub
จึงได้คำตอบมาตอบในช่อง K4 ครับ
แต่ยังติดเรื่องผลที่ได้ครับ มันเหมือนต้องเลือกว่าจะแสดง 1 เฟส หรือ3 เฟสอย่างเดียวครับ

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Sat May 24, 2014 12:31 pm
by snasui
:D Code เดิมอยู่ที่่สมมุติฐานว่าเป็นการเขียน Code โดยมีข้อมูลอยู่ที่ K4 เสมอ

แต่หากว่าเริ่มต้นคือ K4 เป็นค่าว่าง สามารถใช้ Code ด้านล่างเพื่อให้เริ่มวางข้อมูลที่ K4 ซึ่งผมปรับมาให้เฉพาะที่ต้องเปลี่ยนครับ

Code: Select all

'Other code
Sheets("สูตรการคำนวน 1 เฟส").Range("G2").Resize(lng1).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("K30").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
Sheets("สูตรการคำนวน 3 เฟส").Range("L2").Resize(lng2).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("K30").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
'Other code

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Sat May 24, 2014 12:50 pm
by djnotza
ขอบคุณครับ ได้แล้วครับ ขอบคุณมากๆครับอาจารย์ ผมงงกับการเขียนสูตรนี้มาหลายวัน ขอบคุณครับ ^^

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Sat May 24, 2014 9:38 pm
by djnotza
อาจารย์ครับผมลองเขียนสูตรไปจนครบแล้ว
ผมลองกดดู ถ้าเกิด1เฟสไม่ได้ป้อนข้อมูล หรือ 3เฟสไม่ได้ป้อนข้อมูล โปรแกรมจะรันไม่ผ่านครับ
ต้องดักเงื่อนไขอะไรเพิ่มหรอครับ

Code: Select all

Sub Button7_Click()
    Range("K4:K27").ClearContents
    Range("L4:L27").ClearContents
    Range("N4:N27").ClearContents
    Range("O4:O27").ClearContents
    Range("P4:P27").ClearContents
    Range("R4:R27").ClearContents
    Range("S4:S27").ClearContents
    Range("T4:T27").ClearContents
    Range("U4:U27").ClearContents
    Range("V4:V27").ClearContents
    Dim lng1 As Long, lng2 As Long
    With Application
        lng1 = .CountIf(Sheets("สูตรการคำนวน 1 เฟส").Range("G2:G25"), "*?")
        lng2 = .CountIf(Sheets("สูตรการคำนวน 3 เฟส").Range("L2:L25"), "*?")
    End With

    
    Sheets("สูตรการคำนวน 1 เฟส").Range("G2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("L2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("K27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
        
    Sheets("สูตรการคำนวน 1 เฟส").Range("L2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("L27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("Q2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("L27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues

    Sheets("สูตรการคำนวน 1 เฟส").Range("J2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("N27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("R2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("N27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
 
     Sheets("สูตรการคำนวน 1 เฟส").Range("O2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("O27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("U2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("O27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
 
     Sheets("สูตรการคำนวน 1 เฟส").Range("P2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("P27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("V2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("P27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
 
     Sheets("สูตรการคำนวน 1 เฟส").Range("G2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("R27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("L2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("R27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
 
     Sheets("สูตรการคำนวน 1 เฟส").Range("Q2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("S27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("W2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("S27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
 
     Sheets("สูตรการคำนวน 1 เฟส").Range("R2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("T27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("X2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("T27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
 
     Sheets("สูตรการคำนวน 1 เฟส").Range("S2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("U27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("Y2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("U27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
 
     Sheets("สูตรการคำนวน 1 เฟส").Range("T2").Resize(lng1).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("V27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("สูตรการคำนวน 3 เฟส").Range("Z2").Resize(lng2).Copy
    Sheets("โปรแกรมและตารางแสดงผล").Range("V27").End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
 
    Application.CutCopyMode = False
End Sub

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Sun May 25, 2014 6:54 am
by snasui
:D เราสามารถดักค่าตัวแปร lng1, lng2 ที่ใช้ตรวจสอบว่ามีข้อมูลหรือไม่ หากมีข้อมูล ค่าจะมากกว่า 0 เสมอ และเมื่อค่ามากกว่า 0 ก็ให้ทำงานต่อ

ตัวอย่างตาม Code ด้านล่างครับ

Code: Select all

'other code
With Application
    lng1 = .CountIf(Sheets("สูตรการคำนวน 1 เฟส").Range("G2:G25"), "*?")
    lng2 = .CountIf(Sheets("สูตรการคำนวน 3 เฟส").Range("L2:L25"), "*?")
End With

If lng1 > 0 Then
Sheets("สูตรการคำนวน 1 เฟส").Range("G2").Resize(lng1).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("K27").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
 Sheets("สูตรการคำนวน 1 เฟส").Range("L2").Resize(lng1).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("L27").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
Sheets("สูตรการคำนวน 1 เฟส").Range("J2").Resize(lng1).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("N27").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
Sheets("สูตรการคำนวน 1 เฟส").Range("O2").Resize(lng1).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("O27").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
'other code
End If

If lng2 > 0 Then
Sheets("สูตรการคำนวน 3 เฟส").Range("L2").Resize(lng2).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("K27").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
Sheets("สูตรการคำนวน 3 เฟส").Range("Q2").Resize(lng2).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("L27").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
Sheets("สูตรการคำนวน 3 เฟส").Range("R2").Resize(lng2).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("N27").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
Sheets("สูตรการคำนวน 3 เฟส").Range("U2").Resize(lng2).Copy
Sheets("โปรแกรมและตารางแสดงผล").Range("O27").End(xlUp) _
    .Offset(1, 0).PasteSpecial xlPasteValues
'other code
End If

Re: จะเรียงข้อมูลจากสองชีทมาใส่ชีทเดียว ต้องทำยังไงครับ

Posted: Sun May 25, 2014 11:01 am
by djnotza
ได้แล้วครับ ขอบคุณครับอาจารย์