问题 - 我在一次单元格中有超过8202个字符说Range(" A1")。
现在我想使用VBA将单元格(A1)的内容复制到单元格(A2)。我使用下面的代码
Sheets("XYZ").Range("A2") = Sheets("XYZ").Range("A1")
执行守则后。它给出了#34;应用程序定义或对象定义的错误!!"
请帮助/协助您的专家评论。
观察 - 如果我缩短" A1"单元格到8202或更少然后代码工作!
我很困惑。请帮助。
答案 0 :(得分:5)
将您的代码更改为
Sheets("XYZ").Range("A2") = Sheets("XYZ").Range("A1").Value
它会起作用。
不确定为什么,因为.Value
是范围的默认属性。
答案 1 :(得分:2)
我能够使用以下内容复制您的错误:
Sub Test8202Copy()
Dim wks As Worksheet
Set wks = Worksheets("Sheet1")
Dim x As String
For i = 0 To 8202
x = x + "a"
Next i
wks.Range("A1").Value = x
wks.Range("A2") = wks.Range("A1")
End Sub
我能够通过在副本中添加.value来解决错误。
Sub Test8202Copy()
Dim wks As Worksheet
Set wks = Worksheets("Sheet1")
Dim x As String
For i = 0 To 8202
x = x + "a"
Next i
wks.Range("A1").Value = x
wks.Range("A2").Value = wks.Range("A1").Value
End Sub
使用不使用.Value
的中间变量似乎有效:
Dim y As Variant
y = wks.Range("A1")
wks.Range("A2") = y
到目前为止,我的猜测是8202超出了未定义.Value
时使用的数据类型的字符数限制。单元格限制长度为32,767(MS Excel 2010),几乎是清除的8201值的4倍。
答案 2 :(得分:1)
@Chris Neilsen 为这个问题提供了最实用,最优雅的解决方案(他的代码片段如下):
Sheets("XYZ").Range("A2") = Sheets("XYZ").Range("A1").Value
为了调查和理解Range对象的这种奇怪行为(可能是一个bug)的可能原因,我发布了几条评论,总结如下:
原始表达式之间存在概念上的差异(见下文):
Sheets("XYZ").Range("A2") = Sheets("XYZ").Range("A1")
和@ Chris Neilsen 提出的解决方案,即:原始表达式隐式地将Range对象var(本质上是指针)分配给另一个Range对象,如下面的代码片段中所示,具有显式赋值:
Set rng = Sheets("XYZ").Range("A1")
Sheets("XYZ").Range("A2") = rng
虽然建议的解决方案显式传递value属性。仍然,为string.Length> 8202的值分配Range对象失败的原因目前尚不清楚(可能是由Excel Range对象实现的一些内部细微差别引起的)。
非常感谢发布这个有趣的问题和富有成效的讨论。 的问候,
答案 3 :(得分:1)
这个限制(见下文re excel-2007)包含在MSDN article中,但有趣的是它意味着vba数组已被隐藏
单独按https://stackoverflow.com/a/13665363/641067 excel-2003处理超过911个字符的数组字符串,而下面的文章引用1823字符
<强>症状强>
当您运行Microsoft Visual Basic for Applications(VBA)宏以将数据从包含数据字符串的VBA数组传输到Microsoft Excel工作表中的一系列单元格时,数据可能会被截断(截断)。 / p>
注意:在Microsoft Office Excel 2003和更高版本的Excel中,在Visual Basic编辑器中运行VBA宏时,可能会收到以下错误消息:
Run-time error '1004'
<强>原因强>
当满足下列条件之一为真时,可能会出现此问题: