2016-04-27 134 views
0

我想我正在失去主意 - 如何将变量声明为字符串,然后将其设置为等于VB.NET中的Excel工作簿中的范围?在VBA中这很容易:将变量定义为一个范围 - VB.NET

Dim SQL as string 
SQL = ActiveWorkbook.Sheets("MySheet").Range("SQL") 

如果我在VB.NET(在Visual Studio 2015中)尝试做这样的事情,首先我找不到Activeworkbook。其次,如果我尝试Excel.Range("SQL"),则会收到一条错误消息,说'Range' is an interface type and cannot be used as an expression。此外,它看起来不存在Range数据类型。当然这个功能存在于VB.NET中,对吗?

感谢您的帮助!

回答

1

要在Excel中工作,因为VB.NET,首先必须将引用添加到您的项目:

Microsoft.Office.Interop 

,要添加一个参考:

Solution Explorer,右键单击References节点上选择Add Reference

导入参考在代码:

Imports Microsoft.Office.Interop 

尝试使用此代码:

Dim AppExcel As New Excel.Application 'Create a new Excel Application 
Dim workbook As Excel.Workbook = AppExcel.Workbooks.Add() 'Create a new workbook 
Dim sheet As Excel.Worksheet = workbook.Sheets("Sheet1") ' Create variable a Sheet, Sheet1 must be in WorkBook 

'Work with range 
Dim cellRange1 As Excel.Range = sheet.Range("A1") 'Range with text address 
cellRange1.Value = "Text in Cell A1" 

Dim cellRange2 As Excel.Range = sheet.Cells(2, 2) 'Range("B2:B2") with index; Cells(N°Row,N°Col) 
cellRange2.Value = "Text in Cell B2" 


Dim tableRange3 As Excel.Range = sheet.Range("A1:F4") 'Range with text address 

Dim tableRange4 As Excel.Range = sheet.Range(sheet.Cells(1, 1), sheet.Cells(4, 6)) 'Range("A1:F4") with index; Cells(N°Row,N°Col) 

AppExcel.Visible = True 'To display the workbook 

代码,而可变片

Dim AppExcel as New Excel.Application 
Dim workbook As Excel.Workbook = AppExcel.Workbooks.Add() 
'Range 
Dim cellrange1 as Excel.Range = AppExcel.ActiveWorkbook.Sheets("Feuil1").Range("A1") 
+0

对不起,我忘了提及我已经有了那个参考,我想。它显示为Microsoft.Office.Interop.Excel。那是正确的吗?我认为只有在我不想写出所有对象限定符时才需要Imports语句。没有必要,是吗? 你是上面的例子,但为什么我不能这样做: Dim AppExcel as New Excel.Application Dim cellrange1 as Excel.Range = AppExcel.ActiveWorkbook.Sheets(“MySheet”)。Range(“SQL “)。值。 我不喜欢在其他变量中嵌套变量,但我上面写的东西在Visual Studio中似乎不起作用。 谢谢! – christopheralan88

+0

首先,您不能这样做,因为您必须创建一个WorkBook对象,并且不能将对象类型指定给Range类型。第二个为什么把SQL放在代表SQL的范围(“SQL”)中;必须是地址范围。 –

+0

为什么我不能将对象类型分配给Range变量?那么我将如何分配一个范围的值/文本呢?我是VB.NET新手,但我相信你可以引用一个命名范围,对吗?如果单元格A1被命名为“BudgetSQL”,那么将“BudgetSQL”放在Range对象的Cell1参数中应该没问题,对吧? – christopheralan88

1

您将需要从您的应用程序启动目的。假设是:

Dim AppExcel As New Excel.Application 

从那里,你可以这样做:

Dim cellrange1 as Excel.Range = AppExcel.ActiveWorkbook.Sheets("MySheet").Range("SQL") 

因为你声明cellrange1作为Range它不能被设置为Range("SQL").Value
Value返回object,它是包含在该Range中的值。

这太罗嗦了。把它(也许)更清楚,Range("SQL")返回RangeRange("SQL").Value返回一个对象。

如果你想得到的价值,那将是cellrange1.Value,或者cellrange1.Text。假设范围包含某种SQL,我会用Text

Excel互操作性编程的一个不幸的方面是许多属性返回对象而不是强类型值。例如,由Range.Text返回的对象始终是string,但该属性仍会返回object。这意味着Visual Studio intellisense通常不会告诉你属性返回的是什么类型。您需要查看documentation中的属性和功能才能真正知道它们返回的内容。

+0

因此,Visual Studio在我写上述行时不会引发错误,但在键入表格(“MySheet”)后,Intellisense不会在下拉列表中显示Range对象。你知道这是为什么吗?当你解释Text和Value属性时,这是有道理的。你碰巧知道为什么我可以在VBA中将一个字符串变量设置为一个Range对象?我在VBA和Interop之间查找了Value对象,它们看起来非常相似,但interop具有“As Object”作为数据类型,而VBA在对象浏览器中没有显示数据类型。这是你所指的差异吗? – christopheralan88

+0

'Sheets()'可能返回一个'object'。它迫使你以某种方式知道实际的类型是什么。这是Excel interop的问题之一。函数或属性应该返回一个有意义的类型(至少在像C#这样的强类型语言中)。 –