เรียก word ผ่าน ปุ่ม commandในaccess 2003 มีปัญหา
กระทู้เก่าบอร์ด อ.Yeadram

 1,390   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 ด้วยครับ




5 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R17905
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 ?

ข้อความที่ขึ้น เกิด จาก word
ผมจะต้องไป set ค่าใน word อย่างไร เพื่อไม่ให้มีข้อความเตือน
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" & """"

ลองดูครับ
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 ?

ไม่เป็นไรครับ เสถียรขึ้น เพราะก่อนหน้านี้ บางครั้งเรียกได้ บางครั้งเรียกไม่ได้


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 ขึ้นมาได้เลยแต่มันจะต้องใช้คำสั่งเพิ่มอีก เอาแค่นี้แล้วกันครับ ลองไปศึกษาเพิ่มเองนะครับ
5 @R17911
ขอบคุณครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.7253s