EXCEL TOOLS
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
[code]
และปิดด้วย [/code]
ตัวอย่างเช่น [code]dim r as range[/code]
เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)Code: Select all
Sub MainCode_ex()
Dim formBook As Workbook
Dim i As Integer
Dim e As Long
Dim rs As Range
Dim rt As Range
Dim rk As Range
Set formBook = ThisWorkbook
Set wbShare = Workbooks("Material_BSh.xlsx")
With wbShare
e = .Sheets("Stock_MR").Range("B" & Rows.Count).End(xlUp).Value + 1 'หาเลขสุดท้ายแลัว + 1
formBook.Worksheets("FormRM_ex").Range("E5").Value = e
End With
wbShare.Save
i = Worksheets("FormRM_ex").Range("B6").Value
With formBook.Worksheets("Template")
Set rs = .Range(.Range("a2"), .Range("p" & i + 1))
End With
Set rt = wbShare.Sheets("Stock_MR").Range("A1048576").End(xlUp).Offset(1, 0)
If Worksheets("FormRM_ex").Range("l5") = True Then
MsgBox "Please check your data. This transaction already recorded."
Exit Sub
End If
If Worksheets("FormRM_ex").Range("l5") = "" Then
MsgBox "Your data is empty. Fill your data and click record button again."
Exit Sub
End If
rs.Copy: rt.PasteSpecial xlPasteValues
Sheets("FormRM_ex").Range("k8:l12,n8:n12").ClearContents
With formBook.Sheets("FormRM_ex")
.Range("E5") = .Range("E5") + 1
End With
Application.CutCopyMode = False
End Sub
dim r as range
ต่อจากเดิมที่มีอยู่แล้วCode: Select all
For Each r In rs.Columns(4).Cells
If r.Value <> "" Then
Set rt = wbShare.Sheets("Stock_MR").Range("A1048576").End(xlUp).Offset(1, 0)
rs.Rows(r.Rows).Copy: rt.PasteSpecial xlPasteValues
End If
Next r
ตามนั้นครับsuka wrote: ขอบคุณค่ะอาจารย์ โค๊ดได้ตรงตามที่ต้องการแล้วค่ะ
ขอรบกวนถามความหมายของโค๊ด For Each r In rs.Columns(4).Cells นี้ จากตัวอย่างไฟล์หมายถึงไฟล์ Material_BSh คอลัมน์ D ใช่ไหมคะ
มาขยายความให้อีกนิดครับsuka wrote: ขอบคุณค่ะอาจารย์ โค๊ดได้ตรงตามที่ต้องการแล้วค่ะ
ขอรบกวนถามความหมายของโค๊ด For Each r In rs.Columns(4).Cells นี้ จากตัวอย่างไฟล์หมายถึงไฟล์ Material_BSh คอลัมน์ D ใช่ไหมคะ
rs.Columns(4).Cells
คือคอลัมน์ที่ 4 ของตัวแปร rs ซึ่งเป็นช่วงข้อมูลต้นทาง แต่เนื่องจากว่ามีการ Copy ตัวแปร rs แล้วไปวางในคอลัมน์ A ของไฟล์ปลายทาง ตำแหน่งคอลัมน์ที่ 4 ของตัวแปร rs จึงไปตรงกับคอลัมน์ D ของไฟล์ปลายทางCode: Select all
With formBook.Worksheets("Template")
Set rs = .Range(.Range("A12"), .Range("L12" & i + 1))
End With
Code: Select all
Sub Main_ex()
Dim formBook As Workbook
Dim i As Integer
Dim e As Long
Dim rs As Range
Dim rt As Range
Dim rk As Range
Dim r As Range
Set formBook = ThisWorkbook
Set wbShare = Workbooks("Material_BSh.xlsx")
With wbShare
e = .Sheets("Stock_MR").Range("B" & Rows.Count).End(xlUp).Value + 1
formBook.Worksheets("FormRM_ex").Range("E5").Value = e
End With
wbShare.Save
i = Worksheets("FormRM_ex").Range("B6").Value
With formBook.Worksheets("Template")
Set rs = .Range(.Range("A12"), .Range("L12" & i + 1))
End With
For Each r In rs.Columns(4).Cells
If r.Value <> "" Then
Set rt = wbShare.Sheets("Stock_MR").Range("A1048576").End(xlUp).Offset(1, 0)
rs.Rows(r.Rows).Copy: rt.PasteSpecial xlPasteValues
End If
Next r
If Worksheets("FormRM_ex").Range("L5") = "" Then
MsgBox "Your data is empty. Fill your data and click record button again."
Exit Sub
End If
Sheets("FormRM_ex").Range("k8:l12,n8:n12").ClearContents
With formBook.Sheets("FormRM_ex")
.Range("E5") = .Range("E5") + 1
End With
Application.CutCopyMode = False
End Sub
rs.Rows(r.Row)
ครับCode: Select all
i = Worksheets("Form").Range("I2").Value
Code: Select all
i = Worksheets("Form").Range("I2").Value
With formBook.Worksheets("Template")
Set rs = .Range("A12:L12").Resize(i + 1)
End With
For Each r In rs.Columns(4).Cells
If r.Value <> "" Then
Set rt = wbShare.Sheets("Employees").Range("A1048576").End(xlUp).Offset(1, 0)
rs.Rows(r.Row).Copy: rt.PasteSpecial xlPasteValues
End If
Next r
Code: Select all
i = Worksheets("Form").Range("I2").Value
With formBook.Worksheets("Template")
Set rs = .Range("A12:L12").Resize(i + 1)
End With
Code: Select all
For Each r In rs.Columns(4).Cells
If r.Value <> "" Then
Set rt = wbShare.Sheets("Emp").Range("A1048576").End(xlUp).Offset(1, 0)
rs.Rows(r.Rows).Copy: rt.PasteSpecial xlPasteValues
End If
Next r
rs.rows(r.rows).copy
ในเครื่องผมไม่สามารถใช้ได้ครับrs.rows(r.row).copy
สามารถใช้ได้ เป็นการ Copy ตัวแปร rs ในบรรทัดที่เป็นค่าบรรทัดของตัวแปร r โดย Copy ไปทั้งบรรทัดr.rows
คือค่าของตัวแปร r เมื่อ r เป็นเซลล์เดี่ยวๆ แต่หาก r เป็นช่วงเซลล์ จะเกิด Error ครับr.row
คือค่าบรรทัดของตัวแปร rrs.rows(r.rows).copy
ได้ก็ยินดีด้วยครับ Code: Select all
rs.Rows(r.Row).Copy: rt.PasteSpecial xlPasteValues
Code: Select all
Sub InEmp()
Application.ScreenUpdating = False
Dim formBook As Workbook
Dim i As Integer
Dim e As Long
Dim rs As Range
Dim rt As Range
Dim rk As Range
Dim r As Range
Set formBook = ThisWorkbook
Set wbShare = Workbooks("Material_BookShare.xlsx")
With wbShare
e = .Sheets("Emp").Range("B" & Rows.Count).End(xlUp).Value + 1
formBook.Worksheets("Form").Range("J5").Value = e
End With
wbShare.Save
i = Worksheets("Form").Range("I2").Value
With formBook.Worksheets("Template")
Set rs = .Range("A12:L12").Resize(i + 1)
End With
For Each r In rs.Columns(4).Cells
If r.Value <> "" Then
Set rt = wbShare.Sheets("Emp").Range("A1048576").End(xlUp).Offset(1, 0)
rs.Rows(r.Row).Copy: rt.PasteSpecial xlPasteValues
End If
Next r
With formBook.Sheets("Form")
.Range("J5") = .Range("J5") + 1
End With
Application.CutCopyMode = False
End Sub
rs.rows(r.rows)
เพื่อ Return ค่าบรรทัดที่ตัวแปร r หรือจะใช้เป็น rs.rows(r)
ก็ได้เช่นกันCode: Select all
With wbShare.Sheets("Emp")
e = .Range("B" & .Rows.Count).End(xlUp).Row + 1
formBook.Worksheets("Form").Range("J5").Value = e
End With
wbShare.Save
i = formBook.Worksheets("Form").Range("I2").Value
With formBook.Worksheets("Template")
Set rs = .Range("A12:L12").Resize(i + 1)
End With
For Each r In rs.Columns(4).Cells
If r.Value <> "" Then
Set rt = wbShare.Sheets("Emp").Range("A1048576").End(xlUp).Offset(1, 0)
rs.Rows(r).Copy: rt.PasteSpecial xlPasteValues
End If
Next r