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
Private Sub CmdSave_Click()
Dim irow As Integer
Dim ws As Worksheet
Set ws = Worksheets("Data")
'find first empty row in database
irow = ws.Cells(Rows.Count, 1) _
.End(xlUp).Offset(1, 0).Row
'Check for Id
If (Me.TxtID.Value) = "" Then
Me.TxtID.SetFocus
Exit Sub
End If
If Application.CountIf(Range("b:b"), TxtID.Text) > 0 Then
irow = Application.Match(TxtID.Text, Range("b:b"), 0)
Else
irow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
End If
MsgBox "ÁÕ¢éÍÁÙżÙé»èÇÂáÅéÇ"
Exit Sub
'copy the data to the database
ws.Cells(irow, 2).Value = Me.TxtID.Value
ws.Cells(irow, 3).Value = Me.listTitle.Value
ws.Cells(irow, 4).Value = Me.txtName.Value
ws.Cells(irow, 5).Value = Me.txtSurename.Value
ws.Cells(irow, 6).Value = Me.liststatus.Value
ws.Cells(irow, 7).Value = Me.txtMobile.Value
Unload Me
'Clear the data
Me.TxtID.Value = ""
Me.listTitle.Value = ""
Me.txtName.Value = ""
Me.txtSurename.Value = ""
Me.liststatus.Value = ""
Me.txtMobile.Value = ""
Me.TextBox1.SetFocus
End Sub
แนบไฟล์มาแล้วค่ะ รบกวนด้วยนะคะpuriwutpokin wrote: Thu Oct 25, 2018 7:27 pm ควรแนบตัวอย่างไฟล์ที่ เป็นปัญหามาด้วยครับ จะได้ทดสอบได้ครับ
Code: Select all
Private Sub CmdSave_Click()
Dim irow As Integer
Dim msgRepns As Integer
Dim ws As Worksheet
Set ws = Worksheets("Data")
'find first empty row in database
irow = ws.Cells(Rows.Count, 1) _
.End(xlUp).Offset(1, 0).Row
'Check for Id
If (Me.TxtID.Value) = "" Then
Me.TxtID.SetFocus
Exit Sub
End If
If Application.CountIf(Range("b:b"), TxtID.Text) > 0 Then
irow = Application.Match(CDbl(TxtID.Text), Range("b:b"), 0)
msgRepns = MsgBox("มีข้อมูลผู้ป่วยแล้ว หากต้องการแก้ไขข้อมูลเดิมคลิก Yes หากต้องการยกเลิกคลิก NO", vbYesNo)
Else
irow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
End If
If msgRepns = vbNo Then
Exit Sub
End If
'copy the data to the database
ws.Cells(irow, 2).Value = Me.TxtID.Value
ws.Cells(irow, 3).Value = Me.listTitle.Value
ws.Cells(irow, 4).Value = Me.txtName.Value
ws.Cells(irow, 5).Value = Me.txtSurename.Value
ws.Cells(irow, 6).Value = Me.liststatus.Value
ws.Cells(irow, 7).Value = Me.txtMobile.Value
Unload Me
'Clear the data
Me.TxtID.Value = ""
Me.listTitle.Value = ""
Me.txtName.Value = ""
Me.txtSurename.Value = ""
Me.liststatus.Value = ""
Me.txtMobile.Value = ""
MsgBox "บันทึกสำเร็จ"
End Sub
snasui wrote: Fri Oct 26, 2018 10:47 pm ตัวอย่าง Code ครับ
Code: Select all
Private Sub CmdSave_Click() Dim irow As Integer Dim msgRepns As Integer Dim ws As Worksheet Set ws = Worksheets("Data") 'find first empty row in database irow = ws.Cells(Rows.Count, 1) _ .End(xlUp).Offset(1, 0).Row 'Check for Id If (Me.TxtID.Value) = "" Then Me.TxtID.SetFocus Exit Sub End If If Application.CountIf(Range("b:b"), TxtID.Text) > 0 Then irow = Application.Match(CDbl(TxtID.Text), Range("b:b"), 0) msgRepns = MsgBox("มีข้อมูลผู้ป่วยแล้ว หากต้องการแก้ไขข้อมูลเดิมคลิก Yes หากต้องการยกเลิกคลิก NO", vbYesNo) Else irow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row End If If msgRepns = vbNo Then Exit Sub End If 'copy the data to the database ws.Cells(irow, 2).Value = Me.TxtID.Value ws.Cells(irow, 3).Value = Me.listTitle.Value ws.Cells(irow, 4).Value = Me.txtName.Value ws.Cells(irow, 5).Value = Me.txtSurename.Value ws.Cells(irow, 6).Value = Me.liststatus.Value ws.Cells(irow, 7).Value = Me.txtMobile.Value Unload Me 'Clear the data Me.TxtID.Value = "" Me.listTitle.Value = "" Me.txtName.Value = "" Me.txtSurename.Value = "" Me.liststatus.Value = "" Me.txtMobile.Value = "" MsgBox "บันทึกสำเร็จ" End Sub
snasui wrote: Tue Oct 30, 2018 11:59 pm แบบเดิมใช้ไม่ได้เพราะเขียนไม่ถูกต้องครับ
คอลัมน์ B ใน Worksheet คือ Number ส่วนค่าใน TxtID คือ Text จะต้องแปลงให้เป็น Number เสียก่อนจึงจะเทียบกันได้
กรณีมีการแก้ไขข้อมูลเดิม และต้องการบันทึกลงที่เดิมก็ควรจะทำได้ด้วยผมจึงกำหนดตัวแปรเข้าไปกำกับ ให้ผู้ใช้ตอบว่าจะบันทึกการแก้ไขข้อมูลเดิมหรือไม่ หากไม่ก็จะไม่บันทึกทับข้อมูลเดิมเช่นนี้เป็นต้นครับ
snasui wrote: Wed Oct 31, 2018 9:24 pm ไฟล์ที่มี Macro ไม่รองรับการ Shared จึงไม่สามารถ Shared ให้ใช้ได้พร้อมกันหลาย ๆ คนครับ
Code: Select all
Private Sub CmdFind_Click()
On Error Resume Next
'Err.Clear
nRow = Workbooks("Employee Data.xlsx").Worksheets("Data").Columns(4).Find(Txtfind.Text).Row
If Err.Number = 91 Then
TxtID.Value = "Not Found"
listTitle.Value = "Not Found"
txtName.Value = "Not Found"
txtSurename.Value = "Not Found"
liststatus.Value = "Not Found"
txtMobile.Value = "Not Found"
MsgBox "Don't have this Name"
GoTo nNextี
End If
TxtID.Value = Cells(nRow, 2)
listTitle.Value = Cells(nRow, 3)
txtName.Value = Cells(nRow, 4)
txtSurename.Value = Cells(nRow, 5)
liststatus.Value = Cells(nRow, 6)
txtMobile.Value = Format(Cells(nRow, 7), "000-0000000")
'current address
Txtno1.Value = Cells(nRow, 9)
TxtMoo1.Value = Cells(nRow, 10)
Txtban1.Value = Cells(nRow, 11)
Txtsoi1.Value = Cells(nRow, 12)
Txtroad1.Value = Cells(nRow, 13)
listtambon1.Value = Cells(nRow, 14)
listampor1.Value = Cells(nRow, 15)
listprovince1.Value = Cells(nRow, 16)
Txtcode1.Value = Cells(nRow, 17)
'home address
Txtno2.Value = Cells(nRow, 18)
TxtMoo2.Value = Cells(nRow, 19)
Txtban2.Value = Cells(nRow, 20)
Txtsoi2.Value = Cells(nRow, 21)
Txtroad2.Value = Cells(nRow, 22)
listtambon2.Value = Cells(nRow, 23)
listampor2.Value = Cells(nRow, 24)
listprovince2.Value = Cells(nRow, 25)
Txtcode2.Value = Cells(nRow, 26)
Cells(nRow, 2).Activate
nNext:
End Sub
Private Sub CmdSave_Click()
Dim irow As Integer
Dim msgRepns As Integer
Dim ws As Worksheet
Set ws = Worksheets("Data")
'find first empty row in database
irow = ws.Cells(Rows.Count, 1) _
.End(xlUp).Offset(1, 0).Row
'Check for Id
If (Me.TxtID.Value) = "" Then
Me.Txtfind.SetFocus
Exit Sub
End If
If Application.CountIf(Range("b:b"), TxtID.Text) > 0 Then
irow = Application.Match(CDbl(TxtID.Text), Range("b:b"), 0)
msgRepns = MsgBox("ต้องการแก้ไขข้อมูล ?", vbYesNo)
Else
irow = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
End If
If msgRepns = vbNo Then
Exit Sub
End If
'copy the data to the database
ws.Cells(irow, 2).Value = Me.TxtID.Value
ws.Cells(irow, 3).Value = Me.listTitle.Value
ws.Cells(irow, 4).Value = Me.txtName.Value
ws.Cells(irow, 5).Value = Me.txtSurename.Value
ws.Cells(irow, 6).Value = Me.liststatus.Value
ws.Cells(irow, 7).Value = Format(Me.txtMobile.Value, "000-0000000")
'current address
ws.Cells(irow, 9).Value = Me.Txtno1.Value
ws.Cells(irow, 10).Value = Me.TxtMoo1.Value
ws.Cells(irow, 11).Value = Me.Txtban1.Value
ws.Cells(irow, 12).Value = Me.Txtsoi1.Value
ws.Cells(irow, 13).Value = Me.Txtroad1.Value
ws.Cells(irow, 14).Value = Me.listtambon1.Value
ws.Cells(irow, 15).Value = Me.listampor1.Value
ws.Cells(irow, 16).Value = Me.listprovince1.Value
ws.Cells(irow, 17).Value = Me.Txtcode1.Value
'home address
ws.Cells(irow, 18).Value = Me.Txtno2.Value
ws.Cells(irow, 19).Value = Me.TxtMoo2.Value
ws.Cells(irow, 20).Value = Me.Txtban2.Value
ws.Cells(irow, 21).Value = Me.Txtsoi2.Value
ws.Cells(irow, 22).Value = Me.Txtroad2.Value
ws.Cells(irow, 23).Value = Me.listtambon2.Value
ws.Cells(irow, 24).Value = Me.listampor2.Value
ws.Cells(irow, 25).Value = Me.listprovince2.Value
ws.Cells(irow, 26).Value = Me.Txtcode2.Value
'Unload Me
ws.Cells(irow, 27).Value = Format(Me.TxtDate.Value, "dd/mm/yyyy")
'Clear the data
Me.TxtID.Value = ""
Me.listTitle.Value = ""
Me.txtName.Value = ""
Me.txtSurename.Value = ""
Me.liststatus.Value = ""
Me.txtMobile.Value = ""
Me.Txtfind.Value = ""
Me.Txtno1.Value = ""
Me.TxtMoo1.Value = ""
Me.Txtban1.Value = ""
Me.Txtsoi1.Value = ""
Me.Txtroad1.Value = ""
Me.listtambon1.Value = ""
Me.listampor1.Value = ""
Me.listprovince1.Value = ""
Me.Txtcode1.Value = ""
Me.Txtno2.Value = ""
Me.TxtMoo2Value = ""
Me.Txtban2.Value = ""
Me.Txtsoi2.Value = ""
Me.Txtroad2.Value = ""
Me.listtambon2.Value = ""
Me.listampor2.Value = ""
Me.listprovince2.Value = ""
Me.Txtcode2.Value = ""
MsgBox "บันทึกสำเร็จ"
End Sub
snasui wrote: Wed Nov 07, 2018 8:45 pm ไฟล์ที่มี Macro ไม่มีวิธีแก้ให้ Shared Workbook ได้ครับ
วิธีการทำงานที่ควรจะเป็น
- มีไฟล์โปรแกรมต่างหาก โดย User ใด ๆ ก็ต้องใช้ไฟล์นี้ ใช้จากเครื่องใดก็ได้
- มีไฟล์ Database อยู่ในเครื่องที่ Shared File ไว้
- ใช้ไฟล์ตามข้อ 1 จะจัดการกับข้อมูลในไฟล์ตามข้อ 2
- ไฟล์ตามข้อ 2 เป็นตัวแทนของการเป็น Database สามารถเปลี่ยนไปเป็น Database แบบอื่น เช่น Access, SQL, Oracle หรืออื่น ๆ ได้ตามความจำเป็น
ใช้ ไฟล์ userform-test ดึงข้อมูลจาก ไฟล์ Data มาแสดง ในขณะที่ ไฟล์ data ไม่ได้เปิดอยู่ สามารถทำได้อย่างไรบ้างคะ ไม่รู้ว่าจะต้องใส่โค้ดเพิ่มอย่างไรค่ะsnasui wrote: Mon Nov 12, 2018 7:31 pm แนบไฟล์นั้นมาพร้อมทั้งไฟล์ปลายทาง อธิบายสิ่งที่ต้องการว่าจะทำอะไร ต้องกรอกค่าทดสอบใดบ้าง คลิกปุ่มไหน ผลลัพธ์ที่ถูกต้องจะต้องเป็นอย่างไร ที่ทำมาแล้วติดขัดตรง Procedure ใด บรรทัดใด ฯลฯ จะได้ช่วยดูต่อไปจากนั้นครับ
Code: Select all
Private Sub CmdFind_Click()
Dim wb As Workbook
On Error Resume Next
'Err.Clear
Set wb = Workbooks.Open("C:\Users\THA0753H\Desktop\Employee Data.xlsx")
nRow = wb.Worksheets("Data").Columns(4).Find(Txtfind.Text).Row
'Other code
wb.Close false
End sub
snasui wrote: Tue Nov 13, 2018 6:27 pm ตัวอย่างการปรับ Code ครับCode: Select all
Private Sub CmdFind_Click() Dim wb As Workbook On Error Resume Next 'Err.Clear Set wb = Workbooks.Open("C:\Users\THA0753H\Desktop\Employee Data.xlsx") nRow = wb.Worksheets("Data").Columns(4).Find(Txtfind.Text).Row 'Other code wb.Close false End sub
snasui wrote: Thu Nov 15, 2018 9:34 pm ตอนบันทึกไม่ต้องเขียนให้เปิดไฟล์ขึ้นมาใหม่ เพราะเปิดอยู่แล้วตอนค้นหา
Code ไหนที่เปิดการเปิดไฟล์ก็ให้ Mark เป็น Comment หรือลบทิ้งไปครับ
ListBox ตามภาพที่ถามเหมือนจับภาพมาจากเว็บ การสร้าง ListBox ก็แค่เพิ่ม ListBox เข้าไปครับ จะให้เหมือน Web เสียเลยทีเดียวก็คงไม่ได้ หากจะพยายามปรับแต่งก็พอจะพอใกล้เคียง แต่น่าจะเป็นเรื่องที่ไม่จำเป็นนัก ให้มันทำตาม Requirement ให้ครบก็พอแล้วครับ
puriwutpokin wrote: Mon Nov 19, 2018 12:34 pm ตอนรันก็ปกตินะครับ ได้ใช้คำสั่งเปิดไฟล์ไว้ด้วยหรือไม่ครับ
ถ้าอ่านจากที่แจ้งมา ผิดตรงเอาการ Open ออกครับ หากจะบันทึกข้อมูลลงในไฟล์ต้นทาง เมื่อยังไม่เปิดไฟล์ต้นทางก็ต้องเปิดออกมาก่อน แต่เมื่อเปิดมาแล้วคำสั่งอื่น ๆ หลังจากนั้นไม่ต้องไป Open อีก เมื่อจบงานจึง Close เมื่อจะบันทึกจึงจะ Open ใหม่ เช่นนี้ครับnoona wrote: Mon Nov 19, 2018 3:21 pm ปัญหาในตอนแรกคือ ใช้คำสั่งเปิดไฟล์ด้วยทำให้ฐานข้อมูลเด้งขึ้นมาตอนกดบันทึก ไม่ต้องการให้เด้งขึ้นมาจึงเอาคำสั่ง Open ออก ไม่แน่ใจว่าทำตรงไหนผิด