【问题标题】:VBA Fill cells on multiple sheets with formulasVBA用公式填充多张纸上的单元格
【发布时间】:2018-09-25 03:08:24
【问题描述】:

我正在尝试为工作簿每张表中的每个单元格设置公式。我需要在 2 个不同的单元格范围内分配 2 个公式。我在 Variant 中定义了 strFormula 1 和 2。

对于公式1我希望分配到A到AJ列下的单元格

对于公式 2,我希望分配到 AK 到 AR 列下的单元格

我在运行循环后收到以下错误,在定义 strFormulas(2) 时收到语法错误。需要一些帮助来解决这些问题。

谢谢!

运行时错误 1004,应用程序定义或对象定义错误

 Dim w As Long
 Dim strFormulas(1 To 2) As Variant

 For w = 2 To ActiveWorkbook.Worksheets.Count
    With ActiveWorkbook.Worksheets(w)

        strFormulas(1) = "=IF(ISBLANK('Sheet 1'!A4),"",'Sheet 1'!A4)"
        'strFormulas(2) has a syntax error.
        strFormulas(2) = "=IF('Sheet 2'!N1838="S","S","")"

        .Range("A2:AJ2").Formula = strFormulas(1)
        .Range("A2:AJ2000").FillDown
        .Range("AK2:AR2").Formula = strFormulas(2)
        .Range("AK2:AR2000").FillDown

    End With
Next w

【问题讨论】:

    标签: vba excel loops for-loop excel-formula


    【解决方案1】:

    带引号的字符串中的引号需要加倍。 "" 的替代方法是 text(,),因此您不需要 """"S 是 ascii 83。

    strFormulas(1) = "=IF(ISBLANK('Sheet 1'!A4),"""",'Sheet 1'!B4)"
    strFormulas(1) = "=IF(ISBLANK('Sheet 1'!A4), text(,), 'Sheet 1'!B4)"
    
    strFormulas(2) = "=IF('Sheet 2'!N1838=""S"",""S"","""")"
    strFormulas(2) = "=IF('Sheet 2'!N1838=char(83), char(83), text(,))"
    

    【讨论】:

    • 就我个人而言,我讨厌双引号,所以我收集了一些可以完全避免它们的替代方案。
    • OP:这取决于您的工作表的顺序,例如如果工作表 1 不是第一张工作表,您最终会在其中引用工作表 1 的公式;这可能是你想要的,也可能不是。
    • @Jeeped 我尝试使用 text(,),Excel 要求我在使用公式时导入文件...
    • 回复很多;有些我标记为重复。这取决于问题的质量和我是否提供直接回复。
    • @lydias - 这真的不应该发生;甚至使用 EN-US 以外的区域语言,因为 vba 非常以 EN-US-Centric 为中心。
    【解决方案2】:

    1) 加倍你的“”。正如@Jeeped 所说。

    2) 但要小心。这取决于您的工作表的顺序,例如如果工作表 1 不是第一张工作表,您最终会在其中引用工作表 1 的公式;这可能是也可能不是你想要的。

    Option Explicit
    
    Sub AddFormulas()
        Dim w As Long
        Dim strFormulas(1 To 2) As Variant
    
        For w = 2 To ActiveWorkbook.Worksheets.Count
            With ActiveWorkbook.Worksheets(w) 'this targets by worksheet order so be careful
             strFormulas(1) = "=IF(ISBLANK('Sheet 1'!A4),"""",'Sheet 1'!B4)"
                strFormulas(2) = "=IF('Sheet 2'!N1838=""S"",""S"","""")"
                .Range("A2:AJ2").Formula = strFormulas(1)
                .Range("A2:AJ2000").FillDown
                .Range("AK2:AR2").Formula = strFormulas(2)
                .Range("AK2:AR2000").FillDown
            End With
        Next w
    End Sub
    

    【讨论】:

      【解决方案3】:

      同时在所有工作表上填写公式的另一种方法


      Option Explicit
      
      Public Sub FillFormulasAcrossSheets()
          Dim i As Long, wsArr As Variant
      
          With ActiveWorkbook.Worksheets  'make array with all sheets
              ReDim wsArr(3 To .Count)
              For i = 3 To .Count
                  wsArr(i) = i
              Next
          End With
      
          Application.ScreenUpdating = False
      
              Sheets(wsArr).Select
              'Or: ActiveWorkbook.Worksheets.Select       'Selects all
              'Or: Sheets(Array(2, 3, "Sheet5")).Select   'Specific sheets
      
              Range("A2:AJ2000").Select
                       Selection.Formula = "=IF('Sheet2'!N1838=""S"",""S"","""")"
              Range("AK2:AR2000").Select
                       Selection.Formula = "=IF('Sheet2'!N1838=char(83), char(83), text(,))"
      
              Range("A1").Activate
              Sheets(3).Select
      
          Application.ScreenUpdating = True
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-15
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多