【发布时间】: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 中进行所有字符串操作...如果我不必这样做,它最终会更具可读性全部内联。