将Column()全局变量检索到VBA中

时间:2015-07-03 03:20:35

标签: excel vba excel-vba

我已经定义了一个名字:

=COLUMN("Sheetname!C10")

假设我将其命名为“myColumn”。

我正在尝试使用以下方法将其检索到vba:

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

但我得到1004;应用程序定义或对象定义的错误。

我尝试在Excel中使用TEXT()和在VBA中使用CStr()强制类型,以及

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

哪个工作正常。但它需要我创建一个额外的名称,即使我已经有一个只定义列的名称。

我可以做到这一点,但我有很多这些,所以我想知道是否有办法在不创建更多名称的情况下做到这一点。

如果没有其他办法,只有将一个Cell分配给工作表上的名称,就像@Daniel说的那样,我只需要使用它。

编辑;替换了“var”,因为我实际上并没有使用它,将其键入为(不幸的)示例名称。

3 个答案:

答案 0 :(得分:0)

我用这个条件测试了你的问题。这对我有用。

我将我的单元格重命名为“var”。我单元格中的公式“var”

=COLUMN(sheetname!E3)

这里,VBA代码

Dim x As String

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

MsgBox (x)

“var”的单元格类型是“常规”类型。 和你的一样吗?

当我运行我的代码时,我在消息框中显示“5”。 这是对的。

答案 1 :(得分:0)

哦!我现在明白了!!

问题是Range 是一个单元格! 您的名字与单元格无关

然后你必须直接从Workbook.Names集合中获取它:

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

以前的答案仅供参考:

您看到的错误可能意味着这些:

  • 没有名为" var&#34 ;;或
  • 没有名为" sheetname";或
  • 您的模块未直接附加到工作簿

命名范围:

要执行Worksheets("sheetname").Range("var"),您必须在该表中有命名范围

要为单元格命名,必须在屏幕顶部公式栏左侧显示的小文本框中键入名称。通常,该文本框仅显示坐标,例如A1。在那里输入名称后,您就可以使用.Range("thenameofthatrange")命名区域。请注意,此名称可能区分大小写。检查它是否被称为" var"或" Var"。 (Var不是一个好名字,它可能与系统预定义的单词冲突)

或者,您可以转到insert named ranges

单元格内部的公式对代码来说并不重要,只有单元格包含的值。

VB vars

现在VB vars在代码中声明,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")

答案 2 :(得分:0)

目前尚不清楚你是如何为=COLUMN("Sheetname!C10")创建该名称的,但由于你的问题似乎是关于命名常量而不一定是命名范围,如果我创建了一个名字" blah"用"指" ="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