我需要通过VBA代码"物理地"创建SQL查询.我知道如何在VBA中执行查询,但我需要将其保存在菜单中.如果可以,我会张贴一张照片.我会试着让你想象.
在MS Access的主屏幕中,左侧有一个栏.
为了说清楚,"Consulta"是葡萄牙语查询.
如果你不理解我,请原谅我缺乏解释.我很乐意再次解释.
当我的数据库打开时,它会显示一个带有"加载栏"的表单,该表单在显示"主菜单"表单之前报告链接外部表等的进度.主菜单有一些代码,可以在幕后以编程方式生成一个表单,上面有按钮,当它完成后,它会保存并重命名表单,并将其指定为SourceObject子表单.
这一切都很好,花花公子,也就是说,直到我决定让按钮实际做一些有用的事情.在生成按钮的循环中,它将VBA代码添加到子窗体的模块中.出于某种原因,这样做会使VBA完成执行,然后停止.这使得(模态)加载形式不会消失,因为有一个If语句DoCmd.Close在完成加载时执行a 来关闭加载表单.它还会破坏依赖于所设置的全局变量的功能,因为在执行暂停时会清除全局变量.
有没有更好的方法来创建以编程方式执行操作的按钮,而不是放弃直接访问和编写实际代码?尽管我很乐意,但是如果我离开公司,我不得不在Access中这样做,以便那些技术娴熟的员工在我缺席的情况下仍能使用它.
如果需要,下面是相关代码的点点滴滴.
Form_USysSplash:
'Code that runs when the form is opened, before any processing.
Private Sub Form_Open(Cancel As Integer)
'Don't mess with things you shouldn't be.
If g_database_loaded Then
MsgBox "Please don't try to run the Splash form directly.", vbOKOnly, "No Touching"
Cancel = True
Exit Sub
End If
'Check if the user has the MySQL 5.1 ODBC driver installed.
Call CheckMysqlODBC 'Uses elfin majykks to find if Connector/ODBC is installed, …Run Code Online (Sandbox Code Playgroud) 首先,我搜索并阅读了类似的线程,我已经尝试了所提出的解决方案并解决了其他人的问题(主要使用工作簿名称周围的单引号),但它在我的情况下没有用.
我想要做的很简单:我想从Access调用Excel工作簿.工作簿已经打开(使用VBA),因此这不是关闭工作簿的问题.以下是我尝试运行宏的方法:
Application.Run "'" & xlWb.Path & "\" & xlWb.Name & "'" & "!mainParcourirTrouverItem"
Run Code Online (Sandbox Code Playgroud)
结果是:
'I:\47491\...\Trouver items global.xlsm'!mainParcourirTrouverItem
我尝试了一些变体,比如不使用完整路径(仅文件名),不使用单引号,在子名称的末尾添加括号...
另外,我仔细检查了子名的拼写是否正确.我真的不明白:|
哦,只是为了给出上下文,这里是这个代码的完整子:
Private Sub Commande10_Click()
Dim xlApp As Excel.Application
Dim xlWb As Excel.Workbook
Set xlApp = New Excel.Application
With xlApp
.Visible = False
Set xlWb = .Workbooks.Open(FichierImportExcel, ReadOnly:=True)
End With
Application.Run "'" & xlWb.Path & "\" & xlWb.Name & "'" & "!mainParcourirTrouverItem"
' Call importer_transitsrubriques_Click
End Sub
Run Code Online (Sandbox Code Playgroud)
非常感谢.
我目前有一个访问表单.
我想要做的是获取最后一条记录的值.
例如,如果我有10条记录,我想得到值"10",因为这是添加的最后一条记录的id.我试图使用函数last id inserted()运行查询,但它不起作用.
这是我正在使用的代码:
Dim lastID As Integer
Query = "select last_insert_id()"
lastID = Query
MsgBox (lastID)
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我为制造工厂构建了一个访问应用程序,并为他们提供了一个报告,列出了流程中的不同数据点.我有办法生成如下所示的报告.
Batch Zone Value1 Value 2 etc.
25 1 5 15
25 2 12 31
26 1 6 14
26 2 10 32
Run Code Online (Sandbox Code Playgroud)
但是,需要以不同的格式查看数据.他们希望每批一行,所有数据都是水平的.像这样...
Zone 1 Zone 2
Batch Value1 Value2 Value1 Value2
25 5 15 12 31
26 6 14 10 32
Run Code Online (Sandbox Code Playgroud)
总共将有157列,如第二个示例中所示.有7个唯一的字段名称,但其余的是14种不同的重复数据类型.我无法获得以他们想要的格式显示数据的查询,这是因为字段名称是相同的,但是第一种方式并不难.我可以使用VBA将数据插入表中,但我不能使用重复的字段名称,所以当我将其导出到Excel时,字段名称不会有任何意义,并且不能有部分(如zone1)我可以将报告链接到此,但报告宽度只能是22",所以我必须导出然后在另一端进行excel表的一些vba处理,以便清晰地显示.
我可以将数据转换为格式#1,有什么方法可以根据批号在一个长行中显示数据?有没有其他人知道这是如何可行的?
对任何建议开放.谢谢!
我有一个名为cls_Utilitario的类,其方法如下:
Public Function LimparCampos(arg_form As Object)
Dim campo As Control
For Each campo In arg_form.Controls
With campo
Select Case .ControlType
Case acComboBox, acTextBox
.Value = Null
End Select
End With
Next campo
Set campo = Nothing
Set arg_form = Nothing
End Function
Run Code Online (Sandbox Code Playgroud)
我在表单中有以下代码:
Private Sub btnNovo_Click()
Dim obj_Utilitario As cls_Utilitario
Set obj_Utilitario = New cls_Utilitario
obj_Utilitario.LimparCampos (Me.Form)
End Sub
Run Code Online (Sandbox Code Playgroud)
如果我将参数更改为"对象"类型,为什么它不起作用?我也试过"Variant"和"Form"类型但是没有成功.
提前致谢.
您好我在MS Access 2013中的表单中有一些vba代码,出于某种原因,当我得到一个记录集时,它报告30行,当数据库真的只有1行并且我已经验证了这一点.
当我进行调试打印以查看id时,它只是重复30次的相同记录.
下面是运行的代码.
Option Compare Database
Dim selectPlacement As QueryDef
Dim rs As Recordset
Private Sub Form_Current()
Set selectPlacement = CurrentDb.QueryDefs("SelectPlacement")
Me.AddPlacementForm.Form.Visible = False
selectPlacement.Parameters!stu = Me.student_id.Value
selectPlacement.Parameters!sem = Me.semester_id.Value
Me.AddPlacementForm.Form!lstStudent.Value = Me.student_id
Me.AddPlacementForm.Form!cmbSemester.Value = Me.semester_id
Me.PlacementsBlock1.Form.Filter = "[semester_id]= '" & Me.semester_id.Value & "'"
Me.PlacementsBlock2.Form.Filter = "[semester_id]= '" & Me.semester_id.Value & "'"
Me.PlacementsBlock1.Form.FilterOn = True
Me.PlacementsBlock2.Form.FilterOn = True
Set rs = selectPlacement.OpenRecordset
Call SetUpPlacements(rs)
rs.Close
Set selectPlacement = Nothing
End Sub
Private Sub SetUpPlacements(rs As Recordset)
If rs.RecordCount …Run Code Online (Sandbox Code Playgroud) 问题:我有一个直接链接到本地表的分组MS Access 2010报告.它每个记录有40个"绑定"字段,每组有152个计算字段.当我的vba脚本尝试自动更新最后几个计算字段的控制源时(在运行时),它会抛出"查询太复杂"的错误!
背景: 我正在创建一个直接链接到本地表的MS Access报告,该表包含一个Person字段/列,一个Project字段/列和每个记录的38个数字字段/列.
报告按人员分组,每个人都有多个项目记录.
在每个人的组页脚中,我在38个数字字段/列的每个下面有4个计算控件.
回顾一下,每个记录总共有40个"绑定"/直接链接字段,每组有152个计算字段.
该报告直接绑定到本地表,该表定期删除并通过可绑定查询重新创建,该查询绑定到动态SQL查询,该查询根据当天的日期输出不同的列.为了说明动态查询将提供的不同字段名称,我有一些VBA脚本执行与服务器上相同的计算(计算今天的日期-11个月和+6个月之间的所有月份以及匹配的格式预期的列名称,然后更改相关报告字段和列标签标题的控制源,以匹配来自动态查询的表所期望的内容.
除了我最后几行代码更新组页脚中的一些计算字段外,这一切似乎都很有效.这是脚本的工作部分(来自报告的On Open事件),所有这些似乎都正常工作,仅适用于上下文:
Dim NowDate As Date
Dim i, monthcalc As Integer
Dim Dates(1 To 18) As String
NowDate = Now()
monthcalc = -11
'The below creates variables of formatted dates to be used as control sources for the expected fields incoming from SQL
For i = 1 To 18
Dates(i) = Year(DateAdd("m", monthcalc, NowDate)) & Format(month(DateAdd("m", monthcalc, NowDate)), "00")
monthcalc = monthcalc + 1
Next i
monthcalc …Run Code Online (Sandbox Code Playgroud) 我有一个数据库Database和一个表Table.我在网上找到了如何从MS Access中的VBA中新创建的数据库和表创建字段,但是在运行宏之前数据库和表已经存在时,我不知道如何执行此操作.
要在没有预先存在的数据库和表的情况下执行此操作,我可以运行以下命令:
Sub CreateTable()
Dim db As DAO.Database
Dim table1 As DAO.TableDef
Set db = CurrentDb
Set table1 = db.CreateTableDef("ExampleTable")
With table1
.Fields.Append.CreateField("newField", String)
End With
Run Code Online (Sandbox Code Playgroud)
但是我如何调整它以将相同的字段添加到预先存在的表中?
或者更具体地说,我该如何修改
Set table1 = db.CreateTableDef("ExampleTable")
Run Code Online (Sandbox Code Playgroud)
那么table1指向db数据库中的现有表?
我怎么能反转一个充满整数的数组,例如:
[1;5;8;45;54]
Run Code Online (Sandbox Code Playgroud)
至:
[54;45;8;5;1]
Run Code Online (Sandbox Code Playgroud)
我可以使用任何内置功能吗?
我尝试过使用这种方法:
Array.Reverse(arr)
Run Code Online (Sandbox Code Playgroud)
我从工具>引用添加了Mscorlib.dll,但它显示错误:语法错误.在Array.Reverse(arr)位置.