MS Access:从Excel工作簿中选择工作表

问题描述 投票:0回答:3

我正在MS Access中编写一些代码,我达到了用户需要选择Excel工作簿的哪个工作表需要执行某些操作的程度。我不知道,这个工作表的名称是什么,或者它放在哪个位置。

我正在考虑一个解决方案,它将向用户显示一个表单(作为模态表单),其中列表框包含所有工作表名称。当用户单击其中一个表单时,将显示A1:J10范围(因此用户可以选择正确的一个工作表)。确认选择的工作表后,它将作为工作表对象返回。

每件事都很棒,直到我想将一个对象变量传递给表单。在openArgs中,我只能传递一个字符串。我甚至考虑过一个会打开这个表单的类,但是传递对象参数仍然没有运气。

我正在努力避免全局/公共变量。

有任何想法吗?

vba excel-vba access-vba ms-access-2010 excel
3个回答
0
投票

假设你的对象是wsObj,你不能只使用wsObj.Name吗? 另外看看wsObj.CodeName,这也可能很有趣。


0
投票

在对象之间发送一些值有很多种可能性。

A)将Global vars用于ACCESS Vba模块

Global yourvariable As String

如果你需要一些不同的值可以使用Variant,Single等。

B)使用Windows注册来节省价值:

SaveSetting "yourprojectname", "Settings", "yourvariable", yourvalue

要检索价值:

retvalue = GetSetting("yourprojectname", "Settings", "yourvariable", "your_default_value_if_not_exist")

C)将OpenArg用于Open Form命令过程

DoCmd.OpenForm "stDocName", acNormal, "filter_if_needed", "stlinkcriteria", acFormEdit, acWindowNormal, "arguments_forOpenArgs"

在目的地表格上

Private Sub Form_Open(cancel as integer)
your_args=Me.OpenArgs

在所有三种可能的解决方案中,您可以使用带有变量和值的链来发送多个值,例如:

myvar_mutiple="name=John Doe|address=Rua del Percebe 34|location=Madrid|phone=34 91 1234567"

在这个例子中,我使用“pipe”(键1上的AltGr)char来分隔每个var = value然后在目标过程中只需要拆分每对:

splitvar=Split(myvar_multiple,"|")

通过这种方式,您可以为每个“splitvar”获取一个像“name = John Doe”这样的元素。再次使用“=”进行拆分以获得变量值。对于每个值,您可以将结果重新分配给本地变量。完整代码示例:

if me.OpenArgs<>"" then
   splitvar=Split(me.OpenArgs,"|")
   for x=0 to ubound(splitvar)
      tmpsplit=Split(splitvar(x),"=")
      paramvars=tmpsplit(0)
      paramvalue=tmpsplit(1)
      select case paramvars
         case "name"
            stname=paramvalue
         case "address"
            straddress=paramvalue
         case "location"
            strlocation=paramvalue
         case "phone"
            strphone=paramvalue
      end select
   next
end if

我用于此代码“多个变量”的一些建议: - 始终使用Low Case变量或更改此:

paramvars=tmpsplit(0)

通过

paramvars=lcase(tmpsplit(0))

- 如果您需要在值中使用“=”,您可以通过其他替代字符更改或搜索左侧的第一个“=”表单(我使用此解决方案而不是拆分)

paramvars=trim(lcase(left(splitvar(x),len(splitvar(x))-(len(splitvar(x))-instr(splitvar(x),"="))-1)))
  • 请记住,您可以发送任何值,并可以转换目标代码。在此示例中,我只使用String,因此您可以使用cLng或cInt等。

在您的解决方案中从Access选择Excel on Excel我认为有更好的选择。


0
投票

在表单模块中,您可以将属性声明为对象,然后在加载后设置该属性。所以在表单模块中

Option Explicit
Private myObj as object
Property Set DesiredWorksheet(o as object)
set myobj = o
End

然后在你的代码中

 Load myform
    set myform.desiredworksheet = wsObj
    myform.show

啊,对不起,我写的是Excel不能访问!!!

 Docmd.openform f
 f.desiredworksheet = ws.obj
 docmd.openform f, windowmode:=acdialog

应该工作

© www.soinside.com 2019 - 2024. All rights reserved.