กระทู้เก่าบอร์ด อ.Yeadram
3,324 10
URL.หัวข้อ /
URL
ต้องการสร้าง Textbox และกำหนดชื่อได้ด้วย
Dim stDocName2 As String
stDocName2 = "Report1"
Dim Ctltext As Control
Set Ctltext = CreateReportControl(stDocName2, acTextBox,,, "=" & VarR(i), 0, TopR(i), WidthR(i), HeightR(i))
สร้าง TEXTBOX ได้แล้วครับ ติดตรงชื่อมันกำหนดให้เอง เช่น TEXT169
TEXT200 แล้วแต่ค่า Defalt ของรายงาน แต่ผมต้องการให้ตั้งชื่อได้โดยการเขียน
Code กำกับเลยเช่น ExternalText1 เป็นต้นทำอย่างไรครับ หรือถ้าไม่ได้ มีวิธีการ Rename Textbox ด้วยการเขียน Code ไหมครับ
หมายเหตุ Code นี้ใช้ในมุมมอง Report Desing เมื่อสร้างเสร็จ สั่ง Preview ทันที
เมื่อ Close Report จะต้องลบ Textbox ที่สร้างเมื่อกี้ออกทันที
stDocName2 = "Report1"
Dim Ctltext As Control
Set Ctltext = CreateReportControl(stDocName2, acTextBox,,, "=" & VarR(i), 0, TopR(i), WidthR(i), HeightR(i))
สร้าง TEXTBOX ได้แล้วครับ ติดตรงชื่อมันกำหนดให้เอง เช่น TEXT169
TEXT200 แล้วแต่ค่า Defalt ของรายงาน แต่ผมต้องการให้ตั้งชื่อได้โดยการเขียน
Code กำกับเลยเช่น ExternalText1 เป็นต้นทำอย่างไรครับ หรือถ้าไม่ได้ มีวิธีการ Rename Textbox ด้วยการเขียน Code ไหมครับ
หมายเหตุ Code นี้ใช้ในมุมมอง Report Desing เมื่อสร้างเสร็จ สั่ง Preview ทันที
เมื่อ Close Report จะต้องลบ Textbox ที่สร้างเมื่อกี้ออกทันที
10 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R08065
3 @R08093
สร้าง Textbox พร้อมชื่อได้ตามคำแนะนำแล้วครับ แต่ทุกอย่างไม่เป็นอย่างหวังครับ
ไม่สำเร็จ ผมคิดแผนการคร่าวๆ ดังนี้
1.ต้องการเปลี่ยนตัวเลขทุกตัวใน Report ที่เป็น อารบิค เป็นเลขไทย ไม่ว่าข้อมูลนั้นจะเป็นวันที่ , TEXT , Number ก็ตาม
2.ผมไม่ต้องการสร้างรายงานตัวใหม่ขึ้นมา(มีหลาย Report แก้ไม่ไหว) รวมทั้งไม่ต้องการแก้ไขข้อมูลของรายงานที่มีอยู่แล้ว เพื่อให้ User เลือกเองว่าจะเอาเลขไทย เลขอะรบิค
3.ผมจึงเขียน Function ขึ้นมาแก้ปัญหา โดยมีแนวคิดดังนี้
3.1 User เลือก เอา Thai หรืออราบิค ถ้าอราบิค เปิดรายงานต้นฉบับ
3.2 ถ้าเลือก Thai ผม Copy รายงานเดิม มาเป็น TempReport ในมุมมอง Desinge เขียน Code มาตรวจสอบ Control แต่ละตัวว่าเป็น TEXTBOX หรือไม่ ถ้าใช่ Copy เป็น Control ตัวใหม่(วางไว้ที่เดิม) ส่งค่าใน Control ตัวใหม่เข้า Function แปลงเป็นค่าเป็นเลขไทย , Control เดิม Visible=false ไว้
****ตรงส่งค่า ในมุมมอง Design นี่แหละครับ ที่ไม่แน่ใจว่า ตัวแปรที่ส่งให้ มันเป็น TEXT หรือตัวเลขแน่ เช่น text1=amount*15 (Amount=2)
Field amount เป็นจำนวน ถ้าส่งค่าเข้า Function แปลงเลขไทยก็เท่ากับ 30 เป็นเลขอารบิคเหมือนเดิมครับ
แต่ถ้า text1=15 ถ้าส่งค่าเข้า Function แปลงเลขไทยก็เท่ากับ ๑๕ ได้ตามที่ต้องการ ตอนนี้สันนิฐานว่าเป็น TEXT (ถ้าเป็น Text จะไปเก็บค่า ที่มันคูณกันแล้ว เท่ากับ 30 แล้วมาใส่ฟังชั่น ในเหตุการณ์ตอนไหนดีครับ)
หรือใครมีวิธีที่ง่ายกว่านี้ แนะนำด้วยครับ เอาเป็นแนวคิดก็ได้
ไม่สำเร็จ ผมคิดแผนการคร่าวๆ ดังนี้
1.ต้องการเปลี่ยนตัวเลขทุกตัวใน Report ที่เป็น อารบิค เป็นเลขไทย ไม่ว่าข้อมูลนั้นจะเป็นวันที่ , TEXT , Number ก็ตาม
2.ผมไม่ต้องการสร้างรายงานตัวใหม่ขึ้นมา(มีหลาย Report แก้ไม่ไหว) รวมทั้งไม่ต้องการแก้ไขข้อมูลของรายงานที่มีอยู่แล้ว เพื่อให้ User เลือกเองว่าจะเอาเลขไทย เลขอะรบิค
3.ผมจึงเขียน Function ขึ้นมาแก้ปัญหา โดยมีแนวคิดดังนี้
3.1 User เลือก เอา Thai หรืออราบิค ถ้าอราบิค เปิดรายงานต้นฉบับ
3.2 ถ้าเลือก Thai ผม Copy รายงานเดิม มาเป็น TempReport ในมุมมอง Desinge เขียน Code มาตรวจสอบ Control แต่ละตัวว่าเป็น TEXTBOX หรือไม่ ถ้าใช่ Copy เป็น Control ตัวใหม่(วางไว้ที่เดิม) ส่งค่าใน Control ตัวใหม่เข้า Function แปลงเป็นค่าเป็นเลขไทย , Control เดิม Visible=false ไว้
****ตรงส่งค่า ในมุมมอง Design นี่แหละครับ ที่ไม่แน่ใจว่า ตัวแปรที่ส่งให้ มันเป็น TEXT หรือตัวเลขแน่ เช่น text1=amount*15 (Amount=2)
Field amount เป็นจำนวน ถ้าส่งค่าเข้า Function แปลงเลขไทยก็เท่ากับ 30 เป็นเลขอารบิคเหมือนเดิมครับ
แต่ถ้า text1=15 ถ้าส่งค่าเข้า Function แปลงเลขไทยก็เท่ากับ ๑๕ ได้ตามที่ต้องการ ตอนนี้สันนิฐานว่าเป็น TEXT (ถ้าเป็น Text จะไปเก็บค่า ที่มันคูณกันแล้ว เท่ากับ 30 แล้วมาใส่ฟังชั่น ในเหตุการณ์ตอนไหนดีครับ)
หรือใครมีวิธีที่ง่ายกว่านี้ แนะนำด้วยครับ เอาเป็นแนวคิดก็ได้
4 @R08097
ถ้ารายงานของคุณมี textbox บางตัวใช้คำนวนเช่น
text3 แสดงผลของการคำนวน คือ เอาค่าใน text0 คูณ text1 ( =[text0] * [text1] )
แบบนี้ผมจะเปลี่ยนจากการอ้างอิงชื่อคอนโทรลให้เป็นการอ้างอิงชื่อฟิลด์แทน
จากตัวอย่างสมมติว่า
text0 ผูกกับฟิลด์ Quantity
text1 ผูกกับฟิลด์ Price
text3 เดิมเขียนนิพจน์ว่า =[text0] * [text1]
ผมจะเปลี่ยนนิพจน์ของ text3 เป็น =[quantity] * [Price] แทน
เวลาเขียนโค้ดหรือเพิ่มโค้ดแปลงเลขไทย
ในกรณีผู้ใช้เลือกแสดงผลแบบไทย
dim ctl as control
for each ctl in controls
if typeof ctl is textbox
if left(ctl.controlsource,1) = "=" then
' textbox ตัวนี้เป็นนิพจน์แน่นอน เพราะขึ้นต้นด้วยเครื่องหมาย เท่ากับ
' เราต้องเอาเครื่องหมาย เท่ากับออกก่อนจะส่งค่าเข้าฟังก์ชั่น
ctl.controlsource = "=ChangeToThai(" & trim(mid(ctl.controlsource,2)) & ")"
else
ctl.controlsource = "=ChangeToThai(" & ctl.controlsource & ")"
end if
end if
next
::::::: โดยที่ ChangToThai คือชื่อฟังก์ชั่นแปลงอารบิคเป็นไทย รับอาร์กิวเมนต์เป็น string
ไม่ทราบว่าแนวทางนี้ได้ทดลองหรือยังครับ ได้ผลหรือไม่ได้ผลประการใด
ถ้ามันได้ผลก็จะเห็นได้ว่า เราไม่ต้องไปสร้างหรือเปลี่ยนแปลงคอนโทรลอะไรเลยครับ
report_open()
.....
...
if ... เข้าทางเลือกไทย
แนวทางโค้ดตามตัวอย่างของผม
end if
...
...
end sub
Function ChangeToThai(byval xxx as string) as string
...
...
...
ChangeToThai = "......."
End Function
text3 แสดงผลของการคำนวน คือ เอาค่าใน text0 คูณ text1 ( =[text0] * [text1] )
แบบนี้ผมจะเปลี่ยนจากการอ้างอิงชื่อคอนโทรลให้เป็นการอ้างอิงชื่อฟิลด์แทน
จากตัวอย่างสมมติว่า
text0 ผูกกับฟิลด์ Quantity
text1 ผูกกับฟิลด์ Price
text3 เดิมเขียนนิพจน์ว่า =[text0] * [text1]
ผมจะเปลี่ยนนิพจน์ของ text3 เป็น =[quantity] * [Price] แทน
เวลาเขียนโค้ดหรือเพิ่มโค้ดแปลงเลขไทย
ในกรณีผู้ใช้เลือกแสดงผลแบบไทย
dim ctl as control
for each ctl in controls
if typeof ctl is textbox
if left(ctl.controlsource,1) = "=" then
' textbox ตัวนี้เป็นนิพจน์แน่นอน เพราะขึ้นต้นด้วยเครื่องหมาย เท่ากับ
' เราต้องเอาเครื่องหมาย เท่ากับออกก่อนจะส่งค่าเข้าฟังก์ชั่น
ctl.controlsource = "=ChangeToThai(" & trim(mid(ctl.controlsource,2)) & ")"
else
ctl.controlsource = "=ChangeToThai(" & ctl.controlsource & ")"
end if
end if
next
::::::: โดยที่ ChangToThai คือชื่อฟังก์ชั่นแปลงอารบิคเป็นไทย รับอาร์กิวเมนต์เป็น string
ไม่ทราบว่าแนวทางนี้ได้ทดลองหรือยังครับ ได้ผลหรือไม่ได้ผลประการใด
ถ้ามันได้ผลก็จะเห็นได้ว่า เราไม่ต้องไปสร้างหรือเปลี่ยนแปลงคอนโทรลอะไรเลยครับ
report_open()
.....
...
if ... เข้าทางเลือกไทย
แนวทางโค้ดตามตัวอย่างของผม
end if
...
...
end sub
Function ChangeToThai(byval xxx as string) as string
...
...
...
ChangeToThai = "......."
End Function
5 @R08101
อยากจะขอเอาไปใช้เป็นแนวทางในการ design
Function CreateReportControl น่าสนใจดี
ลองอ่านดูแล้วยังงงเรื่องวัตถุประสงค์นิดนึงหนะครับ ผมขอสรุปว่า
...ขี้เกียจแก้ report ใช่ไหมครับ ก็เลยจะเขียน code เพื่อแก้ report แทน
โดยถ้า control ตัวไหนที่เป็นตัวเลข ให้ไปดูว่าผู้ใช้ต้องการแสดงเป็นไทยหรืออารบิก ให้แสดงตัวเลขตามนั้น (หรือเปล่าครับ)
?ไม่เกี่ยวกับตัวเลขหรือตัวหนังสือที่มีอยู่ตายตัวอยู่แล้วใช่ไหมครับ เช่นตัวเลขหรือตัวหนังสือที่สร้างอยู่ใน label
ถ้าเป็นอย่างนั้น เห็นด้วยกับแนวทางแก้ไขที่คุณ yeadram แนะนำครับคือเพิ่ม function สำหรับแปลงไทยลงไปใน contorl ตัวเดิม ใน report เดิมไม่ต้อง create control ใหม่แทน
แต่ถ้าไม่ใช่ ช่วยอธิบายเป็นวิทยาทานหน่อยนะได้ไหมครับ จะได้ศึกษาเอาไว้เป็นความรู้
Function CreateReportControl น่าสนใจดี
ลองอ่านดูแล้วยังงงเรื่องวัตถุประสงค์นิดนึงหนะครับ ผมขอสรุปว่า
...ขี้เกียจแก้ report ใช่ไหมครับ ก็เลยจะเขียน code เพื่อแก้ report แทน
โดยถ้า control ตัวไหนที่เป็นตัวเลข ให้ไปดูว่าผู้ใช้ต้องการแสดงเป็นไทยหรืออารบิก ให้แสดงตัวเลขตามนั้น (หรือเปล่าครับ)
?ไม่เกี่ยวกับตัวเลขหรือตัวหนังสือที่มีอยู่ตายตัวอยู่แล้วใช่ไหมครับ เช่นตัวเลขหรือตัวหนังสือที่สร้างอยู่ใน label
ถ้าเป็นอย่างนั้น เห็นด้วยกับแนวทางแก้ไขที่คุณ yeadram แนะนำครับคือเพิ่ม function สำหรับแปลงไทยลงไปใน contorl ตัวเดิม ใน report เดิมไม่ต้อง create control ใหม่แทน
แต่ถ้าไม่ใช่ ช่วยอธิบายเป็นวิทยาทานหน่อยนะได้ไหมครับ จะได้ศึกษาเอาไว้เป็นความรู้
6 @R08103
ถ้าเข้าใจไม่ผิดว่าต้องการให้สามารถเลือกแสดงเป็นเลขไทย หรือ เลขอารบิค ไม่ว่าตัวเลขนั้นจะมีค่าเป็น numeric หรือ string ก็ตาม ก็ลองวิธีนี้ดู (ตย.นี้ภายใต้ Windows XP และ Access XP)
1. ใน Control Panel - Regional and Language Options - Regional Option page เลือกเป็น "ไทย" และใน Customize button - Numbers page - Standard Digits combobox ให้เลือกเป็นเลข อารบิค 0123456789 ใน Date page เลือก คริสศักราช หรือ พุทธศักราช ให้ตรงกับระบบที่เดิมใช้ก่อนเปลี่ยนครั้งนี้ รวมทั้ง Short Date Format และ Long Date Format ด้วยเช่นกัน
2. ใน Form หรือ Report ตรงไหนที่เป็น label, textbox, listbox, หรือ combobox ที่ต้องการเปลี่ยนตัวเลขเป็นไทย ให้กำหนด NumeralShapes property เป็น National (มีค่าเป็น 2) อาจโดย Property Sheet หรือกำหนดด้วย VBA ก็ได้ เช่น Me.Textbox0.NumeralShapes = 2
ถ้าต้องการให้กลับมาเป็นไปตามที่กำหนดใน Regional and Language Options ก็ให้เลือกเป็น System (มีค่าเป็น 0)
ถ้าจะบังคับให้เป็นอารบิคโดยไม่สนใจที่กำหนดใน Regional and Language Options ก็ให้เลือกเป็น Arabic (มีค่าเป็น 1) ครับ
สามารถใช้ลูปที่ อ.Yeadram ให้ไว้ เอามาใช้ได้ครับ
dim ctl as control
for each ctl in controls
if typeof ctl is textbox
ctl.NumeralShapes = 0 หรือ 1 หรือ 2
end if
next
ลองเล่นดูครับ
1. ใน Control Panel - Regional and Language Options - Regional Option page เลือกเป็น "ไทย" และใน Customize button - Numbers page - Standard Digits combobox ให้เลือกเป็นเลข อารบิค 0123456789 ใน Date page เลือก คริสศักราช หรือ พุทธศักราช ให้ตรงกับระบบที่เดิมใช้ก่อนเปลี่ยนครั้งนี้ รวมทั้ง Short Date Format และ Long Date Format ด้วยเช่นกัน
2. ใน Form หรือ Report ตรงไหนที่เป็น label, textbox, listbox, หรือ combobox ที่ต้องการเปลี่ยนตัวเลขเป็นไทย ให้กำหนด NumeralShapes property เป็น National (มีค่าเป็น 2) อาจโดย Property Sheet หรือกำหนดด้วย VBA ก็ได้ เช่น Me.Textbox0.NumeralShapes = 2
ถ้าต้องการให้กลับมาเป็นไปตามที่กำหนดใน Regional and Language Options ก็ให้เลือกเป็น System (มีค่าเป็น 0)
ถ้าจะบังคับให้เป็นอารบิคโดยไม่สนใจที่กำหนดใน Regional and Language Options ก็ให้เลือกเป็น Arabic (มีค่าเป็น 1) ครับ
สามารถใช้ลูปที่ อ.Yeadram ให้ไว้ เอามาใช้ได้ครับ
dim ctl as control
for each ctl in controls
if typeof ctl is textbox
ctl.NumeralShapes = 0 หรือ 1 หรือ 2
end if
next
ลองเล่นดูครับ
7 @R08130
มารายงานผลครับ ลองทำตามที่ อ.Yeadram แนะนำครับ ตรง Code ส่วนบนเข้าใจทั้งหมดแล้วครับ เหลือแต่ Function ChangeToThai
ซึ่งผมต้องพัฒนาเอง ให้มัน แปลงค่า ข้อมูล วันที่ ตัวเลข ตัวหนังสือ ให้ออกมาเป็นตัวเลขไทยให้ได้โดยไม่ Error กำลังทำอยู่ครับ แล้วจะกลับมารายงานผลเป็นระยะ
ตอบ คุณแดน
1.ผมขี้เกียจแก้ report ซึ่งมีมาก ก็เลยจะเขียน code เพื่อแก้ report แทนครับ>>> ถูกต้องแล้วครับ
2.เอาแต่ Textbox ไม่เอา Label ครับ
3.Texbox บางตัวถูกเขียนเชื่อมด้วย Field,Funtion หลายตัวเช่น
=HO() & " " & PROVICEF() & " มีความประสงค์สั่ง" & [buyorjang] & [Type] & " จาก" & [name_thai] & "ดังรายการต่อไปนี้"
ซึ่งผมต้องพัฒนาเอง ให้มัน แปลงค่า ข้อมูล วันที่ ตัวเลข ตัวหนังสือ ให้ออกมาเป็นตัวเลขไทยให้ได้โดยไม่ Error กำลังทำอยู่ครับ แล้วจะกลับมารายงานผลเป็นระยะ
ตอบ คุณแดน
1.ผมขี้เกียจแก้ report ซึ่งมีมาก ก็เลยจะเขียน code เพื่อแก้ report แทนครับ>>> ถูกต้องแล้วครับ
2.เอาแต่ Textbox ไม่เอา Label ครับ
3.Texbox บางตัวถูกเขียนเชื่อมด้วย Field,Funtion หลายตัวเช่น
=HO() & " " & PROVICEF() & " มีความประสงค์สั่ง" & [buyorjang] & [Type] & " จาก" & [name_thai] & "ดังรายการต่อไปนี้"
8 @R08136
อาฮะ... พอเข้าใจถึงความลำบากในการประยุตร์สูตรเดียวใช้กับทุก control แล้วครับ
แต่ลองสูตรที่ผมให้ไปได้ปะครับ
Function ThaiNumber(Exp As Variant, strFormat As String)
Dim Nw As String
Nw = Format(Exp, strFormat)
For i = 0 To 9
Nw = Replace(Nw, i, Chr(i + 240))
Next
ThaiNumber = Nw
End Function
แล้วก็ใช้การ Replace Control Source ของ อ.Yeadram
แต่ต้องปรับแก้หน่อยตรงท้ายเพื่อให้เข้ากับสูตรของผม
Dim ctl as control
Dim Tail as string
For each ctl in controls
if typeof ctl is textbox
Tail = ",[" & Ctl.Name & "].[Format])"
if left(ctl.controlsource,1) = "=" then
ctl.controlsource = "=ChangeToThai(" & trim(mid(ctl.controlsource,2)) & Tail
else
ctl.controlsource = "=ThaiNumber(" & ctl.controlsource & Tail
end if
end if
next
แต่ลองสูตรที่ผมให้ไปได้ปะครับ
Function ThaiNumber(Exp As Variant, strFormat As String)
Dim Nw As String
Nw = Format(Exp, strFormat)
For i = 0 To 9
Nw = Replace(Nw, i, Chr(i + 240))
Next
ThaiNumber = Nw
End Function
แล้วก็ใช้การ Replace Control Source ของ อ.Yeadram
แต่ต้องปรับแก้หน่อยตรงท้ายเพื่อให้เข้ากับสูตรของผม
Dim ctl as control
Dim Tail as string
For each ctl in controls
if typeof ctl is textbox
Tail = ",[" & Ctl.Name & "].[Format])"
if left(ctl.controlsource,1) = "=" then
ctl.controlsource = "=ChangeToThai(" & trim(mid(ctl.controlsource,2)) & Tail
else
ctl.controlsource = "=ThaiNumber(" & ctl.controlsource & Tail
end if
end if
next
9 @R08137
^
^
โทษทีแก้ไม่หมด... ต้องแก้เป็นชื่อสูตรของผมด้วยนะครับ ThaiNumber
^
โทษทีแก้ไม่หมด... ต้องแก้เป็นชื่อสูตรของผมด้วยนะครับ ThaiNumber
10 @R08368
วิธีของ อ.สันติสุข เป็นวิธีที่ง่ายที่สุดแล้วครับ
วิธีเขียน Function นั้นยากมาก หัวระดับผมทำไม่ได้แน่ มีข้อจำกัดหลายอย่าง
โดยเฉพาะ TEXTBOX ที่บรรจุด้วยการเชื่อม Fied+Text+function เข้าด้วยกัน เช่น
=HO() & " " & PROVICEF() & " มีความประสงค์สั่ง" & [buyorjang] & [Type] & " จาก" & [name_thai] & "ดังรายการต่อไปนี้"
ผมเลยล้มเลิกที่จะเขียน Function แล้วครับ
วิธีเขียน Function นั้นยากมาก หัวระดับผมทำไม่ได้แน่ มีข้อจำกัดหลายอย่าง
โดยเฉพาะ TEXTBOX ที่บรรจุด้วยการเชื่อม Fied+Text+function เข้าด้วยกัน เช่น
=HO() & " " & PROVICEF() & " มีความประสงค์สั่ง" & [buyorjang] & [Type] & " จาก" & [name_thai] & "ดังรายการต่อไปนี้"
ผมเลยล้มเลิกที่จะเขียน Function แล้วครับ
Time: 0.2803s
Ctltext.Name = "??"
ฟังก์ชั่นนี้ มาจากไหน CreateReportControl() สร้างมาเองหรือเปล่า หรือมาจาก access เวอร์ชั่นไหนครับ ผมไม่เคยเห็น
ถ้าเป็นฟังก์ชั่นที่เขียนขึนเอง ก็อาจจะไปเพิ่มคำสั่งการกำหนดชื่อจากในนั้นเลยก็ได้ครับ เราก็แค่ ส่ง ชื่อเข้าไปเป็นอีก 1 อากิวเมนต์ ในตอนเรียกใช้ฟังก์ชั่นครับ
Set Ctltext =createcontrol......
Ctltext.name=....