0

我正在使用 Visual Studio 2010 从 Excel 工作簿模板创建项目。VS2010 已经给了我一个带有一个工作表的工作簿。我又加了一个。该项目由以下文件组成: ThisWorkbook.vb Sheet1.vb Sheet2.vb

每个文件由每个对象的类组成:Sheet1.vb 有其 Sheet1 类,Sheet2.vb Sheet2 类等等。

从 MSDN 帮助和其他来源,我了解到我可以从 vb 文件或另一个类,使用 Globals 语句的其他类对象访问:

    Me.Range("A10").Value = "Validation time:"
    Me.Range("B10").Value = ValidationTime_T1.Item(ValidationTime_T1.Count - 1) - ValidationTime_T0.Item(ValidationTime_T0.Count - 1)


    Dim x As Double

    Dim rowOffset As Integer

    rowOffset = 3

    For x = 0 To JobCounter
        Globals.Sheet2.Cells(x + rowOffset, 1) = x
        Globals.Sheet2.Cells(x + rowOffset, 2) = ASy_Start_Mem.Item(x)
        Globals.Sheet2.Cells(x + rowOffset, 3) = WSZ_Start_Mem.Item(x)
        Globals.Sheet2.Cells(x + rowOffset, 4) = WSZ_Start_Pk_Mem.Item(x)
        Globals.Sheet2.Cells(x + rowOffset, 5) = PFU_Start_Mem.Item(x)

如您所见,我将数据从一张表移动到另一张表,或者将内存中的数据从 sheet1 放到 sheet2 中。

到目前为止,一切都很好。没有多少问题是我自己解决不了的。

我想在这里指出我过去 4 年的背景是 C、C++、Perl 和 VBA 是件好事,所以我在 VB 上苦苦挣扎,因为我发现 .Net 更有用,直到我不得不使用它与Excel,这让我很难过。

现在,我需要根据位置选择特定的单元格,它并不总是相同的位置,所以我需要动态选择它们,没有硬编码,正如我在 MSDN、论坛、StackOverFlow 和不同站点中找到的那样,他们给出的解决方案是使用:

Globals.Sheet2.Range("C7").Select()

是的,这对于您使用字符串选择的特定单元格来说很好。

问题是我每次都需要根据每天的数据选择不同的单元格,而且我不知道如何使用 Range。在前面的代码中,您可以看到我为此使用了 Cells。

我试过了:

Globals.Sheet2.Range(Globals.Sheet2.Cells(2, 2), Globals.Sheet2.Cells(6, 3)).Select()

因为 Range 定义之一表明我可以接收两个 Cells 对象作为参数,但给出了错误。我尝试为单元格位置创建 Range 对象。我已经将 Object 对象与 CType 一起使用,但它也失败了。

如果有人可以帮助我如何动态选择单元格,无论是使用 Range 或 Cells,还是两者兼而有之,或者如果您有其他解决方案,我将很高兴。

4

1 回答 1

1

首先感谢 TnTinMn 的回复,我再次为迟到的回复道歉,工作太疯狂了。

好吧,由于您的评论,我找到了解决方案。

Excel.Interop 和 Visual Basic .Net 似乎存在一个称为“两个点”的已知问题。通常,当您在 VS 中编写 VB 时,写几个字母,IntelliSense 会提示您可能可用的内容(属性、方法或对象),然后您输入一个点,然后出现另一个列表,显示可用的内容,一旦您选择了前两个您可以将类别分配给变量或对象,或者给它们一个值。但是您仍然可以放置另一个点并获取另一个列表,这是 VB 搞砸并且无法正常工作的地方,可能 VS 会让您放置任何数量的 dos,但在运行时您会收到我得到的错误。希望有经验的 StackOverflow 专家能更好地解释这一点。

因此 Select 方法的解决方案:首先您需要使工作表处于活动状态,然后您可以使用 Select 方法,因为 TnTinMn 预测错误是与 Select 方法有关。

Globals.Sheet2.Activate()
Globals.Sheet2.Range(Globals.Sheet2.Cells(2, 2), Globals.Sheet2.Cells(6, 3)).Select()

现在 Select 方法不会抛出运行时错误。使用之前的代码,您现在可以选择通过任何单元格而无需硬编码。

以下也可用于存储来自不同部分的数据范围,以便稍后在图表中使用:

Dim dataX As Excel.Range
Dim dataY As Excel.Range
Dim dataRange As Excel.Range

dataX = Globals.Sheet6.Cells(xRow, XColumn)
dataY = Globals.Sheet6.Cells(yRow, yColumn)

dataRange = Application.Union(dataX, dataY)

谢谢你,希望这对某人有所帮助。

于 2016-05-02T17:31:09.677 回答