<output id="os3gq"><ruby id="os3gq"></ruby></output>

    1. <mark id="os3gq"></mark>
    2. 用VBA代碼設置access報表的頁面設置-一啟軟研
      Access軟件網QQ交流學習群(群號碼198465573),歡迎您的加入!
      首頁 >技術文章> 源碼示例


      用VBA代碼設置access報表的頁面設置

      發表時間:2010/4/15 19:23:02 評論(1) 瀏覽(14326)  評論 | 加入收藏 | 復制
         
      摘 要:    在ACCESS中,報表的頁面設置通常通過菜單[頁面設置]命令即可完成?墒,比較復雜的頁面設置往往容易丟失,特別是當我們將MDB編譯為MDE后分發給用戶時,如果需要對子報表進行分列設置,則用戶將無法操作。所以我們在編譯時總是要檢查子報表的頁面設置是否正確。
      正 文:

      一、問題提出

          在ACCESS中,報表的頁面設置通常通過菜單[頁面設置]命令即可完成?墒,比較復雜的頁面設置往往容易丟失,特別是當我們將MDB編譯為MDE后分發給用戶時,如果需要對子報表進行分列設置,則用戶將無法操作。所以我們在編譯時總是要檢查子報表的頁面設置是否正確。

            如圖,在主報表里嵌套著子報表,而子報表是分為8列的,所以必須設置子報表的頁面屬性為8列,但分發給用戶的程序不含直接打開的子報表。

          在ACCESS中,象這樣的設置給終端用戶的帶來不便,也降低了程序的便捷性。所以考慮用代碼實現。

      二、程序代碼

          1、建立公用模塊,代碼如下:

      Option Compare Database

      Type str_PRTMIP
          strRGB As String * 28
      End Type
      Type type_PRTMIP
          xLeftMargin As Long
          yTopMargin As Long
          xRightMargin As Long
          yBotMargin As Long
          fDataOnly As Long
          xWidth As Long
          yHeight As Long
          fDefaultSize As Long
          cxColumns As Long
          yColumnSpacing As Long
          xRowSpacing As Long
          rItemLayout As Long
          fFastPrint As Long
          fDatasheet As Long
         
      End Type

      Type str_DEVMODE
          RGB As String * 94
      End Type

      Type type_DEVMODE
          strDeviceName As String * 16
          intSpecVersion As Integer
          intDriverVersion As Integer
          intSize As Integer
          intDriverExtra As Integer
          lngFields As Long
          intOrientation As Integer
          intPaperSize As Integer
          intPaperLength As Integer
          intPaperWidth As Integer
          intScale As Integer
          intCopies As Integer
          intDefaultSource As Integer
          intPrintQuality As Integer
          intColor As Integer
          intDuplex As Integer
          intResolution As Integer
          intTTOption As Integer
          intCollate As Integer
          strFormName As String * 16
          lngPad As Long
          lngBits As Long
          lngPW As Long
          lngPH As Long
          lngDFI As Long
          lngDFr As Long
      End Type

       

      Sub Setprint_zi(strName, fx, sbj, xbj, zbj, ybj, lie, liewith)
      '-----------------------------------------------------------------------------------------
      '名稱:設置子報表頁面
      '說明:設置后不打開
      '作者:郭兆良
      '日期:2010.4.20
      '參數:strName報表名稱,fx方向,sbj上邊距,xbj下邊距,zbj左邊距,ybj右邊距,lie列數,liewith列間距
      '------------------------------------------------------------------------------------------
      On Error GoTo err1
          Const DM_PORTRAIT = 1
          Const DM_LANDSCAPE = 2
          Dim DevString As str_DEVMODE
          Dim DM As type_DEVMODE
          Dim PrtMipString As str_PRTMIP
          Dim PM As type_PRTMIP
          Dim strDevModeExtra As String
          Dim rpt As Report

          DoCmd.OpenReport strName, acDesign
          Set rpt = Reports(strName)
          PrtMipString.strRGB = rpt.PrtMip
          LSet PM = PrtMipString
          PM.yTopMargin = sbj * 56.736    ' 設置上邊距。
          PM.yBotMargin = xbj * 56.736    ' 設置下邊距。
          PM.xLeftMargin = zbj * 56.736   ' 設置左邊距。
          PM.xRightMargin = ybj * 56.736  ' 設置右邊距。
          PM.cxColumns = lie              ' 列
          PM.xRowSpacing = 0         '行間距
          PM.yColumnSpacing = 0      '列間距
          PM.xWidth = liewith * 567.36    '列寬
          'PM.fDataOnly = True                    '只打印數據
          'PM.fDatasheet
          'PM.fDefaultSize
          'PM.fFastPrint
          'PM.yHeight                '列高
          'PM.rItemLayout = 1953


          LSet PrtMipString = PM            ' 更新屬性。
          rpt.PrtMip = PrtMipString.strRGB
          If Not IsNull(rpt.PrtDevMode) Then
              strDevModeExtra = rpt.PrtDevMode
              DevString.RGB = strDevModeExtra
              LSet DM = DevString
              DM.lngFields = DM.lngFields or _
                             DM.intOrientation    ' Initialize fields.
              If fx = 1 Then
                  DM.intOrientation = DM_PORTRAIT    '設置縱向打印
              Else
                  DM.intOrientation = DM_LANDSCAPE    '設置橫向打印
              End If
              LSet DevString = DM            ' Update property.
              Mid(strDevModeExtra, 1, 94) = DevString.RGB
              rpt.PrtDevMode = strDevModeExtra
          End If
          DoCmd.close acReport, strName, acSaveYes
          Set rpt = Nothing
      err1:
      End Sub

      Sub Setprint(strName, fx, sbj, xbj, zbj, ybj, lie, liewith)
      '-----------------------------------------------------------------------------------------
      '名稱:設置報表頁面
      '說明:設置后打開
      '作者:郭兆良
      '日期:2010.4.20
      '參數:strName報表名稱,fx方向,sbj上邊距,xbj下邊距,zbj左邊距,ybj右邊距,lie列數,liewith列間距
      '------------------------------------------------------------------------------------------
      On Error GoTo err1
          Const DM_PORTRAIT = 1
          Const DM_LANDSCAPE = 2
          Dim DevString As str_DEVMODE
          Dim DM As type_DEVMODE
          Dim PrtMipString As str_PRTMIP
          Dim PM As type_PRTMIP
          Dim strDevModeExtra As String
          Dim rpt As Report

          DoCmd.OpenReport strName, acDesign
          Set rpt = Reports(strName)
          PrtMipString.strRGB = rpt.PrtMip
          LSet PM = PrtMipString
          PM.yTopMargin = sbj * 56.736    ' 設置上邊距。
          PM.yBotMargin = xbj * 56.736    ' 設置下邊距。
          PM.xLeftMargin = zbj * 56.736   ' 設置左邊距。
          PM.xRightMargin = ybj * 56.736  ' 設置右邊距。
          PM.cxColumns = lie              ' 列
          PM.xRowSpacing = 0         '行間距
          PM.yColumnSpacing = 0      '列間距
          PM.xWidth = liewith * 567.36    '列寬

          LSet PrtMipString = PM            ' 更新屬性。
          rpt.PrtMip = PrtMipString.strRGB
          If Not IsNull(rpt.PrtDevMode) Then
              strDevModeExtra = rpt.PrtDevMode
              DevString.RGB = strDevModeExtra
              LSet DM = DevString
              DM.lngFields = DM.lngFields or _
                             DM.intOrientation    ' Initialize fields.
              If fx = 1 Then
                  DM.intOrientation = DM_PORTRAIT    '設置縱向打印
              Else
                  DM.intOrientation = DM_LANDSCAPE    '設置橫向打印
              End If
              LSet DevString = DM            ' Update property.
              Mid(strDevModeExtra, 1, 94) = DevString.RGB
              rpt.PrtDevMode = strDevModeExtra
          End If
          DoCmd.OpenReport strName, acViewPreview
          Set rpt = Nothing
      err1:
      End Sub


           2、窗體模塊引用

           當我們打印報表或預覽報表時加入以下引用:

          (1)含子報表的報表

          sub print()
          DoCmd.Hourglass True
          Call Setprint_zi("子報表", 1, 0, 0, 0, 0, 8, 2.1)
          DoCmd.Hourglass False
          stDocName = "報表名"
          DoCmd.OpenReport stDocName, acPreview
          end sub

          以上引用可以實現對子報表的頁面設置。

          (2)不含子報表的報表

          sub print()
          call Setprint("報表名",1, 24, 24, 24, 24, 列數, 列寬CM數)
          end sub

          1表示縱向 ,2表示橫向
          24為上、下、左、右邊距均為24MM
          列數根據需要設置,整數
          列寬設置為CM數

      三、總結

          此方法參考了網絡有關PRTMIP屬性的文章,大部分代碼來自網絡。只是在列設置上我作了些改動。此問題曾在ACCESSSOFT網站求教數日,無人應答,想必遇到此類需求的人不多,或關注度不夠。今天得以解決,所以公布為大家共享。

      本文來自:一啟軟件研習工作室
      網站地址:http://www.yikisoft.cn
      文章出處:http://www.yikisoft.cn/WZ.asp?id=43

       

      Access軟件網QQ交流學習群 群號:41208985

       


      Access軟件網交流QQ群(群號:198465573)
       
       相關文章
      access頁面設置模塊代碼分享  【UMVsoft整理  2009/1/15】
      [access報表]access2003中自動完成報表的頁面設置  【wqm099   2009/9/23】
      [access報表]自定義頁面設置示例  【wj.s  2010/5/25】
       
       訪客評論
      2010/4/16陳福祥
      學習了

      總記錄:1篇  頁次:1/1 9 1 :
       
       發表評論
      評論內容 (必填)

      常見問答
      技術分類
      相關資源
      文章搜索
      關于作者

      一啟軟研

      文章分類

      文章存檔

      友情鏈接
       
         
      湖北11选5