【问题标题】:"Run-time error '1004' " when using FormulaR1C1?\"运行时错误 \'1004\'\" 使用 FormulaR1C1 时?
【发布时间】:2022-09-28 20:36:13
【问题描述】:

我正在为我们工厂的工艺路线卡创建一个模板,该模板根据一些输入进行自我配置。其中一部分是序列化部件的构建日志。

我想插入这个公式:

=IFERROR(IF(RIGHT(K122,4)+1< $E$17+1, IF(AND(MID(K122,23,1)=\"0\",NOT(RIGHT(K122,1)=\"9\")),CONCAT(LEFT(K122,(LEN(K122)-4)),IF(LEN(RIGHT(K122,4)+1)=1,CONCAT(\"000\",RIGHT(K122,4)+1),IF(LEN(RIGHT(K122,4)+1)=2,CONCAT(\"00\",RIGHT(K122,4)+1),IF(LEN(RIGHT(K122,4)+1)=3,CONCAT(\"0\",RIGHT(K122,4)+1),RIGHT(K122,4)+1)))),IF(AND(MID(K122,22,1)=\"0\",NOT(MID(K122,23,2)=\"99\")),CONCAT(LEFT(K122,(LEN(K122)-4)),IF(LEN(RIGHT(K122,4)+1)=1,CONCAT(\"000\",RIGHT(K122,4)+1),IF(LEN(RIGHT(K122,4)+1)=2,CONCAT(\"00\",RIGHT(K122,4)+1),IF(LEN(RIGHT(K122,4)+1)=3,CONCAT(\"0\",RIGHT(K122,4)+1),RIGHT(K122,4)+1)))),IF(AND(MID(K122,21,1)=\"0\",NOT(MID(K122,22,3)=\"999\")),CONCAT(LEFT(K122,(LEN(K122)-4)),IF(LEN(RIGHT(K122,4)+1)=1,CONCAT(\"000\",RIGHT(K122,4)+1),IF(LEN(RIGHT(K122,4)+1)=2,CONCAT(\"00\",RIGHT(K122,4)+1),IF(LEN(RIGHT(K122,4)+1)=3,CONCAT(\"0\",RIGHT(K122,4)+1),RIGHT(K122,4)+1)))),CONCAT(LEFT(K122,(LEN(K122)-4)),IF(LEN(RIGHT(K122,4)+1)=1,CONCAT(\"000\",RIGHT(K122,4)+1),IF(LEN(RIGHT(K122,4)+1)=2,CONCAT(\"00\",RIGHT(K122,4)+1),IF(LEN(RIGHT(K122,4)+1)=3,CONCAT(\"0\",RIGHT(K122,4)+1),RIGHT(K122,4)+1))))))),\"\"),\"\")

在许多单元格中,使用 R1C1 表示法,由于该公式所在结构的电子表格中的绝对位置不同。这个公式有效。

将此公式转换为 R1C1 表示法,我得到:

=IFERROR(IF(RIGHT(R[-2]C[0],4)+1< $E$17+1, IF(AND(MID(R[-2]C[0],23,1)=\"\"0\"\",NOT(RIGHT(R[-2]C[0],1)=\"\"9\"\")),CONCAT(LEFT(R[-2]C[0],(LEN(R[-2]C[0])-4)),IF(LEN(RIGHT(R[-2]C[0],4)+1)=1,CONCAT(\"\"000\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=2,CONCAT(\"\"00\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=3,CONCAT(\"\"0\"\",RIGHT(R[-2]C[0],4)+1),RIGHT(R[-2]C[0],4)+1)))),IF(AND(MID(R[-2]C[0],22,1)=\"\"0\"\",NOT(MID(R[-2]C[0],23,2)=\"\"99\"\")),CONCAT(LEFT(R[-2]C[0],(LEN(R[-2]C[0])-4)),IF(LEN(RIGHT(R[-2]C[0],4)+1)=1,CONCAT(\"\"000\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=2,CONCAT(\"\"00\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=3,CONCAT(\"\"0\"\",RIGHT(R[-2]C[0],4)+1),RIGHT(R[-2]C[0],4)+1)))),IF(AND(MID(R[-2]C[0],21,1)=\"\"0\"\",NOT(MID(R[-2]C[0],22,3)=\"\"999\"\")),CONCAT(LEFT(R[-2]C[0],(LEN(R[-2]C[0])-4)),IF(LEN(RIGHT(R[-2]C[0],4)+1)=1,CONCAT(\"\"000\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=2,CONCAT(\"\"00\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=3,CONCAT(\"\"0\"\",RIGHT(R[-2]C[0],4)+1),RIGHT(R[-2]C[0],4)+1)))),CONCAT(LEFT(R[-2]C[0],(LEN(R[-2]C[0])-4)),IF(LEN(RIGHT(R[-2]C[0],4)+1)=1,CONCAT(\"\"000\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=2,CONCAT(\"\"00\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=3,CONCAT(\"\"0\"\",RIGHT(R[-2]C[0],4)+1),RIGHT(R[-2]C[0],4)+1))))))),\"\"\"\"),\"\"\"\")

插入我的 VBA 时出现错误,因为我的代码行太长,所以我将文本字符串一分为二,将它们声明为常量,并按如下方式实现:

Private Const Formula1 As String = \"=IFERROR(IF(RIGHT(R[-2]C[0],4)+1< $E$17+1, IF(AND(MID(R[-2]C[0],23,1)=\"\"0\"\",NOT(RIGHT(R[-2]C[0],1)=\"\"9\"\")),CONCAT(LEFT(R[-2]C[0],(LEN(R[-2]C[0])-4)),IF(LEN(RIGHT(R[-2]C[0],4)+1)=1,CONCAT(\"\"000\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=2,CONCAT(\"\"00\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=3,CONCAT(\"\"0\"\",RIGHT(R[-2]C[0],4)+1),RIGHT(R[-2]C[0],4)+1)))),IF(AND(MID(R[-2]C[0],22,1)=\"\"0\"\",NOT(MID(R[-2]C[0],23,2)=\"\"99\"\")),CONCAT(LEFT(R[-2]C[0],(LEN(R[-2]C[0])-4)),IF(LEN(RIGHT(R[-2]C[0],4)+1)=1,CONCAT(\"\"000\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=2,CONCAT(\"\"00\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=3,CONCAT(\"\"0\"\",RIGHT(R[-2]C[0],4)+1),RIGHT(R[-2]C[0],4)+1)))),IF(AND(MID(R[-2]C[0],21,1)=\"\"0\"\",NOT(MID(R[-2]C[0],22,3)=\"\"999\"\")),CONCAT(LEFT(R[-2]C[0],(LEN(R[-2]C[0])-4)),IF(LEN(RIGHT(R[-2]C[0],4)+1)=1,CONCAT(\"\"000\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=2,CONCAT(\"\"00\"\",RIGHT(R[-2]C[0],4)+1),\"
Private Const Formula2 As String = \"IF(LEN(RIGHT(R[-2]C[0],4)+1)=3,CONCAT(\"\"0\"\",RIGHT(R[-2]C[0],4)+1),RIGHT(R[-2]C[0],4)+1)))),CONCAT(LEFT(R[-2]C[0],(LEN(R[-2]C[0])-4)),IF(LEN(RIGHT(R[-2]C[0],4)+1)=1,CONCAT(\"\"000\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=2,CONCAT(\"\"00\"\",RIGHT(R[-2]C[0],4)+1),IF(LEN(RIGHT(R[-2]C[0],4)+1)=3,CONCAT(\"\"0\"\",RIGHT(R[-2]C[0],4)+1),RIGHT(R[-2]C[0],4)+1))))))),\"\"\"\"),\"\"\"\")\"
Sub BuildBuildLog()
    RemoveBuildLog
    With Sheets(WSPRC)
        count = 1
        
        For i = 1 To PRCLength \' incrementing rows in the documents
            If InStr(1, LCase(.Cells(i, 1).Value), \"blhead01\", vbBinaryCompare) Then
                .Cells(i, 1).EntireRow.Hidden = False
            ElseIf InStr(1, LCase(.Cells(i, 1).Value), \"blhead02\", vbBinaryCompare) Then
                .Cells(i, 1).EntireRow.Hidden = False
            ElseIf InStr(1, LCase(.Cells(i, 1).Value), \"blhead03\", vbBinaryCompare) Then
                .Cells(i, 1).EntireRow.Hidden = False
                For j = 1 To noHeaders + 1     \'counting through the pages of the build log - (+1 to allow for a page for rework log)
                
                    If j > noHeaders Then      \'last page of build log is blank - to allow records of reworked assemblies.
                        .Cells(((noHeaders - 1) * 12) + 15, 1).Value = \"Rework Log\"
                        For k = 1 To 20             \'Counting the rows in the build log - 20 per page
                            
                            .Cells(i + k, 1).EntireRow.Hidden = False
                            Call formatBLRow((2 * k) + (i - 1), j)
                        Next k
                    Else
                        For k = 1 To 20             \'Counting the rows in the build log - 20 per page
                        
                            If count < batchqty + 1 Then
                                \'add a line to the build log
                                If count = 1 Then
                                    .Cells((2 * k) + (i - 1), 12 * j).Formula = \"=CONCAT($I$8,\"\": \"\",RIGHT($C$7,4),\"\"-\"\",B31,\"\"-\"\",E31)\"
                                ElseIf k = 1 Then
                                    .Cells((2 * k) + (i - 1), 12 * j).FormulaR1C1 = Formula3 & Formula4
                                Else
                                    .Cells((2 * k) + (i - 1), 12 * j).FormulaR1C1 = Formula1 & Formula2
                                End If
                                
                                Call formatBLRow((2 * k) + (i - 1), j)
                            Else
                                Exit For                \'Exit for loop if count of rows in build log is greater or equal to batch quantity
                            End If
                            count = count + 1
                            
                        Next k
                    End If
                Next j
            
            End If
        Next i
    End With
End Sub

错误:

运行时错误 \'1004\' 应用程序定义或对象定义错误`

在第一次调用公式 R1C1 时发生

For k = 1 To 20             \'Counting the rows in the build log - 20 per page count`

for 循环,for count = 2,k=2。

虽然公式很长,但它比我试图插入的属性的长度限制短。

  • 你在哪里定义公式3和公式4?
  • 它们也在代码中定义,类似于公式 1 和公式 2。我没有发布完整的代码库,因为此时它有近 1000 行代码 xD,感谢您花时间阅读我解决了我的问题,见下文。
  • 不是您问题的答案:但我会努力重构公式-即使您现在发现问题,下次由于新的业务需求而必须进行调整时,您也会遇到困难...
  • 这个公式增量是一个基于前一个序列号的序列号。序列号是以下格式的字符串:\"Partno\": nnnn-yyww-xxxx 其中部分编号的长度可能不同,nnnn 是作业编号标识符,yyww - 生产的年份和周部分 - xxxx 是一个递增的 4 位数字。从表面上看,这似乎应该很容易做到,但是因为我试图对存储为字符串的一部分的数字进行算术运算,而字符串长度不能改变,所以检查长度会让人头疼字符串的 xxxx 部分。
  • 我想我应该创建一个自定义 Forumla \"INCREMENTSERIAL\",然后将其称为:..formulaR1C1 = \" = INCREMENTSERIAL(R[-1]C[0]),在 vba 中进行所有字符串操作...如果我不必这样做,它最终会更具可读性全部内联。

标签: excel vba


【解决方案1】:

我刚刚意识到我的错误。我没有将公式完全转换为 R1C1 表示法,我在 A1 表示法中留下了唯一的显式 Cell 引用

$E$17

..将其转换为R17C5 修复了它。

对于基本问题的长期阅读感到抱歉。

问候,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多