: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 ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
March201711
Gold
Gold
Posts: 1047
Joined: Sat Mar 11, 2017 7:01 pm
Excel Ver: 2010, 365

ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#1

Post by March201711 »

ต้องการดึงข้อมูลที่ worksheet "Data" ในแต่ละ sheet มารวมไว้ที่ worksheet "SumData" มาต่อกันที่ column B3 แต่ติดปัญหา sheet1 มีแค่บรรทัดเดียวค่ะ

Code: Select all

 Sub Update()
'
' Update Macro
'

'
    Windows("Data.xlsx").Activate
    Sheets("Sheet2").Select
    Range("B3").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Range("H6").Select
    Windows("SumData.xlsm").Activate
    Range("B3").Select
    ActiveSheet.Paste
    Range("H5").Select
    Windows("Data.xlsx").Activate
    Range("H9").Select
    Windows("SumData.xlsm").Activate
    Range("I4").Select
    Windows("Data.xlsx").Activate
    Sheets("Sheet1").Select
    Range("B3:F3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("SumData.xlsm").Activate
    Range("H3").Select
End Sub
  
Attachments
Data.xlsx
(11.23 KiB) Downloaded 13 times
SumData.xlsm
(19.23 KiB) Downloaded 11 times
คำตอบที่ต้องการ.png
คำตอบที่ต้องการ.png (32.79 KiB) Viewed 238 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#2

Post by snasui »

:D ตัวอย่าง Code ครับ

Code: Select all

Sub test0()
    Dim sb As Workbook, rs As Range
    Dim tb As Workbook
    Dim sh As Worksheet
    
    Set sb = Workbooks("Data.xlsx")
    Set tb = ThisWorkbook
    For Each sh In sb.Worksheets
        Set rs = sh.Range("b3", sh.Range("b" & sh.Rows.Count).End(xlUp))
        With tb.Worksheets("SumAllData")
            With .Range("b" & .Rows.Count).End(xlUp).Offset(1, 0)
                .Resize(rs.Rows.Count, 5).Value = rs.Resize(, 5).Value
            End With
        End With
    Next sh
End Sub
March201711
Gold
Gold
Posts: 1047
Joined: Sat Mar 11, 2017 7:01 pm
Excel Ver: 2010, 365

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#3

Post by March201711 »

ถามต่อนิดนึงค่ะ

ถ้าใน worksheet "Data2" มี sheet เดียว ชื่อ sheet list แต่ sheet นี้ข้อมูลจะมาทับเพิ่มหรือลดทุกวัน บางวันมีแค่บรรทัดเดียว บางวันมี 10-20 บรรทัด ถ้าต้องดึงข้อมูลจาก sheet มาต่อที่ worksheet "SumData" มาต่อกันทุกวันต้องปรับสูตรยังไงคะ
ลอง record marco แล้วแต่อยากให้ code vba มีความยึดหยุ่นค่ะ อยากให้กำหนดว่าถ้าบรรทัดต่อจากข้อมูลเป็นค่าว่าง ไม่ให้ดึงข้อมูลมาค่ะ ขอบคุณค่ะ

Code: Select all

 Sub run()
'
' run Macro
'

'
    Windows("Data2.xlsx").Activate
    Range("B3").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Application.CutCopyMode = False
    Selection.Copy
    Windows("SumData2.xlsm").Activate
    Range("B3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("J6").Select
End Sub
Attachments
Data2.xlsx
(8.98 KiB) Downloaded 10 times
SumData2.xlsm
(20.6 KiB) Downloaded 10 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#4

Post by snasui »

:D มีชีตเดียวก็ใช้ Code เดิมได้ ไม่ทราบว่าได้ลองนำไปใช้แล้วหรือไม่ ถ้าลองใช้แล้วติดปัญหาตรงส่วนไหนครับ :?:
March201711
Gold
Gold
Posts: 1047
Joined: Sat Mar 11, 2017 7:01 pm
Excel Ver: 2010, 365

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#6

Post by March201711 »

อยากให้ copy ข้อมูลโดยดูที่ Column C ว่าอยู่เดือนไหน ให้เอา copy ทั้งบรรทัดไปวางไว้ที่ เดือนนั้น
เช่น column C3 เป็นวันที่ 2-5-23 เป็นเดือน 5 (high light สีเหลือง) โดยดูที่ cell D1 ให้ copy เอาข้อมูลทั้งบรรทัดไปวางที่ sheet Sum_05 ค่ะ ใน workbook เดียวกัน

Code: Select all

Sub test2()
    Dim sb As Workbook, rs As Range
    Dim tb As Workbook
    Dim sh As Worksheet
    
    Set sb = Workbooks("Data2.xlsx")
    Set tb = ThisWorkbook
    For Each sh In sb.Worksheets
        Set rs = sh.Range("b3", sh.Range("b" & sh.Rows.Count).End(xlUp))
        With tb.Worksheets("Sum_" & Format(Range("D1"), "mmyy"))
            With .Range("b" & .Rows.Count).End(xlUp).Offset(1, 0)
                .Resize(rs.Rows.Count, 5).Value = rs.Resize(, 5).Value
            End With
        End With
    Next sh
End Sub
Attachments
Run error.png
Run error.png (87.36 KiB) Viewed 202 times
SumData_bymonth.xlsm
(28.23 KiB) Downloaded 6 times
March201711
Gold
Gold
Posts: 1047
Joined: Sat Mar 11, 2017 7:01 pm
Excel Ver: 2010, 365

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#8

Post by March201711 »

อาจารย์คะ ถ้า file งานที่ทำเป็นอีก file นึงไม่ได้ใช้งานบน marco เป็นไฟล์งานที่กดปุ่ม marco ส่วนตัวของเราเอง ต้องปรับไฟล์งานหลักยังไงคะ
และอยากปรับเป้น module ไม่ใช้ private sub น่ะค่ะอาจารย์

Code: Select all

Sub Updates()
    Dim sb As Workbook, rs As Range
    Dim tb As Workbook
    Dim sh As Worksheet
    
    Set sb = Workbooks("Data2.xlsx")
    Set tb = ThisWorkbook
    For Each sh In sb.Worksheets
        Set rs = sh.Range("b3", sh.Range("b" & sh.Rows.Count).End(xlUp))
        With tb.Worksheets("Sum_" & Format(Range("D1"), "mmyy"))
            With .Range("b" & .Rows.Count).End(xlUp).Offset(1, 0)
                .Resize(rs.Rows.Count, 5).Value = rs.Resize(, 5).Value
            End With
        End With
    Next sh
End Sub
Attachments
Main_runsum.xlsm
(17.25 KiB) Downloaded 10 times
SumData_bymonth.xlsx
(16.16 KiB) Downloaded 8 times
Data2.xlsx
(9.2 KiB) Downloaded 8 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#9

Post by snasui »

:D ยังไม่เข้าใจประเด็นที่ติดปัญหาครับ

การใช้ Event กับไม่ใช้ Event คือสร้างปุ่มกดเอง ต่างกันตรงที่เขียน Code ไว้คนละตำแหน่ง ถ้าต้องการใช้ Event ก็ไปวาง Code ไว้ในชีตนั้น ๆ ถ้าต้องการสร้างปุ่มกดก็เขียน Code ไว้ใน Module ปกติ ไม่ทราบว่าติดปัญหาตรงไหน อย่างไรครับ :?:
March201711
Gold
Gold
Posts: 1047
Joined: Sat Mar 11, 2017 7:01 pm
Excel Ver: 2010, 365

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#10

Post by March201711 »

ชอบใช้แบบกดปุ่มมากกว่าค่ะ เพราะบางครั้ง ไปคลิกที่เซลล์อื่นมันจะขึ้น pop up msgbox ให้เอง คือความจริงจะมีไฟล์ส่วนตัวของตัวเองที่รัน marco เฉพาะทุกไฟล์งาน ส่วนไฟล์งานจะไม่ save run marco เพราะบางครั้ง error โค้ดมาร์โคหายบ่อยๆ ค่ะ จึงต้องสร้างไฟล์งานของตัวเองต่างหากไม่อยากกระทบไฟล์งานจรืงค่ะ

ฉะนั้น ไฟล์หลักของตัวเองจะเป็นไฟล์มารโค เวลาเขียนโคดจึงต้องเปิดไฟล์งานที่ใช้ทุกครั้งค่ะ
จึงติดปัญหาที่ต้องอ้างอืง worksheetนี้ sheet เดือนทร่เลือกต้องเลือกจาก ไฟล์กลักของตัวเองค่ะ

ชื่อไฟล์ของตัวเองชื่อ workbook "Main_runsum.xlsm"

Code: Select all

  With tb.Worksheets("Sum_" & Format(Range("D1"), "mmyy")) 
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#11

Post by snasui »

:D ที่ระบุ Range("D1") ไว้นั้นปัจจุบันโปรแกรมไม่รู้จักว่าเป็นของไฟล์ไหนเพราะไม่ได้เขียน Code ระบุเอาไว้จนถึง Parent ของเซลล์นั้น ๆ

ตัวอย่างการปรับ Code ด้านล่าง เป็นการทำให้ไฟล์ที่จะใช้งาน Active ขึ้นมาก่อน การอ้างถึงเซลล์ใด ๆ จะหมายถึง Object ของไฟล์ที่กำลัง Active อยู่ขณะนั้นครับ

Code: Select all

'Other code
tb.Activate
With tb.Worksheets("Sum_" & Format(Range("D1"), "mmyy"))
    With .Range("b" & .Rows.Count).End(xlUp).Offset(1, 0)
        .Resize(rs.Rows.Count, 5).Value = rs.Resize(, 5).Value
    End With
End With
'Other code
March201711
Gold
Gold
Posts: 1047
Joined: Sat Mar 11, 2017 7:01 pm
Excel Ver: 2010, 365

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#12

Post by March201711 »

แก้ code ตามที่อาจารย์บอกแล้วค่ะ แต่ทำไม sheet sum_0523 ข้อมูลมาทุกบรรทัดเลยค่ะ อยากให้ดึงข้อมูลมาเฉพาะ เดือน 5 ที่เลือกที่ sheet "SumAllData" ที่ cell D1 ค่ะ ที่ถูกควรจะมาแค่ วันที่ 2/5/2023 ตามที่ high light สีเหลืองค่ะ

Code: Select all

Sub Updates()
    Dim sb As Workbook, rs As Range
    Dim tb As Workbook
    Dim sh As Worksheet
    
    Set sb = Workbooks("Data2.xlsx")
    Set tb = Workbooks("SumData_bymonth.xlsx")
    For Each sh In sb.Worksheets
        Set rs = sh.Range("b3", sh.Range("b" & sh.Rows.Count).End(xlUp))
    tb.Activate
        With tb.Worksheets("Sum_" & Format(Range("D1"), "mmyy"))
            With .Range("b" & .Rows.Count).End(xlUp).Offset(1, 0)
                .Resize(rs.Rows.Count, 5).Value = rs.Resize(, 5).Value
            End With
        End With
    Next sh
End Sub
Attachments
Capture.JPG
Capture.JPG (63.03 KiB) Viewed 176 times
Main_runsum.xlsm
(19.5 KiB) Downloaded 8 times
SumData_bymonth.xlsx
(16.34 KiB) Downloaded 8 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ดึงข้อมูลด้วยโค้ด vba ในแต่ละชีท ให้มาต่อๆ กันใน worksheet ใหม่เป็น ข้อมูลรวม

#13

Post by snasui »

:D มาทุกบรรทัดเพราะไม่ได้เขียนเงื่อนไขให้ว่าให้มาเฉพาะตรงกับค่าใดถึงจะนำมาใช้ ลองศึกษาจากที่เคยเขียนไปให้ว่ามีการเขียนเงื่อนไขเข้าไปอย่างไรและลองปรับปรุงมาก่อน ติดแล้วค่อยถามกันต่อครับ
Post Reply