【问题标题】:Excel VBA Run-time error '1004': "Application-defined or object-defined error" when assigning Range.Value PropertyExcel VBA 运行时错误“1004”:分配 Range.Value 属性时出现“应用程序定义或对象定义错误”
【发布时间】:2021-04-28 20:25:39
【问题描述】:

好的,我在这里看到了很多类似的问题,但在我找到的所有问题中,要么没有答案,要么与我的情况不同并且不适用,或者我尝试了解决方案,但它对我不起作用。

问题是,在下面的代码 sn-p 中,我收到“运行时错误 '1004': Application-defined or object-defined error assignmenting Range.Value Property”

我确实设置了Option Explicit

RNRRungTopRow 在代码的前面都声明为整数类型。 CommentRow 也是一个整数(仅等于 0 或 1,声明为整数而不是布尔值,因为我在方程式中使用 0 或 1 作为乘数)。 CurrentCell 被声明为 Range 类型。 LadderSheet 的类型为 Worksheet,设置为我的 Excel 文件中的特定工作表。我在我的程序中多次使用LadderSheet,没有任何问题。 RowSize 是一个等于 6 的已定义常量。thatRung 是我定义的 Rung 类型的类变量。 CommentText 是一个公共变量,被声明为 Rung 类的一部分。我尝试将CommentText 声明为字符串并将其定义为变体。无论哪种方式,我都会遇到相同的错误。 Option Explicit 也在Rung 类模块中设置。

NR 是我正在使用的梯形逻辑源中的梯级数。这只是我的代码的一部分,此外,如果RungTopRow 通过与定义的Const LastXLRow = 1048576 进行比较,我有代码退出程序等于或超过 excel 允许的最大行数。 p>

不管怎样,当我插入断点时,我发现我在 RungTopRow = 3 的值上得到了错误。所以,我绝对没有超过最大行数。

当我将以下部分注释掉时,我捆绑到 {Other Code Here} 中的所有内容都可以正常运行。实际上,如果我注释掉 .value 赋值语句,一切都会按预期运行。

    For R = 0 To NR
        
    If R = 0 And CommentRow Then
        With LadderSheet.Range("C" & CStr(RungTopRow + 1) & ":P" & CStr(RungTopRow + RowSize - 1))
            .MergeCells = True
            .ShrinkToFit = False
            .WrapText = True
        End With
         Set CurrentCell = LadderSheet.Cells(RungTopRow + 1, 3)
        'this line keeps giving an application defined error
        CurrentCell.Value = thatRung.CommentText

    End If

    ... {Other Code Here} ...

    Next R

第一次尝试

LadderSheet.Cells(RungTopRow + 1, 3).Value = thatRung.CommentText

我将 LadderSheet.Cells(RungTopRow, 3) 替换为 CurrentCell,因为它在另一种类似情况下对我有用,但由于某种原因在这里不起作用。

我也试过

currentComment = thatRung.CommentText
currentCell.Value = currentComment

currentCommentthatRung.CommentText 声明为字符串。我得到同样的错误,触发 currentCell.Value 的赋值语句,所以它不是由于 thatRung.CommentText 的定义

请注意,如果我直接将其分配给如下文字字符串:

CurrentCell.Value = "hello"

或如下:

currentComment = "hello"
currentCell.Value = currentComment

它执行没有问题。当然,在这种情况下,我没有得到我真正想要的文本。我需要存储在thatRung.CommentText 中的文本进入CurrentCell 范围定义的单元格。

更新 Rung Class 太大了,这里就不贴了,但唯一提到CommentText 的地方是在如下声明中:

Option Explicit
'These values are directly defined
Public Number As Integer
Public NumBranches As Integer
Public RungType As String
Public CommentText As String 'Neither string nor variant working
Public RungText As String

'These values will need to be calculated
Private Branches() As Branch
Private Items() As Item
Private ItemsEmpty As Boolean
Private CommandsEmpty As Boolean
Private InputsEmpty As Boolean
Private OutputsEmpty As Boolean
Private BranchesEmpty As Boolean

Const maxItemsperRow = 4 'Make sure other modules have same value in constant

也许也相关的是CommentText 在我上面发布的代码之前在我的主模块代码(ImportL5x)的以下行中被操作的地方:

thisRung.CommentText = thisRung.CommentText & ThatXMLTag.Contents

我发布的代码在一个名为DrawRung 的子程序中,thisRung 作为参数传递给DrawRung

DrawRung thisRung

而 DrawRung 是用 thatRung 定义的:

Public Sub DrawRung(thatRung As Rung)

ThatXMLTag 是我定义的另一个自定义类XMLTagContents 也是一个字符串。

这是XMLTag 类的所有代码(现在只是声明,所有内容都在另一个模块中外部分配):

Option Explicit

Public Enum XMLType
   XMLStart = 0 'No starting /, no ! data
   XMLContent = 1 'Starting !
   XMLStop = 2 'Starting /
   XMLUnknown = 3 'Anything else
End Enum
Public Name As String
Public Contents As String
Public TagType As XMLType

【问题讨论】:

  • 听起来您的自定义类Rung 是某种问题。如果您可以发布它和/或创建一个仅包含该变量或属性的最小类,这将有所帮助。
  • 出现错误时thatrung.commentText的值是多少?
  • CurrentCell.Value = "'" & thatRung.CommentText 有效吗?如果您分配的内容看起来像一个公式,那么 Excel 可能会窒息它。您还可以在分配值之前尝试将单元格格式化为文本。
  • @TimWilliams 感谢您的建议。当我添加“'”时它确实有效......但这当然不会给我想要的东西。但多亏了你的建议,我明白了。如果我向它添加任何东西,它就会起作用。我现在意识到我从未初始化过thisRung.CommentText,所以当我执行thisRung.CommentText = thisRung.CommentText & ThatXMLTag.Contents 时,它正在执行nothingThatXMLTag.Contents。我会想到 nothing & something = something,当我检查我的变量时它会显示一些东西 - 但是如果我在我的 Rung 类的 class_initialize 子中初始化 CommentText = " ",它就可以工作
  • 这里不涉及Nothing:如果CommentTextContents 未初始化,它们将只是空字符串。没有与连接空字符串相关的问题。您的真正问题可能是 Excel 认为您正在尝试将(损坏的)公式分配给单元格的 Value 属性。

标签: excel vba excel-2016


【解决方案1】:

当为 Excel 单元格分配某些内容时 - 即使明确使用 Value 而不是 Formula/FormulaR1C1/etc 属性 - Excel 将尝试将单元格内容解析为公式,如果它“看起来”像这可能是一个公式。

例如,如果单元格内容以“=”开头,Excel 将尝试将内容解析为公式,如果失败将生成您所描述的运行时错误类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多