在 VS 2010 项目中使用 VB.Net 动态地 select Excel 个单元格
Dynamically select Excel cells with VB .Net in a VS 2010 project
我正在使用 Visual Studio 2010 从 Excel 工作簿模板创建项目。 VS2010 已经给了我一个工作簿sheet。我又加了一个。该项目由以下文件组成:
ThisWorkbook.vb
Sheet1.vb
Sheet2.vb
每个文件由每个对象的 class 组成:Sheet1.vb 有其 Sheet1 class、Sheet2.vb Sheet2 class 等等。
从 MSDN 帮助和其他来源,我知道我可以从 vb 文件或另一个 class 文件访问其他 class 使用 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)
如您所见,我将数据从一个 sheet 移动到另一个,或者将内存中的数据从 sheet1 移动到 sheet2。
到目前为止,还不错。没有多少问题是我自己解决不了的。
我认为在这里指出我的背景是 C、C++、Perl 和 VBA 在过去 4 年是很好的,所以我在 VB 上挣扎了很久我已经发现 .Net 更有用了,直到我不得不将它与 Excel 一起使用,这让我很难过。
现在,我需要 select 基于位置的特定单元格,它并不总是相同的位置,所以我需要动态地 select 它们,没有硬编码,正如我在 MSDN 中找到的、论坛、Whosebug 和不同的站点,他们给出的解决方案是使用:
Globals.Sheet2.Range("C7").Select()
是的,这对于使用字符串 select 的特定单元格很好。
问题是我每次都需要 select 不同的单元格,具体取决于每天的数据,而且我不知道如何使用 Range 来做到这一点。在前面的代码中,您可以看到我为此使用了 Cells。
我试过:
Globals.Sheet2.Range(Globals.Sheet2.Cells(2, 2), Globals.Sheet2.Cells(6, 3)).Select()
因为其中一个 Range 定义声明我可以接收两个 Cells 对象作为参数,但给出了错误。我试过为单元格位置创建 Range 对象。我用CType的Object对象,也失败了。
如果有人可以帮助我动态 select 单元格,无论是范围还是单元格,或两者兼而有之,或者如果您有其他解决方案,我将很高兴。
首先感谢TnTinMn 的回复,再次为迟到的回复道歉,工作太忙了。
好的,感谢您的评论,我找到了解决方案。
Excel.Interop 和 Visual Basic .Net 似乎存在一个名为 "two dots" 的已知问题。
通常,当你在 VS 中编程时 VB 写几个字母,IntelliSense 会提示你可用的内容(属性,方法或对象),然后你输入一个点,另一个列表会告诉你什么是可用,一旦你选择了前两个类别,你要么将它们分配给一个变量或对象,要么给它们一个值。但是你仍然可以放另一个点并得到另一个列表,这里是 VB 搞砸了而不工作的地方,可能 VS 会让你放任何数量的 dos,但在运行时你会得到我得到的错误。
希望有经验的 Whosebug 研究员能更好地解释这一点。
所以Select方法的解决方案:
首先你需要激活 sheet,然后你可以使用 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)
谢谢你,希望这对某人有所帮助。
我正在使用 Visual Studio 2010 从 Excel 工作簿模板创建项目。 VS2010 已经给了我一个工作簿sheet。我又加了一个。该项目由以下文件组成: ThisWorkbook.vb Sheet1.vb Sheet2.vb
每个文件由每个对象的 class 组成:Sheet1.vb 有其 Sheet1 class、Sheet2.vb Sheet2 class 等等。
从 MSDN 帮助和其他来源,我知道我可以从 vb 文件或另一个 class 文件访问其他 class 使用 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)
如您所见,我将数据从一个 sheet 移动到另一个,或者将内存中的数据从 sheet1 移动到 sheet2。
到目前为止,还不错。没有多少问题是我自己解决不了的。
我认为在这里指出我的背景是 C、C++、Perl 和 VBA 在过去 4 年是很好的,所以我在 VB 上挣扎了很久我已经发现 .Net 更有用了,直到我不得不将它与 Excel 一起使用,这让我很难过。
现在,我需要 select 基于位置的特定单元格,它并不总是相同的位置,所以我需要动态地 select 它们,没有硬编码,正如我在 MSDN 中找到的、论坛、Whosebug 和不同的站点,他们给出的解决方案是使用:
Globals.Sheet2.Range("C7").Select()
是的,这对于使用字符串 select 的特定单元格很好。
问题是我每次都需要 select 不同的单元格,具体取决于每天的数据,而且我不知道如何使用 Range 来做到这一点。在前面的代码中,您可以看到我为此使用了 Cells。
我试过:
Globals.Sheet2.Range(Globals.Sheet2.Cells(2, 2), Globals.Sheet2.Cells(6, 3)).Select()
因为其中一个 Range 定义声明我可以接收两个 Cells 对象作为参数,但给出了错误。我试过为单元格位置创建 Range 对象。我用CType的Object对象,也失败了。
如果有人可以帮助我动态 select 单元格,无论是范围还是单元格,或两者兼而有之,或者如果您有其他解决方案,我将很高兴。
首先感谢TnTinMn 的回复,再次为迟到的回复道歉,工作太忙了。
好的,感谢您的评论,我找到了解决方案。
Excel.Interop 和 Visual Basic .Net 似乎存在一个名为 "two dots" 的已知问题。 通常,当你在 VS 中编程时 VB 写几个字母,IntelliSense 会提示你可用的内容(属性,方法或对象),然后你输入一个点,另一个列表会告诉你什么是可用,一旦你选择了前两个类别,你要么将它们分配给一个变量或对象,要么给它们一个值。但是你仍然可以放另一个点并得到另一个列表,这里是 VB 搞砸了而不工作的地方,可能 VS 会让你放任何数量的 dos,但在运行时你会得到我得到的错误。 希望有经验的 Whosebug 研究员能更好地解释这一点。
所以Select方法的解决方案: 首先你需要激活 sheet,然后你可以使用 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)
谢谢你,希望这对某人有所帮助。