在未打开的spreasheet

时间:2015-10-21 20:19:56

标签: vba excel-vba excel

我要做的是:

使用VBA创建数据查询用户表单,允许用户查询每日数据。这通常是一个非常简单的项目,但仅仅是必要的,因为尚未构建足够的数据库。目前,每天都会将单独的电子表格保存到共享驱动器上。每个电子表格的标题中都包含日期。 (例如:“H:SharedDrive / DataSheets / 2May2012.xls”)。每个电子表格中都有每天记录的各种数据;每个数据都有一个日常不变的类别(这些类别名称被锁定以进行编辑)。

我的原创方法

我创建了一个简单的用户表单,允许用户输入所需查询的日期范围和所需数据的电子表格地址。经过多次试验,我发现实际打开每个电子表格并将数据复制并粘贴到新工作表中是相当漫长的,特别是如果用户在几年的时间内查询。然后我开始使用“ExecuteExcel4Macro()”来查询每个电子表格中的数据,而无需单独打开每个电子表格。这很有效,完美地完成了我的需要。

问题

事实证明,那些每天将数据输入这些电子表格的人并未保留统一的数据输入格式。通常,在将填好的模板保存到共享驱动器之前,会在电子表格中添加新的行或列。因此,仅仅因为过去两个月特定数据的地址是“H69”并不意味着该格式在两个月前没有改变,并且同一条数据先前存放在单元格“H72”中。这对我的程序来说是个明显的问题。

我尝试过什么

我试图使用实际的类别名来查询一段数据。这些类别名称永远不会改变。例如,用户在数据输入单元左侧的列中标记为“压力”和“温度”的单元中记录压力和温度。记录数据的地址随时间不是恒定的,但是“压力”和“温度”这两个词不能改变。我知道在电子表格中检索数据地址的最简单方法是Find()函数。但是,据我所知,此功能仅适用于打开的工作簿中的工作表。这让我回到了我原来的问题,即与打开单个电子表格相关的查询时间更长(太长而无法成为有效的工具)。

是否有类似于适用于未打开的工作簿的Find()函数?

1 个答案:

答案 0 :(得分:1)

当我无法使用FIND()时,我使用循环来检查值。 您可以使用RC表示法和x和y变量来遍历工作表中的数据。然后检查你的关键词。找到关键字后,计算数据的偏移量。

注意:检查500个单元格大约需要1秒钟,所以我会尽量保持你循环的范围很小。

sub test()
Dim x As Integer, y As Integer
Dim myfile As String
Dim myvalue As Variant


For x = 1 To 10
For y = 1 To 50
    myfile = "'C:\Users\jmgri798\Documents\GRMRS\Temp\[Test Data.xlsx]Sheet1'!r" & x & "c" & y
    myvalue = ExecuteExcel4Macro(myfile)
    If myvalue = "DEF" Then
        myfile = "'C:\Users\jmgri798\Documents\GRMRS\Temp\[Test Data.xlsx]Sheet1'!r" & x & "c" & y + 1
        myvalue = ExecuteExcel4Macro(myfile)
        Sheet1.Range("b2") = myvalue
    End If
Next y
Next x
end sub