将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"