2015-07-03 77 views
-1

我已經定義了一個名字:檢索列()全局變量進入VBA

=COLUMN("Sheetname!C10") 

比方說,我把它命名爲「myColumn」。

我試圖通過檢索它進入VBA:

x = Worksheets("Sheetname").Range("myColumn").Value 

但我發現了一個1004;應用程序定義或對象定義的錯誤。

我試着在VBA使用Excel和CStr的()TEXT()來強制型拐彎,以及

Dim x As String 

無濟於事。

其他名稱我沒有麻煩進入VBA(那些沒有ADDRESS()或COLUMN()類型的函數)。

什麼樣的輸出是在Excel的名稱管理器中定義的變量?我如何正確地將其檢索到VBA中?非常感謝!


編輯:想評論,但太長了;

對不起,不清楚。重點是我有一個名稱定義不在任何工作表(如在;沒有'有'這個名字的單元格);它只是名稱管理器中定義的公式。此名稱隨後在具有INDIRECT()的Excel公式中使用。

現在,我想在VBA中使用這些列。如果我定義另一個名稱,以便它是指小區C10:

=Sheetname!C10 

,並命名爲myColumnCell

然後我可以在VBA使用:

x = Worksheets("Sheetname").Range("myColumnCell").Column 
MsgBox x 

工作正常。但是它需要我創建一個額外的名稱,即使我已經有一個名稱只定義了列。

我可以做到這一點,但我有一大堆這些,所以我想知道是否有辦法做到這一點,而無需創建更多的名稱。

如果沒有其他辦法,只能在工作表上爲單元格指定一個單元格,就像@Daniel所說的那樣,我只需要使用它。

編輯;替換「var」是因爲我實際上並沒有使用它,因此將其輸入爲一個(不幸的)示例名稱。

+1

的'COLUMN'函數返回一個數,所以'範圍(3).Value'是要失敗。 –

+2

實際上,這比我說的要糟糕。你的名字實際上並不等同於一個範圍。換句話說,沒有稱爲「var」的範圍,只是名爲「var」的名稱等於3.如果您稍微多說一下它將如何使用,那將會有所幫助。你真的需要在表中命名的範圍,還是隻是在VBA中使用? –

+2

你真的需要什麼?引用列對象或特定單元格的值的變量? – bonCodigo

回答

0

哦!我現在得到它!

問題是,Range是一個單元格! 而你的名字是與細胞無關。

然後,你必須把它直接從Workbook.Names集合:

x = ThisWorkbook.Names("myColumnName").Value 

前面的回答只是更多這方面的信息:

你看到的錯誤意味着這些東西:

  • 沒有名爲「var」的範圍;或
  • 沒有名爲「sheetname」的工作表;或
  • 您的模塊不直接連接到工作簿

命名範圍:

爲了執行Worksheets("sheetname").Range("var")您必須在片命名範圍

要爲單元命名,必須在屏幕頂部的公式欄左側出現的小文本框中輸入名稱。通常該文本框只顯示座標,如A1。一旦你在那裏輸入一個名字,那麼你有一個命名的範圍,並可以使用.Range("thenameofthatrange")。注意這個名字可能區分大小寫。檢查它是否被稱爲「var」或「Var」。 (Var不是一個好名字,它可能與系統預定義的單詞衝突)

或者,您可以去insert named ranges

單元格內部的公式對代碼無關緊要,它只是單元格所包含的值。

VB瓦爾

現在VB瓦爾在代碼中聲明,與Dim Varname as typeofthevar

Dim AVar as String 'a text var  
Dim AnotherVar as Integer 'a number 

您的x是一個變種。但你必須聲明它之前,你試圖把它的值:

Dim x as String 
x = Worksheets("sheetname").Range("var") 

但要小心,VAR類型可以是不同的。如果在該單元格的值是一個integer必須將其轉換爲字符串(我幾乎可以肯定VBA做自動,但以防萬一...)

Dim val as integer 
val = Worksheets("sheetname").Range("var") 
Dim x as string 
x = str(val) 

模塊在工作簿

如果您的模塊位於工作簿內,則可以使用ThisWorkbook.Worksheets("sheetname").Range("therangename").Value

如果沒有,你將不得不從Application對象採取的工作簿:

Dim MyWorkbook as workboook 
Set MyWorkbook = Application.Workbooks("thefilename") 

或者:

'this will open an existing file 
Set MyWorkbook = Application.Workbooks.Open "a file name" 

然後你把工作簿片(標籤):

Dim MySheet as Worksheet 
Set MySheet = MyWorkbook.Worksheets("thesheetname") 

當心:工作表是在屏幕的下部,而不是整個那些選項卡之一文件。整個文件是一個工作簿。

請嘗試做到這一點。如果我記得正確地將,Excel中有兩種類型的工作表,其中一人可能不包含Range對象,但Worksheet類型有它:

Dim MySheet as Worksheet  
Dim x as string  

set MySheet = Worksheets("mysheetname") 
x = MySheet.Range("var") 
+0

感謝丹尼爾,但它不是你提到的前三個選項。基本上我試圖達到一個名稱,但沒有「有」這個名字的單元格。該公式直接輸入名稱管理器 - >新建。 現在我想知道在哪裏可以在VBA中檢索這個。這似乎是不可能的,即使在指定工作簿,工作表等時也是如此。 也許除非存在具有此名稱的單元格/單元格區域,否則無法調用它。 – Edje

+0

哦,我現在明白了。在我的答案一開始就看到編輯。既然你使用了'Range',那麼名字**必須**在一個單元格中或者在一個單元格中!範圍對象**是**單元格/單元格範圍。那麼你必須直接從'ThisWorkbook.Names'取名字 –

+0

就是這樣,我需要.Names集合。非常感謝! – Edje

0

我用這個條件測試了你的問題。它爲我工作。

我將我的單元更名爲「var」。公式在我的細胞「VAR」

=COLUMN(sheetname!E3) 

這裏,VBA代碼

Dim x As String 

x = Worksheets("sheetname").Range("var") 

MsgBox (x) 

一件事的「VAR」細胞類型是「常規」類型。 和你的一樣嗎?

當我運行我的代碼時,我在消息框中得到了「5」。 這是對的。

+0

這不是我正在做的。我不E3單元格做任何事情,我只創建一個名稱與式 '= COLUMN(SHEETNAME!E3)' 這是不同的東西(顯然不工作) 你這樣做確實是工作,但不是什麼我正在努力實現。 仍然感謝您的意見。 – Edje

0

你如何爲=COLUMN("Sheetname!C10")創建該名稱目前尚不清楚,但因爲你的問題似乎是關於命名常量並不見得命名區域,如果我創建了一個名爲「嗒嗒」帶「指的是」 ="Hello"我可以得到利用的價值:

Debug.Print [blah]    'Hello 

Debug.Print Evaluate("blah") 'Hello 

Debug.Print Thisworkbook.Names("blah").RefersTo 'actually gives ="Hello" 

參見:http://www.cpearson.com/excel/DefinedNames.aspx