Page 1 of 1

การนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล

Posted: Sun Jul 02, 2023 10:30 am
by tigerwit
จากไฟล์ที่แนบมมา
ต้องการนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล
ต้องปรับโค๊ดอย่างไรครับ

Code: Select all

Sub Import()
  Dim fileToOpen As Variant
  Dim fileFilterPattern As String
  Dim wsMaster As Worksheet
  Dim wbTextImport As Workbook
  '
    Application.ScreenUpdating = False
        If MsgBox("คุณต้องการนำเข้าผลการเรียน ใช่หรือไม่?", 36, "ยืนยันการนำเข้าผลการเรียน") = 6 Then
               fileToOpen = Application.GetOpenFilename(Title:="เปิดไฟล์ .csv เพื่อนำเข้าข้อมูล", FileFilter:="Text Files (*.txt; *.csv),*.txt;*.csv")
        End If
        If fileToOpen = False Then
                MsgBox "คุณไม่ได้เลือกไฟล์ที่จะนำเข้า", vbOKOnly + vbInformation, "ยกเลิกการนำเข้าข้อมูล"
       Exit Sub
        Else
            Workbooks.Open Filename:=fileToOpen, UpdateLinks:=0, local:=True
            Set wbTextImport = ActiveWorkbook
            Set wsMaster = ThisWorkbook.ActiveSheet
                    wbTextImport.Worksheets(1).Range("A1:N45").Copy
                        Range("F" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
                    wbTextImport.Worksheets(1).Range("O1:P45").Copy
                       Range("U" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
                    wbTextImport.Worksheets(1).Range("Q1:AD45").Copy
                        Range("Z" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
                    wbTextImport.Worksheets(1).Range("AE1:AF45").Copy
                        Range("AO" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
                    Application.CutCopyMode = False
                    wbTextImport.Close False
    Range("F6").Select
       MsgBox "นำเข้าคะแนนเรียบร้อยแล้ว"
         End If
    Application.ScreenUpdating = True
End Sub


Re: การนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล

Posted: Sun Jul 02, 2023 8:58 pm
by snasui
:D ตัวอย่างการปรับ code ครับ

Code: Select all

'Other code
Else
    Workbooks.Open Filename:=fileToOpen, UpdateLinks:=0, local:=True
    Set wbTextImport = ActiveWorkbook
    Set wsMaster = ThisWorkbook.ActiveSheet
    
    wbTextImport.Worksheets(1).Range("A1:N45").Copy
    wsMaster.Range("F" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
    
    wbTextImport.Worksheets(1).Range("O1:P45").Copy
    wsMaster.Range("U" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
    
    wbTextImport.Worksheets(1).Range("Q1:AD45").Copy
    wsMaster.Range("Z" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
    
    wbTextImport.Worksheets(1).Range("AE1:AF45").Copy
    wsMaster.Range("AO" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
'Other code

Re: การนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล

Posted: Sun Jul 02, 2023 9:56 pm
by tigerwit
ขอบคุณครับได้ผลตามต้องการแล้วครับ
ขอสอบถามเพิ่มเติมในกระทู้นี้
กรณีที่ต้องการเลือกช่วงข้อมูลที่จะคัดลอก จากคลอลัมน์ A ถึง คลอลัมน์ N
โดยให้เลือกถึงแถวสุดท้ายที่มีข้อมูล (ยึดข้อมูลของคลอลัมน์ A)
ต้องปรับโค๊ดนี้อย่างไรครับ

Code: Select all

Sub test()
    Range(Range("A1"), Range("N1").End(xlDown)).Select
End Sub

Re: การนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล

Posted: Mon Jul 03, 2023 7:14 am
by snasui
:D สามารถทำให้ง่ายโดยกำหนดตัวแปรขึ้นมา 1 ตัวแล้วกำหนดค่าให้ตัวแปรนั้นด้วยค่าบรรทัดสุดท้ายของคอลัมน์ที่ต้องการจากนั้นค่อยนำไปใช้งาน ดังตัวอย่างด้านล่างครับ

Code: Select all

Dim rw As Long
With Worksheets("Sheet1")
    rw = .Range("a" & .Rows.Count).End(xlUp).Row
    .Range("N1:N" & rw).Select
End With

Re: การนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล

Posted: Tue Jul 04, 2023 10:32 pm
by tigerwit
สอบถามกรณีที่เรานำเข้าข้อมูลมาต่อกันลงไปเรื่อยๆ โดยให้ตรวจสอบว่า ในคลอลัมน์ B มีค่าว่างหรือไม่
ถ้ามีค่าวาง ให้ยกเลิกการนำเข้ามูล จากโค๊ด ต้องปรับแก้อย่างไรครับ

Code: Select all

Sub ImPortToLastrows()
  Dim fileToOpen As Variant
  Dim fileFilterPattern As String
  Dim wsMaster As Worksheet
  Dim wbTextImport As Workbook
  Dim rw As Long
  Dim rg As Long
  '
    Application.ScreenUpdating = False
        If MsgBox("คุณต้องการนำผลการเรียนจากห้อง 2 มาต่อท้ายห้อง 1 ใช่หรือไม่?", 36, "ยืนยันการนำผลการเรียนมารวมเป็นห้องเดียว") = 6 Then
               fileToOpen = Application.GetOpenFilename(Title:="เปิดไฟล์ .csv เพื่อนำเข้าข้อมูล", FileFilter:="Text Files (*.txt; *.csv),*.txt;*.csv")
        
        End If
        If fileToOpen = False Then
                MsgBox "คุณไม่ได้เลือกไฟล์ที่จะนำเข้า", vbOKOnly + vbInformation, "ยกเลิกการนำเข้าข้อมูล"
       Exit Sub

       rg = wsMaster.Range("B" & Rows.Count).End(xlUp).Row
       If Range("B" & rg).Value = "" Then
            MsgBox "ไม่มีนักเรียนให้นำเข้าคะแนน", vbOKOnly + vbInformation, "ยกเลิกการนำเข้าข้อมูล"
            Exit Sub
        End If

        Else
            Workbooks.Open Filename:=fileToOpen, UpdateLinks:=0, local:=True
            Set wbTextImport = ActiveWorkbook
            Set wsMaster = ThisWorkbook.ActiveSheet

                With wbTextImport.Worksheets(1)
                    rw = .Range("a" & .Rows.Count).End(xlUp).Row
                    .Range("A1:N" & rw).Copy
                    wsMaster.Range("F" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues

                    .Range("O1:P" & rw).Copy
                    wsMaster.Range("U" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
                    
                    .Range("Q1:AD" & rw).Copy
                    wsMaster.Range("Z" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
                    
                    .Range("AE1:AF" & rw).Copy
                     wsMaster.Range("AO" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues

               End With
                    Application.CutCopyMode = False
                    wbTextImport.Close False
                    Range("F6").Select
       End If
    Application.ScreenUpdating = True
           MsgBox "นำเข้าคะแนนเรียบร้อยแล้ว"
End Sub

Re: การนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล

Posted: Wed Jul 05, 2023 5:58 am
by snasui
:D กรุณาอธิบายมาอย่างละเอียดว่าคอลัมน์ B ของไฟล์ไหนเนื่องจากส่งมาสองไฟล์คือไฟล์โปรแกรมกับไฟล์ข้อมูล จะได้เข้าใจตรงกันครับ

Re: การนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล

Posted: Wed Jul 05, 2023 6:19 am
by tigerwit
คลอลัมน์B จากไฟล์ 12.xlsb ครับ

Re: การนำข้อมูลจากไฟล์.csv ให้ต่อจากแถวสุดท้ายที่มีข้อมูล

Posted: Wed Jul 05, 2023 6:57 am
by snasui
:D ตัวอย่างการปรับ Code จะเป็นตามด้านล่างครับ

Code: Select all

'Other code
If MsgBox("คุณต้องการนำผลการเรียนจากห้อง 2 มาต่อท้ายห้อง 1 ใช่หรือไม่?", 36, "ยืนยันการนำผลการเรียนมารวมเป็นห้องเดียว") = 6 Then
       fileToOpen = Application.GetOpenFilename(Title:="เปิดไฟล์ .csv เพื่อนำเข้าข้อมูล", FileFilter:="Text Files (*.txt; *.csv),*.txt;*.csv")
End If
If fileToOpen = False Then
    MsgBox "คุณไม่ได้เลือกไฟล์ที่จะนำเข้า", vbOKOnly + vbInformation, "ยกเลิกการนำเข้าข้อมูล"
    Exit Sub
Else
    Set wsMaster = ThisWorkbook.ActiveSheet
    rg = wsMaster.Range("B" & Rows.Count).End(xlUp).Row
    If Range("B" & rg).Value = "" Then
        MsgBox "ไม่มีนักเรียนให้นำเข้าคะแนน", vbOKOnly + vbInformation, "ยกเลิกการนำเข้าข้อมูล"
        Exit Sub
    End If
'Other code
การตรวจสอบบรรทัดสุดท้ายแล้วกำหนดค่าให้กับตัวแปร rg จะต้องมั่นใจว่าโปรแกรมสามารถชี้ไปยังบรรทัดนั้นได้จริง เนื่องจากพบว่าคอลัมน์นั้นเป็นสูตรซึ่งหากมีการคัดลอกเผื่อไว้ก็จะไม่สามารถเข้าถึงบรรทัดที่มีข้อมูลล่าสุดได้จริง จำเป็นต้องหาวิธีแก้ไขมาเอง ติดแล้วค่อยถามกันต่อครับ