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

将Column()全局变量检索到VBA中,vba,excel,Vba,Excel,我定义了一个名称: =COLUMN("Sheetname!C10") 假设我把它命名为“myColumn” 我正在尝试使用以下方法将其检索到vba中: x = Worksheets("Sheetname").Range("myColumn").Value 但我得到了1004分;应用程序定义或对象定义错误 我尝试过在Excel中使用TEXT()和VBA中使用CStr()来强制输入,以及 Dim x As String 无济于事 其他名称在进入VBA时没有问题(这些名称没有ADDRESS()或

我定义了一个名称:

=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中?非常感谢


编辑:想发表评论,但时间太长

对不起,我不清楚。关键是我定义了一个不在任何工作表上的名称(如中所示;没有“具有”此名称的单元格);这只是一个公式,是在名称管理器中定义的。该名称随后在Excel公式中与间接()一起使用

在那之后,我也想在VBA中使用这些列。如果我定义另一个名称,使其引用单元格C10:

=Sheetname!C10 
并将其命名为MyclumnCell

然后,我可以在VBA中使用:

x = Worksheets("Sheetname").Range("myColumnCell").Column
MsgBox x
这很好用。但是它需要我另外加一个名字,即使我已经有了一个只定义列的名字

我可以这样做,但我有一大堆这样的,所以我想知道是否有一种方法可以做到这一点,而不创建更多的名称

如果像@Daniel所说的那样,除了将单元格指定给工作表上的某个名称外,没有其他方法,我只能使用它


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

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

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

=COLUMN(sheetname!E3)
这里是VBA代码

Dim x As String

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

MsgBox (x)
有一点是,“var”的单元格类型是“General”类型。 和你的一样吗

当我运行代码时,消息框中显示“5”。 没错。

哦!我现在明白了

问题是
范围是一个单元格!
您的姓名与单元格无关

然后您必须直接从
工作簿中获取。名称
集合:

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

上一个答案只是想了解更多信息:

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

  • 没有名为“var”的命名范围;或
  • 没有名为“sheetname”的工作表;或
  • 您的模块未直接附加到工作簿
命名范围:

为了执行
工作表(“sheetname”).Range(“var”)
,必须在该工作表中有一个命名范围

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

或者,您可以转到
插入命名范围

单元格内的公式对代码来说并不重要,这只是单元格中包含的值

VB变量

现在,VB变量是在代码中声明的,
Dim Varname作为变量的类型

Dim AVar as String 'a text var     
Dim AnotherVar as Integer 'a number
您的
x
是一个变量。但您必须在尝试输入其值之前声明它:

Dim x as String
x = Worksheets("sheetname").Range("var")
但要小心,var类型可能会有所不同。如果该单元格中的值是
整数
,则必须将其转换为字符串(我几乎可以肯定VBA会自动执行此操作,但以防万一……)

工作簿中的模块

如果模块位于工作簿中,则可以使用
此工作簿.Worksheets(“sheetname”).Range(“therangename”).Value

如果没有,则必须从
应用程序
对象获取工作簿:

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

然后在工作簿中获取工作表(选项卡):

Dim MySheet as Worksheet
Set MySheet = MyWorkbook.Worksheets("thesheetname")
注意:工作表是屏幕下部的选项卡之一,而不是整个文件。整个文件是一个工作簿

试着在这之前做一下。如果我没记错的话,Excel有两种类型的工作表,其中一种可能不包含Range对象,但是
工作表
类型有它:

Dim MySheet as Worksheet     
Dim x as string     

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

不清楚您是如何为
=列(“Sheetname!C10”)
创建该名称的,但由于您的问题似乎是关于命名常量,而不一定是命名范围,因此如果我创建一个名为“blah”且带有“reference”
=“Hello”
的名称,我可以使用以下方法获得该名称的值:

Debug.Print [blah]             'Hello


请参阅:

函数返回一个数字,因此
范围(3)。值
将失败。事实上,它比我说的更糟。你的名字实际上并不等于一个范围。换句话说,没有所谓的“var”范围,只有一个等于3的名为“var”。如果你多说一点关于如何使用它的话,那会很有帮助。您是否真的需要在工作表中指定一个范围,还是仅用于VBA?您真正需要的是什么?引用列对象或特定单元格值的变量?这不是我要做的。我没有对单元格E3做任何事情,我只是用公式
=COLUMN(sheetname!E3)
创建一个名称,这与您所做的不同(显然不起作用),但这不是我想要实现的。还是谢谢你的意见。谢谢丹尼尔,但这不是你提到的前三个选项。基本上,我试图找到一个名字,但是没有一个单元格有这个名字。公式直接输入到名称管理器->新建中。现在我想知道在VBA中哪里可以检索到这个。这似乎是不可能的,即使在指定工作簿、工作表等时也是如此。除非
Dim MySheet as Worksheet     
Dim x as string     

set MySheet = Worksheets("mysheetname")
x = MySheet.Range("var")
Debug.Print [blah]             'Hello
Debug.Print Evaluate("blah")   'Hello
Debug.Print Thisworkbook.Names("blah").RefersTo 'actually gives ="Hello"