我已经定义了一个名字:
=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”,因为我实际上并没有使用它,将其键入为(不幸的)示例名称。
答案 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
以前的答案仅供参考:
您看到的错误可能意味着这些:
命名范围:
要执行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"