กระทู้เก่าบอร์ด อ.Yeadram
1,478 5
URL.หัวข้อ /
URL
เรียก word ผ่าน ปุ่ม commandในaccess 2003 มีปัญหา
ผมมีเรื่องรบกวนถามอาจารย์ทุกท่าน
ผมดึงข้อมูลจาก access 2003 มาทำปกรายงงาน
โดยexport data เป็นexcel เพื่อเป็นฐานข้อมูลในการMail Merge
ปกรายงานของผมชื่อ pok.doc ใช้ข้อมูล จาก excel ที่ export มา แล้ว
มา Mail Merge แล้วพิมพ์ ได้เอกสารตามที่ต้องการ
ในaccess 2003 file ที่ ผมทำงาน ผมเขียนคำสั่งว่า
เมื่อกดปุ่ม command16 ให้ดำเนินการดังนี้
Dim dd as string
dd = "C:\pok_data\pok.xls"
DoCmd.OutputTo acOutputQuery, "sql_pok_excel", acFormatXLS, dd
Me.Command16.HyperlinkAddress = "C:\pok_data\pok.doc"
กดปุ่มแล้ว สามารถแสดงเอกสารที่ต้องการพิมพ์ได้
-ปัญหาคือ
1. เวลาที่ file pok.doc เปิดเอกสารมาเพื่อพิมพ์ จะต้องมีข้อความเตือนหน้าจอ
Open this document will run the following sql command
Sql * from ddd:
Data from your database will be place in the document
Do you want to continue ?
ซ้อนไปบน หน้าจอ access ที่ผมกำลังดำเนินการอยู่ทุกครั้ง
เมื่อกดตกลง ก็จะมีเอกสาร pok.doc ปรากฏขึ้นมาให้สามารถ ดำเนินการได้
ผมจะต้องทำอย่างไร เมื่อเรียกเอกสาร
Me.Command16.HyperlinkAddress = "C:\pok_data\pok.doc"
เอกสาร pok.doc จึงจะขึ้นมาเลยโดยไม่มีข้อความเตือนดังกล่าว
2. บางครั้งข้อความเตือน ไปซ่อนอยู่ด้านหลัง access ที่ผมเปิดอยู่ ไม่ยอมให้พิมพ์งาน จะต้องปิด access ออกไปก่อน จึงจะเห็นข้อความดังกล่าว อยู่ที่หน้าจอ
จะแก้ปัญหานี้อย่างไรครับ
หมายเหตุ : ผมใช้ notebook ไม่รู้จะprint screen จากหน้าจออย่างไร ขอทราบวิธี print screen ด้วยครับ
ผมดึงข้อมูลจาก access 2003 มาทำปกรายงงาน
โดยexport data เป็นexcel เพื่อเป็นฐานข้อมูลในการMail Merge
ปกรายงานของผมชื่อ pok.doc ใช้ข้อมูล จาก excel ที่ export มา แล้ว
มา Mail Merge แล้วพิมพ์ ได้เอกสารตามที่ต้องการ
ในaccess 2003 file ที่ ผมทำงาน ผมเขียนคำสั่งว่า
เมื่อกดปุ่ม command16 ให้ดำเนินการดังนี้
Dim dd as string
dd = "C:\pok_data\pok.xls"
DoCmd.OutputTo acOutputQuery, "sql_pok_excel", acFormatXLS, dd
Me.Command16.HyperlinkAddress = "C:\pok_data\pok.doc"
กดปุ่มแล้ว สามารถแสดงเอกสารที่ต้องการพิมพ์ได้
-ปัญหาคือ
1. เวลาที่ file pok.doc เปิดเอกสารมาเพื่อพิมพ์ จะต้องมีข้อความเตือนหน้าจอ
Open this document will run the following sql command
Sql * from ddd:
Data from your database will be place in the document
Do you want to continue ?
ซ้อนไปบน หน้าจอ access ที่ผมกำลังดำเนินการอยู่ทุกครั้ง
เมื่อกดตกลง ก็จะมีเอกสาร pok.doc ปรากฏขึ้นมาให้สามารถ ดำเนินการได้
ผมจะต้องทำอย่างไร เมื่อเรียกเอกสาร
Me.Command16.HyperlinkAddress = "C:\pok_data\pok.doc"
เอกสาร pok.doc จึงจะขึ้นมาเลยโดยไม่มีข้อความเตือนดังกล่าว
2. บางครั้งข้อความเตือน ไปซ่อนอยู่ด้านหลัง access ที่ผมเปิดอยู่ ไม่ยอมให้พิมพ์งาน จะต้องปิด access ออกไปก่อน จึงจะเห็นข้อความดังกล่าว อยู่ที่หน้าจอ
จะแก้ปัญหานี้อย่างไรครับ
หมายเหตุ : ผมใช้ notebook ไม่รู้จะprint screen จากหน้าจออย่างไร ขอทราบวิธี print screen ด้วยครับ
5 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R17907
ตอนนี้ผมใช้ Office 2013 ใช้คำสั่งนี้เรียกได้ปกตินะครับ แต่คุ้นๆว่าตอนใช้ Office 2010 ถ้าเรียกโดยการใช้คำสั่ง Hyperlink เปิดไฟล์ของ MS Office จะมีข้อความเตือนขึ้นมาทุกครั้งแต่ไม่รู้ใช่แบบของคุณหรือเปล่านะครับ ไม่ว่าจะเป็น
Me.Command16.HyperlinkAddress = "C:\pok_data\pok.doc"
หรือ
Application.FollowHyperlink "C:\pok_data\pok.doc"
*ผมก็เลยเลี่ยงไปใช้ VB script แทนเป็นอย่างนี้ครับ
CreateObject("WScript.Shell").Run """" & "C:\pok_data\pok.doc" & """"
ลองดูครับ
Me.Command16.HyperlinkAddress = "C:\pok_data\pok.doc"
หรือ
Application.FollowHyperlink "C:\pok_data\pok.doc"
*ผมก็เลยเลี่ยงไปใช้ VB script แทนเป็นอย่างนี้ครับ
CreateObject("WScript.Shell").Run """" & "C:\pok_data\pok.doc" & """"
ลองดูครับ
3 @R17909
ขอบคุณครับ แก้ปัญหาข้อสองได้
คือเรียก 15 ครั้ง ก็ขึ้น 15 ครั้ง ไม่ซ่อนอยู่ข้างหลัง
แต่ยังมีข้อความ
Open this document will run the following sql command
Sql * from ddd:
Data from your database will be place in the document
Do you want to continue ?
ไม่เป็นไรครับ เสถียรขึ้น เพราะก่อนหน้านี้ บางครั้งเรียกได้ บางครั้งเรียกไม่ได้
คือเรียก 15 ครั้ง ก็ขึ้น 15 ครั้ง ไม่ซ่อนอยู่ข้างหลัง
แต่ยังมีข้อความ
Open this document will run the following sql command
Sql * from ddd:
Data from your database will be place in the document
Do you want to continue ?
ไม่เป็นไรครับ เสถียรขึ้น เพราะก่อนหน้านี้ บางครั้งเรียกได้ บางครั้งเรียกไม่ได้
4 @R17910
อื่ม เรื่องของการ Capture หน้าจอ เดี๋ยวนี้พวกคีย์บอร์ดมักย่อจนตัดปุ่ม Print Screen ออกไป ผมก็เจอ ใช้คำสั่ง SendKeys ก็ใช้ไม่ได้ ผมเลยใช้เทคนิคการเรียก API ของวินโดวส์มาใช้ โดยที่เมื่อเรากดปุ่มที่ทำการ Capture หน้าจอ ก่อน Capture เราต้องย่อหน้าต่าง MS Access ของเราลงไปก่อน แล้วให้หน้าต่าง โปรแกรมที่เราต้องการ Active แทน
- เราสามารถใช้คำสั่งนี้ในการ Capture หน้าจอของวินโดวส์ หรือหน้าต่างโปรแกรมต่างๆได้ โดยใช้เทคนิคการหดหน้าต่าง MS Access ก่อนแล้วค่อยใช้คำสัง Print Screen ได้ดังนี้:
1. ใส่โค๊ดลงในส่วนของ Declarations บนฟอร์ม
'-------------------Declarations-------------------
Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ' API สำหรับใช้ในการหน่วงเวลาเพื่อให้คำสั่ง Capture หน้าจอไม่ผิดพลาด
Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare PtrSafe Function GetVersionExA Lib "kernel32" _
(lpVersionInformation As OSVERSIONINFO) As Integer
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_SNAPSHOT = &H2C
Private Const VK_MENU = &H12
Dim blnAboveVer4 As Boolean
'--------------------------------------------------
Private Sub Prn_set()
Dim osinfo As OSVERSIONINFO
Dim retvalue As Integer
osinfo.dwOSVersionInfoSize = 148
osinfo.szCSDVersion = Space$(128)
retvalue = GetVersionExA(osinfo)
If osinfo.dwMajorVersion > 4 Then blnAboveVer4 = True
End Sub
Private Sub CallAndWait(WTime As Long)
Dim i As Integer
For i = 1 To WTime
Sleep 500
DoEvents
Next
End Sub
'---------------------End Code---------------------
2. สร้างปุ่มบนฟอร์มสำหรับการคัดลอกหน้าจอแบบ Print Screen ใส่โค๊ดใน Event > On Click
'-------------------Start Code-------------------
Prn_set
Application.RunCommand acCmdAppMinimize
DoEvents
CallAndWait 1
If blnAboveVer4 Then
keybd_event VK_SNAPSHOT, 0, 0, 0
Else
keybd_event VK_SNAPSHOT, 1, 0, 0
End If
DoEvents
CallAndWait 1
Application.RunCommand acCmdAppRestore
'--------------------End Code--------------------
3. สร้างปุ่มบนฟอร์มสำหรับการคัดลอกหน้าจอแบบ Alt + Print Screen ใส่โค๊ดใน Event > On Click
'-------------------Start Code-------------------
Prn_set
Application.RunCommand acCmdAppMinimize
DoEvents
CallAndWait 1
If blnAboveVer4 Then
keybd_event VK_SNAPSHOT, 1, 0, 0
Else
keybd_event VK_MENU, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
End If
DoEvents
CallAndWait 1
Application.RunCommand acCmdAppRestore
'--------------------End Code--------------------
ลองปรับใช้ดูครับ จริงๆเรายังสามารถใช้การเรียก API ให้หน้าต่างโปรแกรมที่เราต้องการ Active ขึ้นมาได้เลยแต่มันจะต้องใช้คำสั่งเพิ่มอีก เอาแค่นี้แล้วกันครับ ลองไปศึกษาเพิ่มเองนะครับ
- เราสามารถใช้คำสั่งนี้ในการ Capture หน้าจอของวินโดวส์ หรือหน้าต่างโปรแกรมต่างๆได้ โดยใช้เทคนิคการหดหน้าต่าง MS Access ก่อนแล้วค่อยใช้คำสัง Print Screen ได้ดังนี้:
1. ใส่โค๊ดลงในส่วนของ Declarations บนฟอร์ม
'-------------------Declarations-------------------
Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ' API สำหรับใช้ในการหน่วงเวลาเพื่อให้คำสั่ง Capture หน้าจอไม่ผิดพลาด
Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare PtrSafe Function GetVersionExA Lib "kernel32" _
(lpVersionInformation As OSVERSIONINFO) As Integer
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_SNAPSHOT = &H2C
Private Const VK_MENU = &H12
Dim blnAboveVer4 As Boolean
'--------------------------------------------------
Private Sub Prn_set()
Dim osinfo As OSVERSIONINFO
Dim retvalue As Integer
osinfo.dwOSVersionInfoSize = 148
osinfo.szCSDVersion = Space$(128)
retvalue = GetVersionExA(osinfo)
If osinfo.dwMajorVersion > 4 Then blnAboveVer4 = True
End Sub
Private Sub CallAndWait(WTime As Long)
Dim i As Integer
For i = 1 To WTime
Sleep 500
DoEvents
Next
End Sub
'---------------------End Code---------------------
2. สร้างปุ่มบนฟอร์มสำหรับการคัดลอกหน้าจอแบบ Print Screen ใส่โค๊ดใน Event > On Click
'-------------------Start Code-------------------
Prn_set
Application.RunCommand acCmdAppMinimize
DoEvents
CallAndWait 1
If blnAboveVer4 Then
keybd_event VK_SNAPSHOT, 0, 0, 0
Else
keybd_event VK_SNAPSHOT, 1, 0, 0
End If
DoEvents
CallAndWait 1
Application.RunCommand acCmdAppRestore
'--------------------End Code--------------------
3. สร้างปุ่มบนฟอร์มสำหรับการคัดลอกหน้าจอแบบ Alt + Print Screen ใส่โค๊ดใน Event > On Click
'-------------------Start Code-------------------
Prn_set
Application.RunCommand acCmdAppMinimize
DoEvents
CallAndWait 1
If blnAboveVer4 Then
keybd_event VK_SNAPSHOT, 1, 0, 0
Else
keybd_event VK_MENU, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
End If
DoEvents
CallAndWait 1
Application.RunCommand acCmdAppRestore
'--------------------End Code--------------------
ลองปรับใช้ดูครับ จริงๆเรายังสามารถใช้การเรียก API ให้หน้าต่างโปรแกรมที่เราต้องการ Active ขึ้นมาได้เลยแต่มันจะต้องใช้คำสั่งเพิ่มอีก เอาแค่นี้แล้วกันครับ ลองไปศึกษาเพิ่มเองนะครับ
5 @R17911
ขอบคุณครับ
Time: 0.3367s
Sql * from ddd:
Data from your database will be place in the document
Do you want to continue ?
ข้อความที่ขึ้น เกิด จาก word
ผมจะต้องไป set ค่าใน word อย่างไร เพื่อไม่ให้มีข้อความเตือน