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 PasteData()
Dim wbShare As Workbook
Dim formBook As Workbook
Dim i As Integer
Dim rs As Range
Dim rt As Range
Set formBook = ThisWorkbook
Set wbShare = Workbooks("Ph_BookShare.xlsx")
Application.ScreenUpdating = False
With formBook
i = Worksheets("Enterthedata").Range("C224")
End With
With Worksheets("Template")
Set rs = .Range(.Range("A2"), .Range("AF" & i + 1))
End With
Set rt = wbShare.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
If Worksheets("Enterthedata").Range("C224") = True Then
MsgBox "Please check your data. This transaction already recorded."
Exit Sub
End If
If Worksheets("Enterthedata").Range("B204") = "" Then
MsgBox "Your data is empty. Fill your data and click record button again."
Exit Sub
End If
rs.Copy: rt.PasteSpecial xlPasteValues
Application.CutCopyMode = False
Sheets("Enterthedata").Range("D2,K2,B204:B219,D204:D219,L204:L219,D221,E221,E204:F219,L204:M219,O204:O219").ClearContents
With Worksheets("Enterthedata")
.Range("N1") = .Range("N1") + 1
End With
Application.ScreenUpdating = True
Windows("Ph_BookShare.xlsx").Activate
ActiveWorkbook.Save
Windows("Purchases.xlsm").Activate
ActiveWorkbook.Save
End Sub
Code: Select all
Application.ScreenUpdating = True
Windows("Ph_BookShare.xlsx").Activate
ActiveWorkbook.Save
Code: Select all
Application.ScreenUpdating = True
Windows("Ph_BookShare.xlsx").Activate
ActiveWorkbook.RefreshAll
ActiveWorkbook.Save
ActiveWorkbook.Save
ก่อนที่จะบันทึกรายการเพื่อทำการ Refresh หลังจากบันทึกรายการแล้วค่อย Save โดย Code นี้อีกรอบครับใช่วาง Code แบบนี้ไหมคะอาจารย์ error ตามรูปแนบค่ะsnasui wrote: ใช้ CodeActiveWorkbook.Save
ก่อนที่จะบันทึกรายการเพื่อทำการ Refresh หลังจากบันทึกรายการแล้วค่อย Save โดย Code นี้อีกรอบครับ
Code: Select all
Application.ScreenUpdating = True
Windows("Ph_BookShare.xlsx").Activate
ActiveWorkbook.Save
ActiveWorkbook.Refresh
ActiveWorkbook.Save
ขอบคุณค่ะคุณ bank9597 ได้เป็นอีกหนึ่งทางเลือกค่ะbank9597 wrote: เพิ่งเจอปัญหานี้มาหมาดๆครับ
วิธีแก้ปัญหาของผมคือ ให้ไฟล์ที่รับข้อมูลปิด แล้วเวลาจะปัญทึกข้อมูลก็ให้เขียนโค๊ดสั่งเปิดไฟล์ขึ้นมาทำการบันทึก และก็เซฟปิดไป
ทำแบบนี้จะไม่มีปัญหาการเซฟทับกัน และยังทำให้ข้อมูล refresh อัตโนมัตเมื่อมีการเปิดปิดไฟล์
ActiveWorkbook.Refresh
ไม่ต้องใช้ครับsnasui wrote: ใช้ CodeActiveWorkbook.Save
ก่อนที่จะบันทึกรายการเพื่อทำการ Refresh หลังจากบันทึกรายการแล้วค่อย Save โดย Code นี้อีกรอบครับ
Code: Select all
Application.ScreenUpdating = True
ActiveWorkbook.Save
Windows("Ph_BookShare.xlsx").Activate
ActiveWorkbook.Save
ขอบคุณค่ะคุณ bank9597bank9597 wrote: ศึกษาตามลิงค์ด้านล่างได้ครับ ในคำตอบที่ 2 จะมีตัวอย่าง code ลองทดสอบดูครับ เผื่อเป็นทางเลือกครับ
http://stackoverflow.com/questions/1302 ... o-next-row
ตัวอย่าง Code ตามด้านล่างครับsuka wrote:วางแบบนี้ใช่ไหมคะอาจารย์ Code ไม่ฟ้องอะไรแล้วค่ะ
โค้ด:
Application.ScreenUpdating = True
ActiveWorkbook.Save
Windows("Ph_BookShare.xlsx").Activate
ActiveWorkbook.Save
Code: Select all
Sub PasteData()
'Other code
Set wbShare = Workbooks("Ph_BookShare.xlsx")
wbShare.Save '<== Add this line for refresh shareworkbook
Application.ScreenUpdating = False
With formBook
i = Worksheets("Enterthedata").Range("C224")
End With
With Worksheets("Template")
Set rs = .Range(.Range("A2"), .Range("AF" & i + 1))
End With
Set rt = wbShare.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
If Worksheets("Enterthedata").Range("C224") = True Then
MsgBox "Please check your data. This transaction already recorded."
Exit Sub
End If
If Worksheets("Enterthedata").Range("B204") = "" Then
MsgBox "Your data is empty. Fill your data and click record button again."
Exit Sub
End If
rs.Copy: rt.PasteSpecial xlPasteValues
wbShare.Save '<==Save after record data
'Other code
End Sub
Code: Select all
Sub PasteData()
Dim wbShare As Workbook
Dim formBook As Workbook
Dim i As Integer
Dim rs As Range
Dim rt As Range
Set formBook = ThisWorkbook
Set wbShare = Workbooks("AA_BookShare.xlsx")
wbShare.Save '<== Add this line for refresh shareworkbook
Application.ScreenUpdating = False
With formBook
i = Worksheets("Enterthedata").Range("C224")
End With
With Worksheets("Template")
Set rs = .Range(.Range("A2"), .Range("AF" & i + 1))
End With
Set rt = wbShare.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
If Worksheets("Enterthedata").Range("C224") = True Then
MsgBox "Please check your data. This transaction already recorded."
Exit Sub
End If
If Worksheets("Enterthedata").Range("B204") = "" Then
MsgBox "Your data is empty. Fill your data and click record button again."
Exit Sub
End If
rs.Copy: rt.PasteSpecial xlPasteValues
wbShare.Save '<==Save after record data
formBook.Save
Application.CutCopyMode = False
Sheets("Enterthedata").Range("D2,K2,B204:B219,D204:D219,L204:L219,D221,E221,E204:F219,L204:M219,O204:O219").ClearContents
With Worksheets("Enterthedata")
.Range("N1") = .Range("N1") + 1
End With
End Sub
Code: Select all
With Worksheets("Enterthedata")
.Range("N1") = .Range("N1") + 1
End With
เรียนอาจารย์ค่ะ ลองเขียน Code ตามที่อาจารย์แนะนำมาด้านบน ก่อนบันทึกให้ตรวจสอบกลุ่มเอกสารที่คอลัมน์ B และหาตัวเลขล่าสุดที่คอลัมน์ E ไฟล์ AA_BookShare Code เพิ่มเข้ามาเป็นตัวแดงตามรูปแนบค่ะsnasui wrote: เมื่อต้องการใช้ไฟล์ร่วมกันและมีการบันทึกหลายคนพร้อม ๆ กันได้ เซลล์ N1 จะไม่สามารถกำหนดค่าไว้ลวงหน้าเหมือนลักษณะการจองตัวเลขไว้ได้ครับ วิธีการให้ลำดับที่จะต้องเปลี่ยนไปจากเดิมครับ นั่นคือก่อนที่จะบันทึกรายการให้ตรวจสอบว่าใน Share File มีตัวเลขล่าสุดเท่าใดก็ให้นำเลขนั้นมาใช้และบวกด้วย 1 เข้าไปก่อนแล้วค่อยบันทึกรายการและ Save ครับ ค่าในเซลล์ N1 จึงเป็นค่าที่เพิ่งบันทึกไปล่าสุด ไม่ใช่เลขที่ลำดับถัดไป
ลองเขียน Code มาตามที่ผมแนะนำด้านบนมาก่อน ติดตรงไหนแล้วค่อยดูกันต่อครับ
Code: Select all
Sub PasteData()
Dim wbShare As Workbook
Dim formBook As Workbook
Dim i As Integer
Dim e As Integer 'เพื่อทดลองหาตัวเลขล่าสุด
Dim rs As Range
Dim rt As Range
Set formBook = ThisWorkbook
Set wbShare = Workbooks("AA_BookShare.xlsx")
With wbShare
e = Workbooks.Function.CountA("sheet1").Range("B:B).Columns("E:E")))
End With
wbShare.Save '<== Add this line for refresh shareworkbook
Code: Select all
Sub PasteData()
Dim wbShare As Workbook
Dim formBook As Workbook
Dim i As Integer
Dim rs As Range
Dim rt As Range
Set formBook = ThisWorkbook
Set wbShare = Workbooks("AA_BookShare.xlsx")
wbShare.Save '<== Add this line for refresh shareworkbook
Application.ScreenUpdating = False
With formBook
i = Worksheets("Enterthedata").Range("C224")
End With
With Worksheets("Template")
Set rs = .Range(.Range("A2"), .Range("AF" & i + 1))
End With
Set rt = wbShare.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
If Worksheets("Enterthedata").Range("C224") = True Then
MsgBox "Please check your data. This transaction already recorded."
Exit Sub
End If
If Worksheets("Enterthedata").Range("B204") = "" Then
MsgBox "Your data is empty. Fill your data and click record button again."
Exit Sub
End If
rs.Copy: rt.PasteSpecial xlPasteValues
wbShare.Save '<==Save after record data
formBook.Save
Application.CutCopyMode = False
Sheets("Enterthedata").Range("D2,K2,B204:B219,D204:D219,L204:L219,D221,E221,E204:F219,L204:M219,O204:O219").ClearContents
With Worksheets("Enterthedata")
.Range("N1") = .Range("N1") + 1
End With
End Su
dim e as integer
หมายถึงกำหนดให้ตัวแปร e มีค่าได้ไม่เกิน 32767 ไม่ทราบว่าจริง ๆ แล้วตัวเลขเกินนี้หรือไม่ หากเกินจะประกาศเป็น Integer ไม่ได้ครับe = wbShare.range("a" & rows.count).end(xlup).value
ลองปรับใช้กับข้อมูลจริงดูครับCode: Select all
With wbShare
e = wbShare.Range("e" & Rows.Count).End(xlUp).Value
End With