Page 3 of 3

Re: การแสดงข้อมูลที่ Filter

Posted: Fri Aug 05, 2011 8:57 pm
by Bafnet
สวัสดีครับ
ผมได้ไปตามกระทู้ที่อาจารย์บอกครับ(เป็นเรื่องราวของการบันทึกลูกค้าและพนักงาน รายการอาหาร
และได้ลองอ่านดู ไม่พบประเด็นของการกำหนดให้ listbox มีเส้นตารางเลยครับ
นอกจากประเด็น
1.การบันทึกข้อมูล
2.การกำหนดให้ Userform แสดงเต็มจอ
3.การกำหนด Rowsource ให้กับ listbox (ซึ่งในกระทู้ข้างต้นมี Listbox อยู่อันเดียว)
แต่กระทู้ข้างต้นก็ทำให้ผมเห็นการบันทึกในคำสั่งที่ใช้ Offset และส่งค่าข้อมูลจาก TextBox ไปยังตำแหน่งที่ต้องการโดยตรง
ซึ่งต่างจากคำสั่งที่ผมใช้คือ textbox ส่งค่ามาที่ Range จากนั้นจึงส่ง Range ที่กำหนดไปบันทึก ซึ่งเป็นวิธีที่อาจารย์สอนผมในคราวแรก
ข้อแตกต่างที่ได้คือการใช้ Offset ดูจะเป็นกระบวนการที่กระชับ ทุกอย่างเก็บค่าอยู่ใน Userform ชอบครับ :lol:

รบกวนเรื่องlistbox นะครับ
...อาจารย์ครับการที่เราใช้คำสั่งที่ บันทึกจากมาโคร มันมีความเสถียรแตกต่างกับการใช้คำสั่งที่เราเขียนตรงใน VBA ไหมครับ
:roll:

Re: การแสดงข้อมูลที่ Filter

Posted: Fri Aug 05, 2011 9:39 pm
by snasui
Bafnet wrote:ผมได้ไปตามกระทู้ที่อาจารย์บอกครับ(เป็นเรื่องราวของการบันทึกลูกค้าและพนักงาน รายการอาหาร
และได้ลองอ่านดู ไม่พบประเด็นของการกำหนดให้ listbox มีเส้นตารางเลยครับ
ไม่มี Properties ในการกำหนด Gridline ของ ListBox ครับ
Bafnet wrote:การที่เราใช้คำสั่งที่ บันทึกจากมาโคร มันมีความเสถียรแตกต่างกับการใช้คำสั่งที่เราเขียนตรงใน VBA ไหมครับ
ความเสถียรไม่น่าจะต่างกัน หากเขียน Code เองได้อย่างแม่นยำครับ สำหรับ Code ที่ได้จากการบันทึก Macro ย่อมมั่นใจได้ว่า Code มีความแม่นยำ ทำงานได้ถูกต้องแน่นอน แต่อาจจะได้ Code ที่เกินความจำเป็นมาให้ด้วย ซึ่งเราควรที่จะปรับออกไปให้เหลือเท่าที่จำเป็นเพื่อให้มีความกระชับทำงานได้รวดเร็ว

ผมสังเกตพบว่าส่วนใหญ่ที่ไม่เสถียรเกิดจากการเขียนของเราเองทั้งนั้นครับ เช่นเขียนวนลูบไม่รู้จักจบจนเครื่องแฮงก์ไปเอง การไม่ประกาศตัวแปร หรือประกาศตัวแปรไม่เหมาะสม ทำให้การใช้งานหน่วยความจำสิ้นเปลือง ส่งผลให้ Code ทำงานช้า นอกจากนั้นแล้วการกลับมาแก้ไขภายหลังก็ช้าด้วย เพราะจะแกะไม่ออกว่าตัวแปรที่กำลังติดตามนั้นคืออะไร :lol:

Re: การแสดงข้อมูลที่ Filter

Posted: Fri Aug 05, 2011 10:49 pm
by Bafnet
สวัสดีครับ...อาจารย์ครับที่บอกว่า
"ไม่มี Properties ในการกำหนด Gridline ของ ListBox ครับ"
ไม่เข้าใจจริงๆครับ :roll:
ผมลองดูใน Properties ของ ListBox ด้านซ้ายมือ ก็ไม่เจอ Properties/Gridline ของ ListBox
หรืออาจารย์จะบอกว่า เมื่อไม่มี Properties/Gridline ของ ListBox ก็จะกำหนดให้ ListBox มีเส้นตารางไม่ได้
ถ้าตามไฟล์ตัวอย่างที่ผมส่งไป ถ้าเราจะให้ ListBox มีเส้นตารางเหมือนข้อมูลที่ชีทที่เป็น Rowsource
ไม่เข้าใจครับ ขออภัยจริงๆ

Re: การแสดงข้อมูลที่ Filter

Posted: Fri Aug 05, 2011 11:04 pm
by snasui
Bafnet wrote:หรืออาจารย์จะบอกว่า เมื่อไม่มี Properties/Gridline ของ ListBox ก็จะกำหนดให้ ListBox มีเส้นตารางไม่ได้
ครับ เข้าใจถูกต้องร้อยเปอร์เซ็นต์เต็มเปรี๊ยะไม่มีหย่อนแม้แต่นิดเดียวครับ :lol:

ดูเหมือนจะงงเรื่อง Properties อยู่นะครับ :?

Properties คือคุณลักษณะที่มีของ Object เพื่อให้เรากำหนดค่าได้ เช่น กว้าง, สูง, ชิดซ้าย, ชิดขวา, เอียง, บาง, หนา ฯลฯ

ส่วน Method คือ Action หรือการกระทำของ Object เช่น Copy, Paste, Add, Delete, Refresh เป็นต้น

ซึ่ง Properties และ Method นี้แต่ละ Object มีไม่เหมือนกัน เช่น ListBox โดยค่า Default แล้วไม่มี Properties ที่เป็น Greidline หรือเส้นตาราง ก็ไม่สามารถกำหนดค่าให้มันมีได้ หากจะกำหนดให้มีก็อาจจะใช้เทคนิคอื่นเข้ามาช่วย ยกตัวอย่างเช่นเขียน Class เพื่อสร้าง Gridline ขึ้นมาใช้กับ ListBox เองหรือไปเรียกฟังก์ชั่นของ Windows ผ่านฟังก์ชั่นที่เรียกว่า API (Application Programming Interface) มาใช้

Re: การแสดงข้อมูลที่ Filter

Posted: Fri Aug 05, 2011 11:35 pm
by Bafnet
:lol: ผมก็เลยงง. เพราะตอนหัดเขียนVB ได้ตำราของVB6 ตอนนั้นไม่มีหนังสือ Excell ก็เห็น Properties/Gridline ของ ListBox
ผมทราบตั้งแต่แรกครับว่าในexell Properties/Gridline ของ ListBox ในexell ไม่มี
snasui wrote::D เราสามารถทำ ListBox ให้มีลักษณะเหมือนตารางได้ตามจำนวนคอลัมน์และจำนวน List ได้ครับ
ลองส่งไฟล์ตัวอย่างมาดูจะได้ทดสอบได้สะดวกครับ
เลยคิดว่ามีวิธี
เดี๋ยวมาใหม่ครับ ไปทำต่อจะได้มีปัญหาๆๆมาถามอาจารย์ต่อ :lol:
ขอบคุณครับ

Re: การแสดงข้อมูลที่ Filter

Posted: Sat Aug 06, 2011 12:00 am
by snasui
:D ผมอาจจะพูดย่อไปหน่อยครับ เหมือนตารางหมายถึงมีลักษณะแถวและคอลัมน์ครับ :P

Re: การแสดงข้อมูลที่ Filter

Posted: Sun Aug 07, 2011 12:30 am
by Bafnet
สวัสดีครับอาจารย์
อ่า...อันนี้ต้องให้อาจารย์ช่วยครับ

Private Sub Report()
Dim ri As Range
On Error Resume Next
With Workbooks("DumP.xlsm").Worksheets("Report")
Set ri = .Range(.Range("A1"), .Range("I65536") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ri.Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
ri.PrintOut
End Sub

อาจารย์ครับมีสั้นและกระชับกว่านี้ไหมครับ เพื่อกำหนดให้ ri มีเส้นตาราง ขอจริงๆครับ

ประเด็นที่ 2 Worksheets("Report") เป็นชีทที่รับค่าข้อมูล ซึ่งข้อมูลมีลักษณะต่างกันตามข้อมูลที่ผู้ใช้เรียก
ความต้องการคือ หลังจาก

Private Sub Report()
Dim ri As Range
On Error Resume Next
With Workbooks("DumP.xlsm").Worksheets("Report")
Set ri = .Range(.Range("A1"), .Range("I65536") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ri.Select
จะกำหนดค่าอย่างไรให้ ช่วงความกว้างของ Columm ของช่วงข้อมูล ri มีความกว้างพอดีกับเนื้อหา
(เนื้อหาที่มากที่สุดของแต่ละคอลัมม์)


รบกวนด้วยนะครับ ช่วยด้วยนะครับ :flw:

Re: การแสดงข้อมูลที่ Filter

Posted: Sun Aug 07, 2011 12:54 am
by Bafnet
สวัสดีครับ.(อีกครั้ง)
ประเด็นที่2 ได้แล้วครับ

Private Sub Report()
Dim ri As Range
On Error Resume Next
With Workbooks("DumP.xlsm").Worksheets("Report")
Set ri = .Range(.Range("A1"), .Range("I65536") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ri.Select
Selection.EntireColumn.AutoFit

:lol: ขอบคุณมากๆครับ รบกวนอาจารย์ประเด็นที่ 1 นะครับ(ที่สั้นกว่านั้น)

Re: การแสดงข้อมูลที่ Filter

Posted: Sun Aug 07, 2011 1:36 am
by Bafnet
สวัสดีอีกครั้งครับ..อาจารย์
ประเด็นที่1.สั้นกว่า...พยายามได้ดังนี้ครับ

Private Sub Report()
Dim ri As Range
On Error Resume Next
With Worksheets("Sheet1")
Set ri = .Range(.Range("B1"), .Range("I65536") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ri.Select
Selection.EntireColumn.AutoFit
ri.Borders(xlDiagonalDown).LineStyle = xlNone
ri.Borders(xlDiagonalUp).LineStyle = xlNone
ri.Borders(xlEdgeLeft).LineStyle = xlContinuous
ri.Borders(xlEdgeTop).LineStyle = xlContinuous
ri.Borders(xlEdgeBottom).LineStyle = xlContinuous
ri.Borders(xlEdgeRight).LineStyle = xlContinuous
ri.Borders(xlInsideHorizontal).LineStyle = xlContinuous
ri.Borders(xlInsideVertical).LineStyle = xlContinuous
ri.PrintPreview
End Sub

มีสั้นกว่าอีกมั๊ยครับอาจารย์ ผมรบกวนอาจารย์อีกเรื่องนะครับ จากคำสั่งข้างต้น ผมต้องเขียน ri.ทุกครั้งที่มีคำสั่ง
รบกวนสอนวิธีเขียนแบบว่า ri.คำสั่งแรก, คำสั่งที่2, คำสั่งที่3... (ri.ครั้งเดียว ไม่ต้องชี้ข้อมูลทุกครั้ง :lol: )

ขอบคุณครับ...1.35 ไปนอนก่อนนะครับ :D

Re: การแสดงข้อมูลที่ Filter

Posted: Sun Aug 07, 2011 7:06 am
by snasui
:D สามารถใช้ With เข้ามาช่วยเพื่อไม่ต้องอ้างถึง Object ซ้ำ ๆ ตามตัวอย่างด้านล่างครับ

Code: Select all

Selection.EntireColumn.AutoFit
With Selection
   .Borders(xlEdgeLeft).LineStyle = xlContinuous
   .Borders(xlEdgeTop).LineStyle = xlContinuous
   .Borders(xlEdgeBottom).LineStyle = xlContinuous
   .Borders(xlEdgeRight).LineStyle = xlContinuous
   .Borders(xlInsideHorizontal).LineStyle = xlContinuous
   .Borders(xlInsideVertical).LineStyle = xlContinuous
End With