虞城那个小区户型好:ACCESS编程(3)

来源:百度文库 编辑:九乡新闻网 时间:2024/05/04 19:44:42

'这里将使用FOR EACH CONTROL的方法来清除控件的值

'这在控件比较多的时候非常有用。

'================================

 

    Dim ctl As Control

    Dim qdf As DAO.QueryDef 'qdf被定义为一个查询定义对象

    Dim strSQL As String

   

    For Each ctl In Me.Controls

   

        '根据ctl的控件类型来选择

        Select Case ctl.ControlType

            Case acTextBox '是文本框,要清空(注意,子窗体下面还有两个锁定的文本框不能赋值)

                If ctl.Locked = False Then ctl.Value = Null

               

            Case acComboBox '是组合框,也要清空

                ctl.Value = Null

            '其它类型的控件不处理

       

        End Select

    Next

   

    strSQL = "TRANSFORM Sum(存书查询.单价) AS 单价之Sum" & _

             " SELECT 存书查询.类别" & _

             " FROM 存书查询" & _

             " GROUP BY 存书查询.类别" & _

             " PIVOT Format([进书日期],'yyyy/mm')"

   

    '修改交叉表查询的SQL语句

    Set qdf = CurrentDb.QueryDefs("存书查询_交叉表")

    qdf.SQL = strSQL

    qdf.Close

   

    Set qdf = Nothing

   

    '显示交叉表的内容,不能直接刷新

    Me.存书查询子窗体.SourceObject = ""

    Me.存书查询子窗体.SourceObject = "查询.存书查询_交叉表"

   

    '刷新计数和合计显示

    Me.计数 = DCount("*", "存书查询_交叉表")

    Me.合计 = DSum("[单价]", "存书查询")

 

Exit_cmd清除_Click:

    Exit Sub

 

Err_cmd清除_Click:

    MsgBox Err.Description

    Resume Exit_cmd清除_Click

   

End Sub

 

Private Sub cmd预览报表_Click()

On Error GoTo Err_cmd预览报表_Click

 

    Dim stDocName, strWhere As String

 

    stDocName = "藏书情况报表"

   

    DoCmd.OpenReport stDocName, acViewPreview

   

   

Exit_cmd预览报表_Click:

    Exit Sub

 

Err_cmd预览报表_Click:

    MsgBox Err.Description

    Resume Exit_cmd预览报表_Click

   

End Sub

 

 

Private Sub Form_Open(Cancel As Integer)

'如果没有这一段代码,窗体打开时,虽然子窗体有显示,但下面的两个文本框是空的。

    '刷新计数和合计显示

    Me.计数 = DCount("*", "存书查询_交叉表")

    Me.合计 = DSum("[单价]", "存书查询")

 

End Sub

 

 

*在报表的打开事件中写:

Private Sub Report_Open(Cancel As Integer)

'ALEX 2003-5-27

'根据交叉表查询的实际字段数来设定报表各节可以显示的控件数。

'需要使用DAO 3.6

'===============================

 

    Dim rst As DAO.Recordset, intFieldsNum As Integer, I As Integer

   

    '打开查询

    Set rst = CurrentDb.OpenRecordset("SELECT * FROM [存书查询_交叉表] WHERE 1=2")

   

    rst.MoveLast

    rst.MoveFirst

   

    Debug.Print rst.RecordCount

   

    '记录字段总数

    intFieldsNum = rst.Fields.Count

   

    '由于报表仅有10个可变字段+1个固定字段,所以,如果字段总数>11时,

    '只显示前面的11个字段,并给出提示。

    If intFieldsNum > 11 Then

        intFieldsNum = 11

        MsgBox "字段总数太多,报表仅显示前11个字段。", vbInformation + vbOKOnly, "提示"

    End If

   

    For I = 1 To 10

       

        If I <= (intFieldsNum - 1) Then

        '有对应字段,rst.Fields(I) 中 rst.Fields(0)是第一个,是“类别”字段。

       

            '页眉标签可见

            Section(acPageHeader).Controls("标签" & I).Caption =

rst.Fields(I).Name

            Section(acPageHeader).Controls("标签" & I).Visible = True

           

            '主体字段可见

            Section(acDetail).Controls("txt" & I).ControlSource =

rst.Fields(I).Name

            Section(acDetail).Controls("txt" & I).Visible = True

           

            '报表页脚合计可见

            Section(acFooter).Controls("txt合计" & I).ControlSource = "=SUM(NZ(["

& rst.Fields(I).Name & "],0))"

            Section(acFooter).Controls("txt合计" & I).Visible = True

       

        Else

        '没有对应字段

       

            '页眉标签不可见

            Section(acPageHeader).Controls("标签" & I).Visible = False

            

            '主体字段不可见

            Section(acDetail).Controls("txt" & I).ControlSource = ""

            Section(acDetail).Controls("txt" & I).Visible = False

           

            '报表页脚合计可见

            Section(acFooter).Controls("txt合计" & I).ControlSource = ""

            Section(acFooter).Controls("txt合计" & I).Visible = False

           

        End If

    Next

   

    rst.Close

    Set rst = Nothing

   

End Sub

 

进行多条件查询,  希望某一条件为空时显示全部

where  name1 like *temp1* and name2 like *temp2*

 

如何判断奇数(单数)、偶数(双数)?

dim a as string

(这里有一段给a赋值的代码)

if a mod 2=0 then

  msgbox"这是一个偶数"

esle

msgbox"这是一个奇数"

end if

 

计算在每个范围内的数量

本示例假设您有一个“Orders”表,且里头含有一个“Freight”字段。程序建立一个“选择”来计算运费落在某些范围内的订单数量。Partition

函数是用来确定这些范围,然后调用 SQL Count 函数来计算在每个范围内的订单数量。本示例中,Partition 函数的参数值为 start =

0,stop = 500,interval = 50。第一个范围会是 0:49,每隔 50 一个范围,依次而下直到运费为 500 为止。

SELECT DISTINCTROW Partition([freight],0, 500, 50) AS Range,Count(Orders.Freight) AS CountFROM OrdersGROUP BY Partition([freight],0,500,50);使用 Trim 函数显示字段的值,并且删除首尾的空格。

使用 Trim 函数显示“地址”字段的值,并且删除首尾的空格。

=Trim([地址])

Like函数示例:

查询条件为“Like "*" & [forms]![销售单输入]![文本26]”,当我输入60时,所有包含60的记录全部得出,诸如160、260、360等

 

只想要60的记录,并且当不输入任何数据时,所有记录全部得出

Like IIf([forms]![销售单输入]![文本26] Is Not Null,[forms]![销售单输入]![文本26],"*")

使用 Left 函数来得到某字符串最左边的几个字符。

Dim AnyString, MyStrAnyString = "Hello World"    ' 定义字符串。MyStr = Left(AnyString, 1)    ' 返回 "H"。MyStr = Left(AnyString, 7)    ' 返回 "Hello W"。MyStr = Left(AnyString, 20)    ' 返回 "Hello World"。

使用 Mid 语句来得到某个字符串中的几个字符。

Dim MyString, FirstWord, LastWord, MidWordsMyString = "Mid Function Demo"    建立一个字符串。FirstWord = Mid(MyString, 1, 3)    ' 返回 "Mid"。LastWord = Mid(MyString, 14, 4)    ' 返回 "Demo"。MidWords = Mid(MyString, 5)    ' 返回 "Funcion Demo"。

使用 Right 函数来返回某字符串右边算起的几个字符。

Dim AnyString, MyStrAnyString = "Hello World"    ' 定义字符串。MyStr = Right(AnyString, 1)    ' 返回 "d"。MyStr = Right(AnyString, 6)    ' 返回 " World"。MyStr = Right(AnyString, 20)    ' 返回 "Hello World"。使用 InStr 函数来查找某字符串在另一个字符串中首次出现的位置。

Dim SearchString, SearchChar, MyPosSearchString ="XXpXXpXXPXXP"    ' 被搜索的字符串。SearchChar = "P"    ' 要查找字符串 "P"。 ' 从第四个字符开始,以文本比较的方式找起。返回值为 6(小写 p)。' 小写 p 和大写 P 在文本比较下是一样的。MyPos = Instr(4, SearchString, SearchChar, 1)     ' 从第一个字符开使,以二进制比较的方式找起。返回值为 9(大写 P)。' 小写 p 和大写 P 在二进制比较下是不一样的。MyPos = Instr(1, SearchString, SearchChar, 0) ' 缺省的比对方式为二进制比较(最后一个参数可省略)。MyPos = Instr(SearchString, SearchChar)    ' 返回 9。 MyPos = Instr(1, SearchString, "W")    ' 返回 0。

使用 Space 函数来生成一个字符串,字符串的内容为空格,长度为指定的长度。

Dim MyString' 返回 10 个空格的字符串。MyString = Space(10) ' 将 10 个空格插入两个字符串中间。MyString = "Hello" & Space(10) & "World"

使用 String 函数来生成一指定长度,且只含单一字符的字符串。

Dim MyStringMyString = String(5, "*")    ' 返回 "*****"。MyString = String(5, 42)    ' 返回 "*****"。MyString = String(10, "ABC")    ' 返回 "AAAAAAAAAA"。使用 DLookup 函数

=DLookup("[联系人姓名]", "[供应商]", "[供应商ID] ="[供应商ID])

 

一、变量为数字

If IsNull(DLookup("[纺号]", "另一个表的名字", "[纺号] = " & 文本框的值)) Then

    Msgbox "该纺号不存在!"

End If

二、变量为字符串

If IsNull(DLookup("[纺号]", "另一个表的名字", "[纺号] = '" & 文本框的值 &"'")) Then

    Msgbox "该纺号不存在!"

End If

 

使用 Len 函数来得知某字符串的长度(字符数)或某变量的大小(位数)。

Type...End Type 程序区块定义一个自定义数据类型 CustomerRecord。如果该数据类型定义在对象类模块中,则必需以关键字 Private

开头(表示为私有)。若定义在常规模块中,Type 定义就可以为 Public。

Type CustomerRecord    ' 定义用户自定义的数据类型。    ID As Integer    ' 将此定义放在常规模块中。    Name As String * 10    Address As String * 30End TypeDim Customer As CustomerRecord    ' 声明变量。Dim MyInt As Integer, MyCur As CurrencyDim MyString, MyLenMyString = "Hello World"    ' 设置变量初值。MyLen = Len(MyInt)    ' 返回 2。MyLen = Len(Customer)    ' 返回 42。MyLen = Len(MyString)    ' 返回 11。MyLen = Len(MyCur)    ' 返回 8。

Round四舍五入。

Round(数值表达式,小数点右边应保留的位数)

 

 

用按钮在窗体中按指定字段查找记录

例一:

Private Sub 查找记录_Click()

On Error GoTo Err_查找记录_Click

''指定字段名称[学生编号]

    DoCmd.GoToControl "学生编号"

    DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70

 

Exit_查找记录_Click:

    Exit Sub

 

Err_查找记录_Click:

    MsgBox Err.Description

    Resume Exit_查找记录_Click

   

End Sub

例二

Private Sub 按毕业时间查找_Click()

On Error GoTo 按毕业时间查找_Click_Err

''在窗体中按基础表的参数筛选

    DoCmd.ApplyFilter "", "Left([学生基本情况]![学生编号],4)+6=[请输入学生毕业年份(四位数)]"

 

 

按毕业时间查找_Click_Exit:

    Exit Sub

 

按毕业时间查找_Click_Err:

    MsgBox Error$

    Resume 按毕业时间查找_Click_Exit

 

End Sub

SQL 语法参考手册

DB2 提供了关连式资料库的查询语言SQL (Structured Query Language),

是一种非常口语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(DDL)以及资料

的处理(DML)。SQL原来拼成 SEQUEL,这语言的原型以“系统 R“的名 字在 IBM 圣荷西实验室完成,经过 IBM

内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R 的技术基础发展出来 IBM

的产品。而且美国国家标准学会(ANSI)及国际标准化组织(ISO 在 1987 遵循一个几乎 是以 IBM SQL 为基础的标准关连式资料语言定义。

 

基本查询

SELECT column1,columns2,... FROM table_name

说明:把table_name 的特定栏位资料全部列出来

SELECT *

FROM table_name

WHERE column1 = xxx

[AND column2 > yyy] [OR column3 <> zzz]

说明:

1.'*'表示全部的栏位都列出来

2.WHERE 之後是接条件式,把符合条件的资料列出来

SELECT column1,column2

FROM table_name

ORDER BY column2 [DESC]

说明:

ORDER BY 是指定以某个栏位做排序,[DESC]是指从大到小排列,若

没有指明,则是从小到大排列

 

组合查询

组合查询是指所查询得资料来源并不只有单一的表格,而是联合一个以上的表格才能够得到结果的。

SELECT *

FROM table1,table2

WHERE table1.colum1=table2.column1

说明:

1.查询两个表格中其中 column1 值相同的资料

2.当然两个表格相互比较的栏位,其资料形态必须相同

3.一个复杂的查询其动用到的表格可能会很多个

 

整合性的查询:

SELECT COUNT (*)

FROM table_name

WHERE column_name = xxx

说明:

查询符合条件的资料共有几笔

 

SELECT SUM(column1)

FROM table_name

说明:

1.计算出总和,所选的栏位必须是可数的数字形态

2.除此以外还有 AVG() 是计算平均、MAX()、MIN()

计算最大最小值的整合性查询

 

SELECT column1,AVG(column2)

FROM table_name

GROUP BY column1

HAVING AVG(column2) > xxx

说明:

1.GROUP BY: 以column1 为一组计算 column2 的平均值

必须和 AVG、SUM 等整合性查询的关键字一起使用

2.HAVING : 必须和 GROUP BY 一起使用作为整合性的限制

 

复合性的查询

SELECT *

FROM table_name1

WHERE EXISTS (

SELECT *

FROM table_name2

WHERE conditions )

说明:

1.WHERE 的 conditions 可以是另外一个的 query

2.EXISTS 在此是指存在与否

 

SELECT *

FROM table_name1

WHERE column1 IN (

SELECT column1

FROM table_name2

WHERE conditions )

说明 

1. IN 後面接的是一个集合,表示column1 存在集合里面

2. SELECT 出来的资料形态必须符合 column1

 

其他查询

SELECT *

FROM table_name1

WHERE column1 LIKE 'x%'

说明:

LIKE 必须和後面的'x%' 相呼应表示以 x为开头的字串

 

SELECT *

FROM table_name1

WHERE column1 IN ('xxx','yyy',..)

说明 

IN 後面接的是一个集合,表示column1 存在集合里面

 

SELECT *

FROM table_name1

WHERE column1 BETWEEN xx AND yy

说明 

BETWEEN 表示 column1 的值介於 xx 和 yy 之间

 

更改资料:

UPDATE table_name

SET column1='xxx'

WHERE conditoins

说明:

1.更改某个栏位设定其值为'xxx'

2.conditions 是所要符合的条件、若没有 WHERE 则

整个 table 的那个栏位都会全部被更改

 

删除资料:

DELETE FROM table_name

WHERE conditions

说明:删除符合条件的资料

 

报表

如果您想判断一个数据库中的报表是否打开,您需要检查报表连接,如下函数可以做到。

如果返回true,则报表是打开,false则报表没有打开。

Sub fCheckReport(strReport As String) As Boolean

    Dim rpt As Report

    fCheckReport=False

    For Each rpt In Reports

        If rpt.Name=strReportName Then fCheckReport=True

    Next rpt

End Function

打印当前窗体上的记录的报表

DoCmd.OpenReport "rptName", acViewNormal, ,

"[UniqueFieldOnReport]=Forms![frmName]![UniqueFieldOnReport]" 

全部范围内,从第二张打到第五张,高品质打印,印三份

DoCmd.PrintOut acPrintAll, 2, 5, acHigh, 3, False

 

生成间隔背景颜色的报表

要求:生成间隔背景颜色的报表,奇数行的背景颜色为兰色,偶数行的背景颜色为白色,兰白相间,方便查看.

方法:根据行号进行判定,设定背景色.

1 设计报表INVOICE ,必须有行号字段NO(由1开始连续的系列号)

2 设计宏SETINVOICECOLOR,条件及操作如下

条件    ([Reports]![INVOICE]![NO]) Mod 2=1

操作    Setvalue

         项目 [Reports]![INVOICE].[Section](0).[BackColor]

         表达式1632256

条件    ([Reports]![INVOICE]![NO]) Mod 2=0

操作    Setvalue

         项目 [Reports]![INVOICE].[Section](0).[BackColor]

         表达式16777215

3 设计报表INVOICE ,选定节Detail的属性中,事件"打印"为宏 SETINVOICECOLOR.

4 打印报表INVOICE,生成间隔背景颜色的报表.

 

报表奇偶页不同颜色显示

Option Compare Database

Option Explicit

Dim i As Integer

Private Sub 主体_Format(Cancel As Integer, FormatCount As Integer)

    i = i + 1

    If i Mod 2 = 0 Then

        Me.主体.BackColor = 12632256

    Else

        Me.主体.BackColor = 16777215

    End If

End Sub

 

 

如何在报表中产生递增的顺序编号

在报表的细节上放一个文本框,控件源等于=1 并设"运行总和"属性设置为“工作组之上”即可。

 

给输出的报表加个边框

Private Sub Report_Page()

Line (0, 0)-(ScaleWidth, ScaleHeight), , B

End Sub

报表页小计

在报表的主体节复制、粘贴一个要统计的数据的文本框TEXT1,属性的数据----运行总和为“全部之上”,可见性可设为“否”;

在页脚建一未绑定文本框TEXT2,用来显示页合计数据值;

 

在报表的页脚的打印事件中写:

Dim x As Single

Me.TEXT2 = TEXT1 - x

x = TEXT1

 

实际上是每个记录的工资累计。每页结束后把这个值赋给X,下页再合计后减去X就是本页合计,以此类推。

 

每页固定打印7行,数据不足时用空行补齐。

最好还是用Line语句。在报表的“打印页前”事件中输入下面内容。

 

Private Sub Report_Page()

Dim rpt As Report, lngColor As Long

Dim i As Integer

Set rpt = Reports!当前报表

rpt.ScaleMode = 7

lngColor = RGB(255, 0, 0)

rpt.Line (2.503, 2.5)-(4.735, 6.588), lngColor, B

rpt.Line (7.354, 2.5)-(9.074, 6.588), lngColor, B

rpt.Line (10.317, 2.5)-(12.037, 6.588), lngColor, B

rpt.Line (13.81, 2.5)-(15.952, 6.588), lngColor, B

rpt.Line (19.123, 2.5)-(19.123, 6.588), lngColor

For i = 1 To 7

    rpt.Line (0.4, 2.5 + (i - 1) * 0.584)-(19.123, 2.5 + i * 0.584), lngColor, B

Next i

End Sub

 

应用筛选打印报表以及取消后

Sub 打印发货单_Click()

' 这段代码由“命令按钮向导”创建。

On Error GoTo Err_PrintInvoice_Click

 

    Dim strDocName As String

   

    strDocName = "发货单"

    ' 打印“发货单”报表,使用“发货单筛选”查询打印当前订单的发货单。

    DoCmd.OpenReport strDocName, acViewNormal, "发货单筛选"

 

Exit_PrintInvoice_Click:

    Exit Sub

 

Err_PrintInvoice_Click:

    ' 如果用户取消操作,不显示错误消息。

    Const conErrDoCmdCancelled = 2501

    If (Err = conErrDoCmdCancelled) Then

        Resume Exit_PrintInvoice_Click

    Else

        MsgBox Err.Description

        Resume Exit_PrintInvoice_Click

    End If

 

End Sub

 

报表打印如何用代码设定页面

 Dim qdf As QueryDef

   Dim ctlLabel As Control, ctlText As Control

   Dim intDataX As Integer, intDataY As Integer

   Dim intLabelX As Integer, intLabelY As Integer

   Dim ncnt As Integer

   Dim i As Integer

   Dim ttlwidth As Double

   Dim rptWaste As Report

   Me.Painting = False

   On Error Resume Next

   Dim Dbs As Database, ctr As Container, doc As Document

   Set Dbs = CurrentDb

   ncnt = 0

   

   

   Set rptWaste = CreateReport

       Dbs.QueryDefs.Delete "www"

    Set qdf = Dbs.CreateQueryDef("www", sql)

   Dbs.QueryDefs.refresh

   ttlwidth = 30

   rptWaste.Section(acPageHeader).Height = 800

   For i = 1 To 30 - 1

           If Not (IsNull(adata(i)) Or Trim(adata(i)) = "") Then

              Set ctlText = CreateReportControl(rptWaste.name, acTextBox, , "",

"", intDataX, intDataY)

              Set ctlLabel = CreateReportControl(rptWaste.name, acLabel,

acPageHeader, , "NewLabel", intLabelX, intLabelY)

              ctlLabel.Caption = adata(i)

             

              ctlText.Width = 1000

              If adata(i) = "card_no" Then

                   ctlText.Width = 1200

                   ctlLabel.Caption = "卡号"

              End If

              If adata(i) = "date" Then

                    ctlText.Width = 1300

                   ctlLabel.Caption = "日期"

              End If

              If adata(i) = "op_name" Then

                   ctlText.Width = 1300

                   ctlLabel.Caption = "工序号"

              End If

              If adata(i) = "class_name" Then

                   ctlText.Width = 1300

                   ctlLabel.Caption = "产品类型"

              End If

           If adata(i) = "dept_code" Then

                   ctlText.Width = 1000

                   ctlLabel.Caption = "车间代码"

                   

              End If

              If adata(i) = "totalwaste_qty" Then

                   ctlText.Width = 1000

                   ctlLabel.Caption = "废品总重"

              End If

     '  End If

       ctlLabel.Width = ctlText.Width

       ctlText.ControlSource = adata(i)

       ctlText.BorderStyle = 1

       ctlLabel.BorderStyle = 1

       ctlText.Left = ttlwidth

       ctlLabel.Left = ttlwidth

       ctlLabel.Top = 800 - ctlLabel.Height

       ctlLabel.FontBold = True

       ttlwidth = ttlwidth + ctlText.Width

       End If

   Next i

   rptWaste.RecordSource = "www"

   rptWaste.Section(acDetail).Height = ctlText.Height

   Set ctlLabel = CreateReportControl(rptWaste.name, acLabel, acPageHeader, ,

"NewLabel", intLabelX, intLabelY)

 

   ctlLabel.Top = 0

   ctlLabel.Caption = Trim(txtDepartment.value) & "废品统计报表"

   ctlLabel.TextAlign = 2

   ctlLabel.FontSize = 16

   ctlLabel.FontBold = True

   ctlLabel.Width = 4000

   ctlLabel.Height = 500

   ctlLabel.Left = (rptWaste.Width - ctlLabel.Width) / 2

   

   

   

   Const DM_PORTRAIT = 1

   Const DM_LANDSCAPE = 2

   Dim DevString As str_DEVMODE

   Dim DM As type_DEVMODE

   Dim strDevModeExtra As String

   If Not IsNull(rptWaste.PrtDevMode) Then

       strDevModeExtra = rptWaste.PrtDevMode

       DevString.RGB = strDevModeExtra

       LSet DM = DevString

       DM.lngFields = DM.lngFields Or DM.intOrientation    ' Initialize fields.

       'If DM.intOrientation = DM_PORTRAIT Then

           DM.intOrientation = DM_LANDSCAPE

       'Else

       '    DM.intOrientation = DM_PORTRAIT

       'End If

       LSet DevString = DM                     ' Update property.

       Mid(strDevModeExtra, 1, 94) = DevString.RGB

       rptWaste.PrtDevMode = strDevModeExtra

   End If

   

   

   DoCmd.DeleteObject acReport, "rptwaste_tmp"

   DoCmd.Save , "rptwaste_tmp"

   DoCmd.Close acReport, "rptwaste_tmp", acSaveNo

 '  For i = 0 To FORMs.Count - 1

 '      FORMs(i).Visible = False

 '  Next

   DoCmd.OpenReport "rptwaste_tmp", acViewPreview

 

Me.Painting = True

 

 

报表中使用自定义纸张,及设置自定义纸张大小

正    文:

 

Private Type str_DEVMODE

    RGB As String * 94

End Type

 

Private Type type_DEVMODE

    strDeviceName As String * 32

    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 * 32

    lngPad As Long

    lngBits As Long

    lngPW As Long

    lngPH As Long

    lngDFI As Long

    lngDFr As Long

End Type

 

' rptName: 为报表名称

Public Sub CheckCustomPage(ByVal rptName As String)

 

    Dim DevString As str_DEVMODE

    Dim DM As type_DEVMODE

    Dim strDevModeExtra As String

    Dim rpt As Report

    Dim intResponse As Integer

   

    ' 在设计视图下打开报表

    DoCmd.OpenReport rptName, acDesign

    Set rpt = Reports(rptName)

   

    If Not IsNull(rpt.PrtDevMode) Then

        strDevModeExtra = rpt.PrtDevMode

       

        ' 获取当前的 DEVMODE 结构

        DevString.RGB = strDevModeExtra

        LSet DM = DevString

        If DM.intPaperSize = 256 Then

       

            ' 显示用户自定义纸张的尺寸

            intResponse = MsgBox("当前的自定义纸张为(mm):" & _

                          DM.intPaperWidth / 10 & " 宽 X " & _

                          DM.intPaperLength / 10 & " 长。 你想改变吗?", _

                          vbYesNo + vbQuestion)

        Else

            ' 非自定义纸张

            intResponse = MsgBox("报表没有使用自定义纸张。 " & _

                          "你想使用自定义纸张吗?", vbYesNo + vbQuestion)

        End If

       

        If intResponse = vbYes Then

            ' 用户要改变纸张设置,初始化 DM 的各个域

            DM.lngFields = DM.lngFields Or DM.intPaperSize Or _

                           DM.intPaperLength Or DM.intPaperWidth

               

            ' 设置为自定义纸张

            DM.intPaperSize = 256

           

            ' 提示输入长度和宽度

            DM.intPaperLength = InputBox("请输入纸张的长度(mm):") * 10

            DM.intPaperWidth = InputBox("请输入纸张的宽度(mm):") * 10

           

            ' 更新属性值

            LSet DevString = DM

            Mid(strDevModeExtra, 1, 94) = DevString.RGB

            rpt.PrtDevMode = strDevModeExtra

        End If

    End If

   

    Set rpt = Nothing

   

End Sub

 

Vba技巧:

显示窗体“第n条记录 共m条记录”的函数

调用方法:

=RecordNumber("第",me)'me指当前窗体

可在文框的控件来源中写:=RecordNumber("第",forms!当前窗体名)

在代码的窗体成为当前事件中写:me.文本框=RecordNumber("第", Me)

结果虽相同,但在代码中的要快!

但是,在代码的窗体成为当前事件中写:Me.标签.Caption = RecordNumber("第", Me)

用标签,速度明显要比前两个用法还要快!

 

Function RecordNumber(pstrPreFix As String, pfrm As Form) As String

On Error GoTo RecordNumber_Err

Dim rst

Dim lngNumRecords As Long

Dim lngCurrentRecord As Long

Dim strTmp As String

 

Set rst = pfrm.RecordsetClone

rst.MoveLast

rst.Bookmark = pfrm.Bookmark

lngNumRecords = rst.RecordCount

lngCurrentRecord = rst.AbsolutePosition + 1

strTmp = pstrPreFix & " " & lngCurrentRecord & " 页," & " 共 " & lngNumRecords & "

" & "页"

RecordNumber_Exit:

On Error Resume Next

RecordNumber = strTmp

rst.Close

Set rst = Nothing

Exit Function

RecordNumber_Err:

Select Case Err

Case 3021

strTmp = "New Record"

Resume RecordNumber_Exit

Case Else

strTmp = "#" & Error

Resume RecordNumber_Exit

End Select

End Function

获取ACCESS错误号与对应的中文解释

Sub MMM()

For e = 1 To 100

  Debug.Print e; " - "; Error(e)

Next

End Sub

执行上述代码将显示如下结果:

 1  - 应用程序定义或对象定义错误

 2  - 应用程序定义或对象定义错误

 3  - 无 GoSub 返回

 4  - 应用程序定义或对象定义错误

 5  - 无效的过程调用或参数

 6  - 溢出

 7  - 内存溢出

对话框返回文本框内容

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

InputBox 函数的语法具有以下几个命名参数:

Prompt:必需的。作为对话框消息出现的字符串表达式。prompt 的最大长度大约是 1024 个字符,由所用字符的宽度决定。如果 prompt

包含多个行,则可在各行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或回车换行符的组合 (Chr(13) & Chr(10)) 来分隔。

Title:可选的。显示对话框标题栏中的字符串表达式。如果省略 title,则把应用程序名放入标题栏中。

Default:可选的。显示文本框中的字符串表达式,在没有其它输入时作为缺省值。如果省略 default,则文本框为空。

Xpos:可选的。数值表达式,成对出现,指定对话框的左边与屏幕左边的水平距离。如果省略 xpos,则对话框会在水平方向居中。

Ypos:可选的。数值表达式,成对出现,指定对话框的上边与屏幕上边的距离。如果省略 ypos,则对话框被放置在屏幕垂直方向距下边大约三分之一的位置。

Helpfile:可选的。字符串表达式,识别帮助文件,用该文件为对话框提供上下文相关的帮助。如果已提供 helpfile,则也必须提供 context。

Context: 可选的。数值表达式,由帮助文件的作者指定给某个帮助主题的帮助上下文编号。如果已提供 context,则也必须要提供 helpfile。

 

示例:

本示例说明使用 InputBox 函数来显示用户输入数据的不同用法。如果省略 x 及 y

坐标值,则会自动将对话框放置在两个坐标的正中。如果用户单击“确定”按钮或按下“ENTER”按键,则变量 MyValue

保存用户输入的数据。如果用户单击“取消”按钮,则返回一零长度字符串。

Dim Message, Title, Default, MyValueMessage = "Enter a value between 1 and 3"    ' 设置提示信息。Title = "InputBox Demo"    ' 设置标题。Default = "1"    ' 设置缺省值。' 显示信息、标题及缺省值。MyValue = InputBox(Message, Title, Default) ' 使用帮助文件及上下文。“帮助”按钮便会自动出现。MyValue = InputBox(Message, Title, , , , "DEMO.HLP", 10) ' 在 100, 100 的位置显示对话框。MyValue = InputBox(Message, Title, Default, 100, 100)

 

根据屏幕分辨率自动调整窗体大小:

Option Compare Database

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As

Long

Private Const SM_CXSCREEN = 0

Private Const SM_CYSCREEN = 1

 

 

Private Sub Form_Open(Cancel As Integer)

Dim x As Long, y As Long, a As Long, b As Long

x = GetSystemMetrics(SM_CXSCREEN)

y = GetSystemMetrics(SM_CYSCREEN)

a = 10000 / 800 * x

b = 7000 / 600 * y

DoCmd.MoveSize 1134, 1134, a, b

End Sub

获得系统的屏幕区域大小

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As

Long

Private Const SM_CXSCREEN = 0

Private Const SM_CYSCREEN = 1

Private Sub Command0_Click()

Dim x As Long, y As Long

x = GetSystemMetrics(SM_CXSCREEN)

y = GetSystemMetrics(SM_CYSCREEN)

MsgBox x & "  " & y

End Sub

 

让控件自适应屏幕分辨率2

来源:ACCESS爱好者

'这个函数可以使你开发的程序适应各种分辨率,这是我见过的最完美的解决方案!强列推荐

''如果你是在1024*768的分辨率下写的程序,就把下面那句改为

Const DesignSize = 1024,如果是800*600分

'辨率下写的,就改为Const DesignSize = 800

'用法:把下面所有的代码放在一个模块里,在需要适应分辨率的窗体的Load事

'件里加入Call FormResiz_OnOpen(Me)

'

'Const DesignSize = 1024

Const DesignSize = 800

'☆★☆★☆★☆★☆★☆★☆★☆★☆★

'API宣言

Declare Function GetDesktopWindow Lib "User32" () As Long

Declare Function GetWindowRect Lib "User32" (ByVal hWnd As Long, rectangle As

RECT) As Long

'Type宣言

Type RECT

x1 As Long

y1 As Long

x2 As Long

y2 As Long

End Type

'国标码宣言

Dim frm As Form

Dim ctrl As Control

Dim prp As Property

Dim rat As Double

Dim flgSec

Dim X As Long

Dim WinHeight As Long

Dim hWnd As Long

Dim ret As Long

Dim i As Integer

Dim R As RECT

Dim SizeL As Long

Dim SizeT As Long

Dim SizeW As Long

Dim SizeH As Long

'--------------------------------------------------------------------------------

Public Function FormResiz_OnOpen(parFrm As Form, Optional perSizeL As Long,

Optional perSizeT As Long, Optional perSizeW As Long, Optional perSizeH As Long)

On Error Resume Next

Set frm = parFrm

'窗口驾驶盘的取得

hWnd = GetDesktopWindow()

'现在分辨率取得

ret = GetWindowRect(hWnd, R)

'比例计算 常例:现在800 开发1024 800/1024 = 0.78加倍

X = (R.x2 - R.x1)

rat = X / DesignSize

SizeL = 0: SizeT = 0: SizeW = 0: SizeH = 0

If Not IsEmpty(perSizeL) = True Then

SizeL = perSizeL * rat

SizeT = perSizeT * rat

SizeW = perSizeW * rat

SizeH = perSizeH * rat

End If

'现在分辨率=开发分辨率如果终了

If X = DesignSize Then Exit Function

If X < DesignSize Then

'细小策划时、控制>部分>表单的次序

Call ChangeCtrl

Call ChengeSec

Call ChangeFrm

Else

'大掬取时、表单>部分>控制的次序

Call ChangeFrm

Call ChengeSec

Call ChangeCtrl

End If

'最后、表单的使清新

frm.Refresh

Exit Function

End Function

'--------------------------------------------------------------------------------

Private Sub ChangeCtrl()

On Error Resume Next

'控制转

For Each ctrl In frm.Controls

'*******************************************************************

'选项卡修正,原著没有这段代码,后来有个朋友发现了这个BUG,就是选项卡的位置会偏得很厉害

'所以就加了这段代码来修正

'主要是"Top", "Height","Left","Width"这几个参数的值,根据实际情况适当调整就行了

If ctrl.ControlType = 123 Or ctrl.ControlType = 124 Then

For Each prp In ctrl.Properties

Select Case prp.Name

Case "FontSize", "DatasheetFontHeight"

prp.value = Fix(prp.value * rat + 0.5)

Case "FontWeight"

prp.value = Fix((prp.value * rat) / 100) * 100

Case "Top", "Height"

prp.value = Fix(prp.value * rat * 0.85)

'prp.value = Fix(prp.value * rat)

Case "Left"

prp.value = Fix(prp.value * rat * 0.9)

Case "Width"

prp.value = Fix(prp.value * rat * 0.7)

End Select

Next prp

'********************************************************************************************

Else

'属性转

For Each prp In ctrl.Properties

'大小·配置关于属性被发现们压缩

Select Case prp.Name

Case "FontSize", "DatasheetFontHeight"

'通常计算假如行…情况之下的 +0.5 之类的话不需要是…但…、

'捆Zo~Ma办法。稍微心情坏因为 +0.5

prp.value = Fix(prp.value * rat + 0.5)

Case "FontWeight"

prp.value = Fix((prp.value * rat) / 100) * 100

Case "Left", "Top", "Width", "Height"

prp.value = Fix(prp.value * rat)

End Select

Next prp

End If

Next ctrl

End Sub

'--------------------------------------------------------------------------------

Private Sub ChengeSec()

On Error GoTo Err_Disp

'部分转

flgSec = True

i = 0

'不存在部分的参照错误化验出终了

Do Until flgSec = False

'部分被发现们高度变更

frm.Section(i).Height = Fix(frm.Section(i).Height * rat)

i = i + 1

Loop

Exit Sub

Err_Disp:

If Err = 2462 Then

flgSec = False

Resume Next

Else

MsgBox Err.Description

End If

Resume Next

End Sub

'--------------------------------------------------------------------------------

Private Sub ChangeFrm()

On Error Resume Next

'表单的大小变更

'Optional参数数值渡下次收拾ば、而且使合(计算正在完毕)

If SizeL > 0 Then

DoCmd.MoveSize SizeL, SizeT, SizeW, SizeH

Else

'特别是指定啊假如踢、变更了表单的大小表示

'表单的属性(宽与高度)

frm.Width = Fix(frm.Width * rat)

WinHeight = Fix(frm.WindowHeight * rat)

DoCmd.MoveSize , , frm.Width, WinHeight

End If

End Sub

 

 

用VBA赋应用程序图标

见测试窗体

Toolbar 控件使用

本例在一个Toolbar控件中添加五个 Button 对象,并且向每个 Button 对象添加二个 ButtonMenu

对象。单击ButtonMenu对象时,其行为由ButtonMenuClick事件来决定。为了试验本例,在窗体中放置一个 Toolbar

控件,将代码粘贴到代码模块的声明部分。

Option Explicit

Private Sub Toolbar1_ButtonMenuClick(ByVal ButtonMenu As ComctlLib.ButtonMenu)

   Select Case ButtonMenu.Index

   Case 1

      MsgBox "Press the button."

   Case 2

      MsgBox "Offer some option"

   End Select

End Sub

 

' 窗体加载事件:

Private Sub Form_Load()

   Dim i As Integer

   Dim btn As Button

  

   ' 添加五个 Button 对象到 Toolbar 控件。

   For i = 1 To 5

      Set btn = Toolbar1.Buttons.Add(Caption:= i, Style:= tbrDropDown)

      ' 添加两个 ButtonMenu 对象到每一个Button。

         btn.ButtonMenus.Add Text:="Help"

         btn.ButtonMenus.Add Text:="Options"

   Next i

End Sub

 

Treeview 控件的使用方法

建立一个窗体,在窗体上放置如下控件:

Treeview 控件:名称 Treeview1;

  Imagelist 控件:名称 Imagelist1,并在该控件中放置三张个性图片(32×32),建立索引1、2、3;(方法:在Imagelist

控件上单击鼠标右键选择属性)

  Label 控件:名称分别为Lab(0)、Lab(1),Caption分别为“父节点:”、“子节点:”;

  Textbox 控件:名称分别为Txt(0)、Txt(1),text都为“”;

  commandbutton 控件:名称为系统默认,Caption分别为“添加”、“展开”、“收起”、“排序”、“删除”、“退出”;

  将下列代码加入到代码框:

Option Explicit

Dim I As Integer

Dim J As Integer

Dim nodx As Node

Dim CunZai As Boolean '定义变量

 

Private Sub Command1_Click()

 If Txt(0).Text <> "" And Txt(1).Text <> "" Then '不允许建立零字节的父节点和子节点

  CunZai = False

  J = TreeView1.Nodes.Count

  For I = 1 To TreeView1.Nodes.Count '检查新输入的父节点名称是否存在

   If TreeView1.SelectedItem.Children > 0 Then

    If Txt(0).Text = TreeView1.Nodes(I).Text Then CunZai = True

    End If

  Next I

  If CunZai = True Then '若存在, 则在父节点下建立子节点

   Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J,

               Txt(1).Text, 3)

  Else ,若不存在,则建立父节点和子节点

   Set nodx = TreeView1.Nodes.Add(, , Txt(0).Text, Txt(0).Text, 1)

   Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J,_

          Txt(1).Text, 3)

  End If

  TreeView1.Refresh

 ElseIf Txt(0).Text = "" Then MsgBox "请输入父节点名称!", vbInformation, "警告!"

  '系统提示

 ElseIf Txt(1).Text = "" Then MsgBox "请输入子节点名称!", vbInformation, "警告!"

 End If

End Sub

Private Sub Command2_Click()

 For I = 1 To TreeView1.Nodes.Count

  TreeView1.Nodes(I).Expanded = True '展开所有节点

 Next I

End Sub

Private Sub Command3_Click()

 For I = 1 To TreeView1.Nodes.Count

  TreeView1.Nodes(I).Expanded = False '收起所有节点

 Next I

End Sub

Private Sub Command4_Click()

 TreeView1.Sorted = True '排列顺序

End Sub

Private Sub Command5_Click()

 If TreeView1.SelectedItem.Index <> 1 Then