设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3613|回复: 9
打印 上一主题 下一主题

[模块/函数] 【已解决】请教大神:引用窗体变量的RecordSource属性出现“类型不匹配”

[复制链接]
跳转到指定楼层
1#
发表于 2016-8-11 22:31:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lx12112006 于 2016-8-12 15:13 编辑
  1. '右键导出EXCEL button
  2. Public Function ExcelOut()
  3.     Dim strPath As String
  4.     Dim obj As Control
  5.     Dim frm As Form
  6.     Dim frm_p As Form
  7.     Dim strSQL As String
  8.     Dim strSQL2 As String
  9.    
  10.     '刷新

  11.     Set obj = Screen.ActiveControl
  12.     Set frm = obj.Parent
  13.     Set frm_p = frm.Parent
  14.    
  15.     Debug.Print frm.Name
  16.     Debug.Print frm_p.Name
  17.    
  18.     strSQL = Forms(frm_p)(frm).Form.RecordSource
  19.     'strSQL2 = Forms!frm策略组合维护.frm策略组合维护_子窗体.Form.RecordSource
  20.    
  21.     Debug.Print strSQL
  22.     'Debug.Print strSQL2
  23.    
  24.    
  25.     'strPath = SelectFolder()
  26.     'DoCmd.RunSQL "Select * INTO [Sheet1] IN 'E:\ACCESS\股指期货投资管理系统\FilesOut' 'EXCEL 8.0;' FROM 表名"
  27.    
  28. End Function
复制代码
哪位大神帮我看看,strSQL怎么也取不到RecordSource,总是提示类型不匹配。但是我把变量替换成窗体名称直接引用,strSQL2就没有问题。好奇怪
——————————————————————————————
更新一下,其实问题转化为:引用recordsource时,Forms!主窗体!子窗体.recordsource中如果主窗体和子窗体用窗体变量代替,应该怎么写?
——————————————————————————————
再次更新,谢谢各位大牛的指点,这个问题得到了解决,问题的核心还是父子窗体变量的引用格式问题。原来子窗体作为参数引用的时候前面不是forms(XX),而是被当成一个控件,需要用controls(XX)。改为strSQL = Forms(frm_p.Name).Controls(frm.Name).Form.RecordSource 就可以了。


得到了大家的帮助,我就回馈大家吧,我把这个右键导出的函数给完善了,大家有需要的可以拿去用。应该说应用场景还是比较多的,对于窗体中有TreeView的时候,一般会有个子窗体动态的显示点击相应节点后的数据,所以子窗体的recordsource是动态更新的,想右键导出选择后的子窗体数据,是可以把这个函数装在commandbar里面。注意有个公共常量是默认的导出路径,需要修改一下。不知道为啥贴不上来,好像限制了最大行数?
代码在这里:
http://www.office-cn.net/forum.php?mod=redirect&goto=findpost&ptid=122039&pid=751231&fromuid=251741







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2016-8-11 22:34:52 | 只看该作者
我感觉是引用窗体用法不对?
3#
发表于 2016-8-11 23:11:04 | 只看该作者
1、写法不对。写法是:Forms!主窗体!子窗体.recordsource
2、如果不是引用查询或者表,而是使用sql语句时,是可以获取的。如果是查询的话,则可以考虑使用querydef的sql属性。
3、如果只是导出的话,其实不必那么复杂,用transferspreadsheet就好了。
4#
 楼主| 发表于 2016-8-11 23:29:05 | 只看该作者
roych 发表于 2016-8-11 23:11
1、写法不对。写法是:Forms!主窗体!子窗体.recordsource
2、如果不是引用查询或者表,而是使用sql语句时 ...

谢大神,但是关于1和3我还有些问题:
我这个函数是想导出子窗体的数据,但是子窗体的recordsource是动态变化的,貌似transferspreadsheet只能导出表或者查询的结果?好像不满足需要。
然后第一个关于引用父子窗体写法,我直接把父子窗体写出来引用是没有问题的,换成变量就不对了,求教大神如果父子窗体都是变量的话,引用recordsource语句要怎么写呢?查了一个晚上都没有找到==
querydef没有用过,要学习一下,看看能不能满足需要。
5#
 楼主| 发表于 2016-8-11 23:48:51 | 只看该作者
补充一下,这句引用的:Forms(frm_p)(frm).Form.RecordSource 是参考这个
http://www.office-cn.net/forum.p ... &fromuid=251741
我还试过了以下几种都不行:
Forms!Forms(frm_p).Forms(frm).Form.RecordSource
Forms(frm_p).Forms(frm).Form.RecordSource
Forms!Forms(frm_p)(frm).Form.RecordSource

快给搞疯掉了
如果不是变量,直接写Forms!frm策略组合维护.frm策略组合维护_子窗体.Form.RecordSource就可以。但是我想写个通用的函数,在多个地方调用,所以想把父子窗体都作为变量。

点击这里给我发消息

6#
发表于 2016-8-12 08:55:43 来自手机 | 只看该作者
你要先明白forms与frm变量区别
来自: 微社区
7#
 楼主| 发表于 2016-8-12 09:02:40 | 只看该作者
tmtony 发表于 2016-8-12 08:55
你要先明白forms与frm变量区别

怎么说?Forms是集合,引用变量只能用forms(XX)的格式,但是我用Forms!Forms(frm_p).Forms(frm).Form.RecordSource的格式也不行。应该怎么改?或者哪里有个例子让我学习一下呢?谢谢啦

点击这里给我发消息

8#
发表于 2016-8-12 12:06:16 | 只看该作者
Forms!Forms(frm_p).Forms(frm).Form.RecordSource的格式也不行
这个肯定错了啊
你要理解里面的意思
如果是知道 具体已打开的窗体的名称
Forms!你的窗体的名称.form.recordsource
或者在窗体上引用
me.parent.form.recordsource
不要2者混在一起使用,就乱了
9#
 楼主| 发表于 2016-8-12 14:04:55 | 只看该作者
tmtony 发表于 2016-8-12 12:06
Forms!Forms(frm_p).Forms(frm).Form.RecordSource的格式也不行
这个肯定错了啊
你要理解里面的意思

我这段程序是个函数,所以就是不知道窗体的名称,也不在窗体里面哦。不过,我已经解决这个问题啦,就是把这句改为strSQL = Forms(frm_p.Name).Controls(frm.Name).Form.RecordSource 就可以了。原来子窗体作为参数引用的时候前面不是forms(XX),而是被当成一个控件,需要用controls(XX)。
Anyway,还是谢谢啦
10#
 楼主| 发表于 2016-8-12 15:12:21 | 只看该作者
  1. '右键导出EXCEL button
  2. Public Function ExcelOut()

  3.     Dim obj As Control
  4.     Dim frm As Form
  5.     Dim frm_p As Form
  6.     Dim strFileName As String
  7.     Dim s1 As String
  8.     Dim s2 As String
  9.     Dim strSQL As String
  10.     Dim strSQL2 As String

  11.     '取得要导出的数据所在的窗体和子窗体
  12.     Set obj = Screen.ActiveControl
  13.     Set frm = obj.Parent
  14.     Set frm_p = frm.Parent
  15.    


  16.     strSQL = Forms(frm_p.Name).Controls(frm.Name).Form.RecordSource
  17.     'strSQL = Forms!frm策略组合维护.frm策略组合维护_子窗体.Form.RecordSource
  18.     'Debug.Print strSQL
  19.    
  20.         '取得另存为文件名
  21.     With Application.FileDialog(msoFileDialogSaveAs)
  22.         .InitialFileName = strPathOut & frm_p.Caption & ".xls"
  23.         If Not .Show Then Exit Function
  24.         strFileName = .SelectedItems(1)
  25.         If Not strFileName Like "*" & ".xls" Then
  26.             strFileName = strFileName & ".xls"
  27.         End If
  28.         If Len(Dir(strFileName)) > 0 Then Kill strFileName
  29.     End With
  30.    

  31.     '将recordsource断句为select和from
  32.     s1 = Mid(strSQL, 1, InStrRev(strSQL, "from") - 1)
  33.     s2 = Mid(strSQL, InStrRev(strSQL, "from"))
  34.    
  35.     strSQL2 = s1 & "INTO [Sheet1] IN '" & strFileName & "' 'EXCEL 8.0;'" & s2 & ";"
  36.     'Debug.Print strSQL2
  37.     DoCmd.RunSQL strSQL2
  38.       
  39.    
  40. End Function
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-1 14:07 , Processed in 0.091787 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表