2016-04-27 159 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#這樣的強類型語言中)。 –