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

时间:2017-12-20 11:36:03

标签: vba excel-vba access-vba ms-access-2010 excel

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

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

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

我试图避免全局/公共变量。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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

应该工作

答案 2 :(得分:0)

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

A )将全局变量用于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

我用于此代码的一些建议&#34;多个vars&#34;: - 始终使用Low Case变量或更改此:

paramvars=tmpsplit(0)

通过

paramvars=lcase(tmpsplit(0))

- 如果您需要使用&#34; =&#34;进入价值,您可以通过其他替代字符更改或搜索第一个&#34; =&#34;表格左(我使用此解决方案而不是拆分)

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

在您的解决方案中选择来自Access的Excel表格,我认为有更好的选择。