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]
เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)สงสัยครับว่าทำไมต้องสร้าง Userform มารับค่าจากเซลล์แล้วส่งกลับค่ากลับไปแก้ไขเซลล์ เพื่อความสะดวกแล้วจะไม่ส่งค่ากลับไปกลับมาลักษณะเช่นนี้ครับ ทำฟอร์มในเซลล์แล้วก็ Update ได้เลย การทำฟอร์มขึ้นมารับค่าจะเสียเวลาไปเป็นอันมากในการสร้าง Object ให้ชื่อ Object เขียนตัวแปร เขียน Code ฯลฯBafnet wrote:1. จากฟอร์ม มีวิธีการส่งข้อมูล และ แก้ไขไปบันทึกลักษณะนี้ คราวที่แล้วอาจารย์ให้การเขียนTarget มาแต่ผมไม่ทราบว่านำไปใช้ยังไง
วิธีที่ผมใช้มีปัญหาตรงที่เราไม่สามารถแก้ไขส่วนที่เป็นค่า key แก้ไขได้แต่รายละเอียด เช่นจะแก้จากรหัส 2 เป็น 3 ไม่ได้ ผมอยากให้อิสระ จาก 2 นางสม สวยดีมาก เป็น 3 นายมะนะ ใจดี
โดยส่งค่ากลับไปแทนแถวของ 2 นางสม สวยดีมาก ไม่ทราบจะอธิบายอย่างไรดีงงกับตัวเองครับแต่อาจารย์คงเข้าใจ
ผมมีตารางข้อมูลจำนวนมาก ต้องนั่งสร้าง Key ,Ref , Id ,Targetบันทึก ,TarGetแก้ไข,Source หนึ่งตารางผมต้องสร้าง 5 ตัว พอทำไป6-7 ตารางเริ่มหลงกับชื่อที่ตั้งมา
รบกวนอาจารย์ทำตัวอย่างให้ดูจากฟอร์มในการส่งข้อมูล และการแก้ไขข้อมูลที่ต้องการ
ตอบแบบรวม ๆ นะครับ เนื่องจากวันเดือนปี ไม่ควรมีค่าเป็นปีพ.ศ. ควรจะคีย์เป็นปีค.ศ. เพื่อความสะดวกในการใช้งาน เนื่องจาก Excel จะรู้จักวันเดือนปีเป็นค.ศ.เท่านั้นครับ การจะให้แสดงผลเป็นพ.ศ. ให้ใช้การจัดรูปแบบBafnet wrote:2. เรื่องของTextBox ที่รับวันที่ ซึ่งผมตั้งใจอยากให้ผู้ใช้คีย์ 00/00/0000 เป็นวันเดือนปีไทย ปกติบนแผ่นงานผมกำหนดรูปแบบเป็น dd/mm/bbbb
ผมต้องการให้ TextBox_AfterUpdate() ฟอร์แมทข้อมูลที่คีย์เข้าไปเป็นรูปแบบวันที่ในลักษณะ วันเดือนปี ของไทยเราครับ ไม่ทราบว่าต้องเขียนอย่างไร
เพราะตอนนี้ TextBox ส่งค่าออกมาเป็นข้อความ
3. เรื่อง TextBox อีกครับจะต้องเขียนอย่างไร ให้ได้รูปแบบตามที่ต้องการ เช่น เบอร์โทรศัพท์ ตอนคีย์ 0841234567
แต่อยากให้แสดงผลเป็น 084-1234-567 ประมาณนี้ หรือคีย์เลข 1 แล้วแสดงค่าเป็น 001
TextBox1_AfterUpdate()
TextBox1.Value = format(…….ไม่เป็นครับ
4. เรื่องของ TextBoxt อีกครับ
เราจะเขียนอย่างไรครับถ้าต้องให้ TextBox1 ที่อยู่บนฟอร์มอีกตัวหนึ่ง มีค่าเท่ากับ TexTbox1 ที่อยู่บนฟอร์มอื่น
5. เรื่องสุดท้ายในวันนี้ครับ (ยังคงต้องรบกวนอีกมากมายครับ)
ในฟอร์ม ผมกำหนด Cmd ลบข้อมูล อาจารย์เขียนให้ดูหน่อยนะครับว่าต้องการลบข้อมูลที่เลือกออกจากตารางไปเลยทำอย่างไรครับ
ขอบคุณครับ
เกือบลืมครับใน Toolbox มีเครื่องมือ Carlenda เรากำหนดมันให้เป็นเดือน ปี ของไทยเราได้ไหมครับ เพราะมันเป็นปี ค.ศ
หรืออาจารย์จะแนะนำอย่างไรถ้าเราอยากให้ผู้ใช้สามารถเลือกวันที่ไทยเราจากปฏิทินได้
ผมทำตัวอย่างมาให้โดยไม่ต้องสร้าง UserForm ขึ้นมารับค่า โดยหากต้องการหาว่ามีข้อมูลอยู่หรือไม่ก็ให้คลิกปุ่ม Find Record, เมื่อต้องการสร้างรายการใหม่ให้คลิกปุ่ม Add Record และเมื่อต้องการแก้ไขข้อมูลเดิม ให้คลิก Update Record ตาม Code ด้านล่าง ดูไฟล์แนบประกอบครับBafnet wrote:สวัสดีครับอาจารย์ ต้องขออภัยด้วยครับกับสิ่งที่ผมถาม
ประเด็นที่ผมใช้ UserForm รับค่า โดยไม่สร้างฟอร์มในเซล อาจเป็นเพราะความสงสัยที่ผมได้เห็นโปรแกรมสำเร็จที่มีฟอร์มสวยงาม มีปุ่มบันทึก แก้ไข หรือเพิ่มข้อมูลได้ ก็เลยอยากเรียนรู้วิธีที่เขาสร้างกัน
แต่ผมไม่มีพื้นฐาน และไม่อาจที่จะเริ่มต้นกับ Visual Basic แต่เห็นว่าเอ็กเซลสามารถเขียนคำสั่งในลักษณะนั้นได้ก็ขอเริ่มหัดกับเอกเซล
การส่งค่ากลับไปมาเพื่อแก้ไขหรือบันทึกที่ผมทำ เพราะผมรู้วิธีนี้อย่างเดียว คราวแรกที่เขาบอกให้สร้าง FormulaName ที่ชื่อTarget ก็พยายามอยู่เป็นเดือนกว่าจะหาวิธีสร้างเจอ
Code: Select all
Sub FindRecords()
Dim lng As Long, rs As Range, rt As Range
With Worksheets("Sheet1")
On Error Resume Next
lng = Application.Match(.Range("F4"), .Range("A:A"), 0)
Set rs = .Range("A" & lng).Resize(, 4)
Set rt = .Range("F4")
End With
If Err > 0 Then
MsgBox "Not found"
Exit Sub
Else
rs.Copy: rt.PasteSpecial xlPasteValues
Application.CutCopyMode = False
End If
End Sub
Sub AddRecords()
Dim rs As Range, rt As Range
With Worksheets("Sheet1")
Set rs = .Range("F4:I4")
Set rt = .Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
End With
rs.Copy: rt.PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
Sub UpdateRecords()
Dim lng As Long, rs As Range, rt As Range
With Worksheets("Sheet1")
On Error Resume Next
lng = Application.Match(.Range("F4"), .Range("A:A"), 0)
Set rt = .Range("A" & lng)
Set rs = .Range("F4:I4")
End With
If Err > 0 Then
MsgBox "Not found"
Exit Sub
Else
rs.Copy: rt.PasteSpecial xlPasteValues
Application.CutCopyMode = False
End If
End Sub
ไว้มีเวลาแล้วจะตรวจสอบ Code ที่เขียนมาว่าได้กำหนด TextBox ไว้อย่างไร แสดงผลอย่างไรและจะปรับอย่างไรครับBafnet wrote:เรื่องTextBox ที่ผมเรียนถามอาจารย์ก็เพราะว่าเมื่อผมส่งค่าในTextBox ไปยังเซลที่ผมกำหนด Sheet1.Range("A1").Value = TextBox1.Value '(ซึ่งเป็นค่าวันที่ 16/04/2006)
ไม่ว่าผมจะพยายามกำหนดรูปแบบเซล A1 เป็นรูปแบบวันที่ชนิดไหน หรือเลือกกำหนดรูปแบบเอง(Custom) ค่าในเซลก็ไม่ยอมเปลี่ยน
ส่วนเรื่องตัวเลขที่คีย์ 0841234567 แล้วให้แสดงเป็น 084-1234-567 ซึ่งในเซลเราสามารถกำหนดรูปแบบได้เอง 000-0000-000 มันก็เป็นเพียงข้อสงสัยว่าแล้วในTextBoxล่ะ เขากำหนดยังไงเพื่อให้แสดงค่าแบบนี้
ยินดีครับ ถามได้เต็มที่ไม่ต้องเป็นกังวลครับ ฟอรั่มนี้สร้างมาเพื่อถามตอบปัญหากัน คุณ Bafnet สงสัยก็ถามมา ผมสงสัยก็ถามกลับไป เพื่อความกระจ่างและหากมีหนทางที่สะดวกกว่าหรือมีทางเลือกอื่นก็จะได้แนะนำกัน เพื่อให้เป็นประโยชน์กับผู้ถามผู้ตอบและผู้ติดตามอ่านทุกท่านครับBafnet wrote:ครับก็คงเรียนชี้แจงอาจารย์เพียงเท่านี้ ผมอาจจะอยากทำนั้นทำนี่มากไปหน่อย ซึ่งอาจทำให้อาจารย์ไม่สะดวกใจ หรือระอาใจ ก็ต้องขออภัยอาจารย์ด้วยนะครับ ในความอยากรู้แต่ไม่มีความรู้ของผม
จะพยายามต่อไปครับ ขอบคุณอาจารย์มากๆครับ
Code: Select all
Private Sub ComboBox1_Change()
On Error Resume Next
Set myRange = Worksheets("Sheet1").Range("A2:D30")
TextBox5.Value = Application.WorksheetFunction.VLookup(CLng(ComboBox1), myRange, 1, False)
TextBox2.Value = Application.WorksheetFunction.VLookup(CLng(ComboBox1), myRange, 2, False)
TextBox3.Value = Application.WorksheetFunction.VLookup(CLng(ComboBox1), myRange, 3, False)
TextBox3 = Application.Text(TextBox3, "dd/mm/bbbb") 'ตัวเลขในเซลล์ควรเก็บเป็นค.ศ.
TextBox4.Value = Application.WorksheetFunction.VLookup(CLng(ComboBox1), myRange, 4, False)
TextBox4 = Format(TextBox4, "000-0000-000")
'Range("C8") = DateValue(TextBox3) 'ตัวอย่างการนำค่าใน TextBox3 ไปวางกลับในเซลล์ C8 ให้เป็นค.ศ.เหมือนเดิม
If Err <> 0 Then
MsgBox "ไม่มีรายการที่ท่านเลือก", vbQuestion
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
Exit Sub
End If
End Sub
Code: Select all
Private Sub CommandButton2_Click()
Application.ScreenUpdating = False
Dim wb As Variant
Dim rt As Range
Dim rs As Range
Dim myData As Range
Dim key As Object 'Dim key As Range กรณีที่แรงเนมที่เราอ้างถึงมีสูตรอยู่ควรประกาศตัวแปรเป็นอะไรครับ
Sheet1.Range("A3:Z3").Value = Sheet1.Range("A2:Z2").Value
If txtnum.Value = "" Then
MsgBox "กดผมทำไม เจ็บนะ", vbQuestion, "BES 4U"
TextBox1.Value = ""
Exit Sub
End If
Set wb = Workbooks.Open("C:\Program Files\BES 4U\DATA\base\data.xls", False, False)
ActiveWorkbook.Worksheets("tblcustom").Select
With Workbooks("data.xls").Worksheets("tblcustom")
Set rs = Workbooks("data.xls").Worksheets("tblcustom").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
Set myData = Workbooks("data.xls").Worksheets("tblcustom").Range("A:Z")
Set key = Workbooks("data.xls").Worksheets("tblcustom").Range("AB1") 'เดิมทีเขียน Set key =Workbooks("data.xls").Worksheets("tblcustom").Range("AB1")CountIf(.Range("A:A"), .Range("AB1"))
End With
With Workbooks("BES 4U.xls").Worksheets("master")
Set rt = Workbooks("BES 4U.xls").Worksheets("master").Range("A3:Z3")
End With
On Error Resume Next
If key = "Active" Then 'เดิม If Key = "Active" then (ผมกำหนดค่าที่AB2=IF(COUNTIF(A:A,AB1)>=1,"Active","In Active")
wb.Close True
Application.ScreenUpdating = False
MsgBox "มีข้อมูลบุคคลท่านนี้แล้วครับ", vbOKOnly, "BES 4U"
Else
rt.Copy: rs.PasteSpecial xlPasteValues
Application.CutCopyMode = False
Workbooks("data.xls").Worksheets("tblcustom").Activate
myData.Select
Selection.Sort Key1:=myData, Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
wb.Close True
MsgBox "บันทึกสำเร็จครับ", vbOKOnly, "BES 4U"
Application.ScreenUpdating = True
End If
If Err > 0 Then
Exit Sub
End If
End Sub
Code: Select all
Private Sub UserForm_Initialize()
ListBox1.RowSource = "'[Book1.xlsx]Sheet1'!A2:A13"
End Sub
หากไม่เปิดขึ้นมาก่อนคิดว่าขั้นตอนเยอะขึ้นครับ ดูตัวอย่าง Code ที่นี่แล้วลองปรับใช้ดูครับBafnet wrote:จากการกำหนดค่าข้ามเวิร์กบุค มันมีปัญหาคือ ถ้าเวิร์กบุคที่เราอ้างถึงเราไม่ได้เปิดใช้งานก็เกิดdebug คือเวิร์กบุคที่ผมอ้างถึงเป็นที่ที่ผมส่งข้อมูลที่บันทึกไปเก็บไว้ ไม่ต้องการเปิด
แต่อยากให้แค่ดึงข้อมูลมาใช้