【问题标题】:VBA Excel autoincrement of cell number in the formula when new worksheets are added添加新工作表时,VBA Excel自动增加公式中的单元格编号
【发布时间】:2020-06-08 16:45:53
【问题描述】:

下午好,

我想在添加新工作表时自动更改公式。 单元格值将大致每 13 步更改一次,它们出现在 excel IF 语句中。 正如您在下图中看到的,我希望有 13 步的增量,因为公式将引用位于 NIM & BADGER 表中每 13 步以下的单元格。 在工作表 CAB1 中这是 G33,在工作表 CAB2 中应该是 G46,在工作表 CAB3 - G59 中,以此类推......

我的公式是基于 IF 语句的,所以可以按照这里的解决方案用 VBA 编写:

Using IF formula in VBA

接下来,我需要每 13 步更换一次单元格。我在这里发现了一些类似的问题和解决方案:

Increment excel formula by 1

Increment value on multiple worksheets

我试着写成下面的代码:

 Sub Value()

 Dim i As Long
 Dim xNumber As Long, xValue As Long
 Dim xName As String
 Dim ws As Worksheet

 Application.ScreenUpdating = False

 Set ws = Sheets("CAB1")
 xNumber = Sheets("NIM & BADGER").Range("R27").Value
 xValue = 33

 For i = 1 To Number
 ws.Copy After:=ActiveWorkbook.Sheets(ws.Index + i - 1)
 ActiveSheet.Name = "CAB" & i + 1
 Sheets("CAB" & i + 1).Range("E43").Formula = "=IF('NIM & BADGER'!G" & xValue + (13 * i) & "=0,"",'NIM & BADGER'!G" & xValue + (13 * i) & ")"
 Next

 ws.Activate

 Application.ScreenUpdating = True

 End Sub

我有一个错误: 应用程序定义或对象定义的错误

调试器指向以下行:

  Sheets("CAB" & i + 1).Range("E43").Formula = "=IF('NIM & BADGER'!G" & xValue + (13 * i) & "=0,"",'NIM & BADGER'!G" & xValue + (13 * i) & ")"

如何在添加一个或多个工作表时自动更改这些公式(单元格编号)?

衷心感谢任何帮助。

更新:

我玩了一下引号,但结果还是一样...

   Sheets("CAB" & i + 1).Range("E43").Formula = "=IF('NIM & BADGER'!G" & xValue + (13 * i) & "=0,'','NIM & BADGER'!G" & xValue + (13 * i) & "')"

【问题讨论】:

    标签: excel vba excel-formula


    【解决方案1】:

    可以把它写成一个公式。虽然它不是很漂亮,但它会起作用:

    =IF(OFFSET('NIM & BADGER'!$G$1,(NUMBERVALUE(MID(CELL("filename",A1),FIND("]",CELL("filename",A1))+4,255) )*13)+19,0,1,1)=0,"",OFFSET('NIM & BADGER'!$G$1,(NUMBERVALUE(MID(CELL("filename",A1),FIND("]" ,CELL("文件名",A1))+4,255))*13)+19,0,1,1))

    编辑:使您的 VBA 代码工作。试试这个:

     Sub Value()
    
     Dim i As Long
     Dim xNumber As Long, xValue As Long
     Dim xName As String
     Dim ws As Worksheet
    
     Application.ScreenUpdating = False
    
     Set ws = Sheets("CAB1")
     xNumber = Sheets("NIM & BADGER").Range("R27").Value
     xValue = 33
    
     For i = 1 To xNumber
     ws.Copy After:=ActiveWorkbook.Sheets(ws.Index + i - 1)
     ActiveSheet.Name = "CAB" & i + 1
     Sheets("CAB" & i + 1).Range("E43").Formula = "=IF('NIM & BADGER'!G" & xValue + (13 * i) & "=0,"""",'NIM & BADGER'!G" & xValue + (13 * i) & ")"
     Next
    
     ws.Activate
    
     Application.ScreenUpdating = True
    
     End Sub
    

    正如我试图在下面解释的那样,您遇到了两个问题:

    1. 在您的“For”语句中,您忘记了“Number”前面的“x”,所以 你没有提到你的变量。
    2. 在 VBA 中引用双引号时,需要将它们用双引号括起来。因此,您的 IF 语句的真实情况必须看起来像 """"。

    希望现在很清楚。

    【讨论】:

    • 是的,但看起来这个公式需要在每张纸上手动输入。我需要一些自动的东西,因为我可能要覆盖多达 20 张纸。
    • 是真的。我认为您会复制 CAB# 表以具有 CAB1、CAB2...CABn,如屏幕转储中所示。在这种情况下,您不必重新输入公式。您只需将其添加到第一张表,然后复制该表,只要您坚持命名约定(CAB + 数字)并按升序命名(以避免跳过 13 行),那么您不必触摸公式。但是,当然,如果您有不同的流程,那么我需要了解它以提供帮助。
    • 好的,我的想法如下:在工作表 CAB1 上,我的公式是 =IF('NIM & BADGER'!G33=0,"",'NIM & BADGER'!G33)"。在 CAB2 上,我需要: =IF('NIM & BADGER'!G46=0,"",'NIM & BADGER'!G46)" 在 CAB3 上; NIM & BADGER'!G59=0,"",'NIM & BADGER'!G59) ...等等。如您所见,单元格以 13 步递增。我无法手动键入它们,因为这些表将被一遍又一遍地删除和添加。我需要代码,它会在添加新工作表时自动增加这些值。
    • 如果您遵守此命名约定,则该公式将起作用。该公式采用“CAB”之后的数字,并返回 NIM & BADGER 表中 G1 下方 13*[数字] + 19 行的单元格中的值(除非它是 0,在这种情况下它返回“”)。 IE。 CAB1= 13*1+19 = 32 低于 G1 = G33。 CAB2=13*2+19=45低于G1=G46,CAB3=13*3+19=58低于G1=G59等...
    • 因为如果您只使用 2 个引号,VBE 会将其视为两个字符串被拆分 - VBE 无法判断您是结束字符串还是引用双引号。所以它将它视为 1 个句子:“=0”和另一个句子:“,'NIM & BADGER'!G”,中间没有运算符,这就是它出错的原因,顺便说一句.. 因此,你需要转义双引号,一种方法是引用双引号......因此 """"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多